我正在编写一个可以收集进程权限的日志服务,并且我正在尝试了解每个进程权限的属性。让我用这段代码解释一下:
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
. 那么这应该是什么意思呢?
我对这个结构更加困惑,但我现在只讨论这些点。
谢谢!