我想要实现的是根据用户凭据创建 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

据我所知,属性指示是否启用了特权,我想知道3attributes中设置时的含义,因此我打开了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_CONTROLSYSTEMAdministratorsINTERACTIVESERVICE
如果用户使用LOGON32_LOGON_BATCH登录,则他不是INTERACTIVE组的成员,如果用户使用LOGON32_LOGON_INTERACTIVE登录,则将是INTERACTIVE组的成员,并授予SERVICE_USER_DEFINED_CONTROL

如果用户失败,则可以使用SERVICE_USER_DEFINED_CONTROL访问LOGON32_LOGON_BATCH-他不是Administrators组的成员(如果使用了服务的默认安全性)
LOGON32_LOGON_INTERACTIVELOGON32_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 groupSE_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/

10-12 17:29