我想要实现的是根据用户凭据创建 token ,然后使用OpenService
。这是我的代码:
logonSuccess = LogonUserW(userPartW, domainPartW, pwdW,
LOGON32_LOGON_BATCH,
LOGON32_PROVIDER_DEFAULT, &token);
PTOKEN_PRIVILEGES pPrivilegesToken = NULL;
DWORD cbSize = 0;
GetTokenInformation(token, TokenPrivileges, NULL, 0, &cbSize);
pPrivilegesToken = (PTOKEN_PRIVILEGES) LocalAlloc(LPTR, cbSize);
if (GetTokenInformation(token, TokenPrivileges,
pPrivilegesToken, cbSize, &cbSize) == FALSE)
{
fprintf(stderr, "GetTokenInformation: cheijva %d.\n", GetLastError());
fflush(stderr);
}
char str[80] = {0};
char str2[80] = {0};
DWORD strsize = 80;
DWORD str2size = 80;
DWORD langid;
for (int x = 0; x< pPrivilegesToken->PrivilegeCount; x++)
{
if (LookupPrivilegeName(NULL, &pPrivilegesToken->Privileges[x].Luid, str, &strsize) == 0)
{
fprintf(stderr, "LookupPrivilegeName: cheijva -> %d.\n", GetLastError());
fflush(stderr);
}
fprintf(stderr, "name -> %s\n", str);
fprintf(stderr, "atributes -> %ld\n", pPrivilegesToken->Privileges[x].Attributes);
fflush(stderr);
if(LookupPrivilegeDisplayName (NULL, str, str2, &str2size, &langid) == 0)
{
fprintf(stderr, "LookupPrivilegeName2222: cheijva -> %d.\n", GetLastError());
fflush(stderr);
}
fprintf(stderr, "name -> %s\n", str2);
fflush(stderr);
strsize = str2size = 80;
}
请不要关注样式和变量名称等。我的问题是我有以下输出:
name -> SeShutdownPrivilege
atributes -> 3
name -> Shut down the system
name -> SeChangeNotifyPrivilege
atributes -> 3
name -> Bypass traverse checking
name -> SeUndockPrivilege
atributes -> 3
name -> Remove computer from docking station
name -> SeIncreaseWorkingSetPrivilege
atributes -> 3
name -> Increase a process working set
name -> SeTimeZonePrivilege
atributes -> 3
name -> Change the time zone
据我所知,属性指示是否启用了特权,我想知道
3
在attributes
中设置时的含义,因此我打开了wdm.h
并进行了搜索,但是我发现了这一点#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
#define SE_PRIVILEGE_ENABLED (0x00000002L)
#define SE_PRIVILEGE_REMOVED (0X00000004L)
#define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
#define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
SE_PRIVILEGE_ENABLED | \
SE_PRIVILEGE_REMOVED | \
SE_PRIVILEGE_USED_FOR_ACCESS)
我找不到值3。另外我还注意到,如果将
LOGON32_LOGON_BATCH
中的LogonUser
更改为LOGON32_LOGON_INTERACTIVE
,则会得到此输出name -> SeShutdownPrivilege
atributes -> 0
name -> Shut down the system
name -> SeChangeNotifyPrivilege
atributes -> 3
name -> Bypass traverse checking
name -> SeUndockPrivilege
atributes -> 0
name -> Remove computer from docking station
name -> SeIncreaseWorkingSetPrivilege
atributes -> 0
name -> Increase a process working set
name -> SeTimeZonePrivilege
atributes -> 0
name -> Change the time zone
另外,当我在
LOGON32_LOGON_BATCH
中使用LogonUser
时,OpenService
失败并显示错误代码5,这意味着ACCESS_DENIED
,因为它没有返回值,所以我可以找到错误,但是如果我使用LOGON32_LOGON_INTERACTIVE
,则一切正常。据我了解,问题出在特权上,因为在这两种情况下它们都是相同的,所以启用它们一定是一个问题(我想使用BATCH使其起作用,所以我的问题是如何实现?)。抱歉,如果我的问题听起来很傻,我是winapi的新手,我知道这段代码不会帮助您重现问题,但是我认为有人可能知道问题所在。任何帮助都将被申请。 最佳答案
属性,这是标志。所以3是SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED
当线程尝试访问某个 protected 对象时(大多数情况下,关联的 SECURITY_DESCRIPTOR
与已检查的线程 token 组相对于 SECURITY_DESCRIPTOR
DACL和mandatory integrity label进行访问。但这并不总是完全相同-在此过程中还使用了 token 特权-如果线程 token (如果线程不具有 token 进程 token 已使用SE_TAKE_OWNERSHIP_PRIVILEGE
授予了WRITE_OWNER
访问权限。某些api可以使用其他特权(例如OpenProcess
看起来存在SE_DEBUG_PRIVILEGE
),但这是异常(exception)。
通常(默认)授予SERVICE_USER_DEFINED_CONTROL
,SYSTEM
,Administrators
和INTERACTIVE
的SERVICE
如果用户使用LOGON32_LOGON_BATCH
登录,则他不是INTERACTIVE
组的成员,如果用户使用LOGON32_LOGON_INTERACTIVE
登录,则将是INTERACTIVE
组的成员,并授予SERVICE_USER_DEFINED_CONTROL
。
如果用户失败,则可以使用SERVICE_USER_DEFINED_CONTROL
访问LOGON32_LOGON_BATCH
-他不是Administrators
组的成员(如果使用了服务的默认安全性)LOGON32_LOGON_INTERACTIVE
与LOGON32_LOGON_BATCH
最显着的不同
当INTERACTIVE
(S-1-5-3)组的批处理成员时,interactive将成为BATCH
(S-1-5-4)组的成员。
同样,如果“管理员”批量登录中的用户将是具有Administrators
属性的S-1-5-32-544 Local account and member of Administrators group
和S-1-5-114 SE_GROUP_ENABLED
的成员。并且还有S-1-16-12288 High Mandatory Level
但使用交互式登录时,用户将成为Administrators
的成员和Local account and member of Administrators group
和SE_GROUP_USE_FOR_DENY_ONLY
的成员-作为练习的结果,该用户不是该组的成员。还有Medium Mandatory Level
下一个常规(默认)服务DACL
000F01FF S-1-5-18 SYSTEM
000F01FF S-1-5-32-544 Administrators
0002018D S-1-5-4 INTERACTIVE
0002018D S-1-5-6 SERVICE
再一次-在您的情况下,用户显然不是成员或管理员组-导致批量登录,他以
SERVICE_USER_DEFINED_CONTROL
(0x100)访问(no INTERACTIVE
,no Administrators
)但通过交互式登录(即使非管理员用户)也无法打开服务,因为它通过交互式登录授予了INTERACTIVE
组和该组的用户成员关于c++ - Winapi:LUID_AND_ATTRIBUTES属性为3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42998826/