プロセスの特権を収集するログ サービスを作成しており、各プロセス特権の属性を理解しようとしています。このコードで説明しましょう:
HANDLE hToken;
if(OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &hToken))
{
DWORD dwSize = 0;
if(!GetTokenInformation(hToken, TokenPrivileges, NULL, dwSize, &dwSize) &&
::GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
BYTE* pb = new (std::nothrow) BYTE[dwSize];
if(pb)
{
TOKEN_PRIVILEGES* pTPs = (TOKEN_PRIVILEGES*)pb;
DWORD dwSize2;
if(GetTokenInformation(hToken, TokenPrivileges, pTPs, dwSize, &dwSize2) &&
dwSize2 <= dwSize)
{
for(UINT i = 0; i < pTPs->PrivilegeCount; i++)
{
//Analyze privilege attributes to understand if it's enabled or disabled?
DWORD dwPrivAttr = pTPs->Privileges[i].Attributes;
//...
}
}
delete[] pb;
}
}
CloseHandle(hToken);
}
それでは、 TOKEN_PRIVILEGESの構造を見てみましょうLUID_AND_ATTRIBUTES
。具体的には次のとおりです。
#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
#define SE_PRIVILEGE_ENABLED (0x00000002L)
#define SE_PRIVILEGE_REMOVED (0X00000004L)
#define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
ビットマスクとして定義されているように見えますが、これらのフラグの解釈について次のような疑問が生じます。
ENABLED
とはどう違いENABLED_BY_DEFAULT
ますか?それは何ですか
SE_PRIVILEGE_USED_FOR_ACCESS
、どのように使用できますか?と の両方が設定されている場合はどう
SE_PRIVILEGE_ENABLED
なりますか?SE_PRIVILEGE_REMOVED
それともリセット?簡単なテストを実行したところ、私のプロセスでは、
SeShutdownPrivilege
特権にこれらの属性が として設定されていました0
。それで、それはどういう意味ですか?
私はこの構造についてもっと混乱していますが、今のところこれらの点だけにとどめておきます.
ありがとうございました!