最近、と呼ばれるWindowsAPIに出くわしましたGetAppContainerNamedObjectPath
。しかし、どうすれば使えるのかわかりません。
このAPIのmsdnページを見つけました(https://docs.microsoft.com/en-us/windows/win32/api/securityappcontainer/nf-securityappcontainer-getappcontainernamedobjectpath)。しかし、それは正しい例と注釈を持っていません、パラメータは不十分に書かれています。
ERROR_INVALID_PARAMETER(87)
最後にエラーが発生します。これは、入力したパラメーターに問題があることを示しています。これが私が試したことです。
#define TokenIsAppContainer 29
#define TokenAppContainerSid 31
#define TokenAppContainerNumber 32
typedef struct _TOKEN_APPCONTAINER_INFORMATION {
PSID TokenAppContainer;
} TOKEN_APPCONTAINER_INFORMATION, *PTOKEN_APPCONTAINER_INFORMATION;
void GetAppContainerProcessInfo(CString & procName)
{
DWORD dwSize = 0;
DWORD dwResult;
HANDLE hToken;
PTOKEN_APPCONTAINER_INFORMATION pAppCoInfo;
WCHAR wcsDebug[1024] = {0,};
WCHAR * pwSID = NULL;
typedef BOOL (WINAPI *_LPGETAPPCONTAINERNAMEOBJECTPATH)(HANDLE, PSID, ULONG, LPWSTR, PULONG);
static _LPGETAPPCONTAINERNAMEOBJECTPATH lpGetAppContainerNamedObjectPath = NULL;
if (0 == lpGetAppContainerNamedObjectPath)
{
HMODULE hKernel32 = LoadLibraryExW(L"kernel32.dll", NULL, 0);
if (hKernel32)
{
lpGetAppContainerNamedObjectPath = reinterpret_cast<_LPGETAPPCONTAINERNAMEOBJECTPATH>(GetProcAddress(hKernel32, "GetAppContainerNamedObjectPath"));
}
}
if (lpGetAppContainerNamedObjectPath)
{
DWORD processId = (DWORD)_ttoi((LPCTSTR)procName);
//HANDLE hProcess = GetProcessHandleByProcessName(procName);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);
if(!OpenProcessToken(hProcess, TOKEN_QUERY, &hToken))
{
dwResult = GetLastError();
swprintf_s( wcsDebug, _countof(wcsDebug), L"OpenProcessToken Error(%u) PID(%d)\n", dwResult, processId );
AfxMessageBox(wcsDebug);
return;
}
if (!GetTokenInformation(hToken, (TOKEN_INFORMATION_CLASS) TokenAppContainerSid, NULL, dwSize, &dwSize))
{
dwResult = GetLastError();
if( dwResult != ERROR_INSUFFICIENT_BUFFER )
{
swprintf_s( wcsDebug, _countof(wcsDebug), L"GetTokenInformation Error %u\n", dwResult );
AfxMessageBox(wcsDebug);
return;
}
}
pAppCoInfo = (PTOKEN_APPCONTAINER_INFORMATION) GlobalAlloc( GPTR, dwSize );
if (!GetTokenInformation(hToken, (TOKEN_INFORMATION_CLASS) TokenAppContainerSid, pAppCoInfo, dwSize, &dwSize))
{
dwResult = GetLastError();
swprintf_s( wcsDebug, _countof(wcsDebug), L"GetTokenInformation Error %u\n", dwResult );
AfxMessageBox(wcsDebug);
return;
}
WCHAR wcsNamedObjectPath[MAX_PATH];
ULONG ulRetlen = 0;
BOOL bRet = lpGetAppContainerNamedObjectPath(hToken, pAppCoInfo->TokenAppContainer, _countof(wcsNamedObjectPath), wcsNamedObjectPath, &ulRetlen );
if (bRet)
{
swprintf_s( wcsDebug, _countof(wcsDebug), L"GetAppContainerNamedObjectPath Path(%s)\n", wcsNamedObjectPath );
AfxMessageBox(wcsDebug);
}
else
{
dwResult = GetLastError();
swprintf_s( wcsDebug, _countof(wcsDebug), L"GetAppContainerNamedObjectPath Error %u\n", dwResult );
AfxMessageBox(wcsDebug);
}
if (pwSID)
LocalFree(pwSID);
CloseHandle(hToken)
CloseHandle(hProcess);
}
}
補足として、wchar_t *
メモリバッファを使用して、GetAppContainerNamedObjectPath
2回呼び出すことで動的に割り当てることを試みました。しかし、それでもチャンスはありませんでした。戻り長は意味のある値を返しません。
あなたが得た後にRtlGetLastNtStatus();
代わりGetLastError();
に電話する場合GetAppContainerNamedObjectPath
STATUS_INVALID_PARAMETER_MIX
-パラメータの無効な組み合わせが指定されました。
これにより、単に無効なパラメータと比較してより多くの情報が得られます。
次に、関数のシグネチャを探します
BOOL
WINAPI
GetAppContainerNamedObjectPath(
_In_opt_ HANDLE Token,
_In_opt_ PSID AppContainerSid,
_In_ ULONG ObjectPathLength,
_Out_writes_opt_(ObjectPathLength) LPWSTR ObjectPath,
_Out_ PULONG ReturnLength
);
トークンとAppContainerSidはして宣言In_optこのパラメータはオプションであることを、この平均値を、そしてあなたはそれの場所のいずれかに0を渡すことができます- 。次に、自分自身に尋ねます-TokenAppContainerSidのトークンに何を照会しますか?このトークンをAPIに渡すと、システムはこれを実行できませんか?明らかなことができます。したがって、これを自分で行う必要はありません。実際には、トークンをapiに渡す必要があります。この場合、AppContainerSidは0である必要があります。または、AppContainerSidをapiに渡すことができ、この場合、トークンは0である必要があります。AppContainerSidとTokenの両方がゼロでない場合-あなたとSTATUS_INVALID_PARAMETER_MIX
補足としても、PROCESS_ALL_ACCESS
トークンを取得する必要がある場合は、オープンプロセスは必要ありません。PROCESS_QUERY_LIMITED_INFORMATION
十分です
本当にapiは大きな魔法をしません。それはあなたに戻ります
AppContainerNamedObjects\<Sid>
パス、ここで、アプリコンテナsidの文字列形式(S-1-15-2 -...など)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加