使用CreateProcessWithTokenW()从管理员帐户以非提升模式启动进程

时间:2014-06-06 09:20:35

标签: c windows security winapi process

我关注了Frank K。proposed solution,用于从提升的用户进程启动正常的用户进程。 然而,我在使提议的解决方案工作方面遇到了一些困难(Win 7 x64 Professional;正常用户"流程是从具有管理权限的域帐户启动的)。流程创建代码如下所示:

HANDLE processHandle = getProcessHandle("explorer.exe");

if (OpenProcessToken(processHandle, MAXIMUM_ALLOWED, &hToken))
{
    if (DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL,
        SecurityImpersonation, TokenPrimary, &hNewToken))
    {
    LPWSTR pointer = const_cast<LPWSTR>(commandLine.c_str());
    bRet = CreateProcessWithTokenW(hNewToken,
      0, // logon flags
      0, // application name
      pointer, // command-line
      0, // creation flags
      NULL, // environment - inherit from parent
      NULL, // current directory
      &StartupInfo,
      &ProcInfo);
   ...
    }
}

现在,在CreateProcessWithTokenW之后创建了该进程,但我检查进程是否具有管理权限的方法(见下文)说该进程具有管理员权限(以及ProcessExplorer,它在进程属性Security列表中列出:Group: BUILTIN \ Administrators - &gt; Flags:Owner)。

 BOOL hasAdministratorRights()
 {
  SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
  PSID AdministratorsGroup;
  BOOL b = AllocateAndInitializeSid(
    &NtAuthority,
    2,
    SECURITY_BUILTIN_DOMAIN_RID,
    DOMAIN_ALIAS_RID_ADMINS,
    0, 0, 0, 0, 0, 0,
    &AdministratorsGroup);

  if (b)
  {
    if (!CheckTokenMembership(NULL, AdministratorsGroup, &b))
    {
      b = FALSE;
    }
    FreeSid(AdministratorsGroup);
  }
  return b;
 }

注意:如果我在通过runAs Windows命令(以及给定的现有本地&#34;用户&#34;帐户)启动的进程/应用程序中调用上面的hasAdministratorRights(),它将返回false(因此它确认进程只有用户权限,这正是我所期待的)。但是在上面用CreateProcessWithTokenW()创建的进程中调用它时返回true。

任何想法我可能做错了以及为什么我的用户进程无法使用CreateProcessWithTokenW正确创建?

在Frank K。提议的解决方案中,当从本地管理员帐户或具有管理员权限的域帐户调用CreateProcessWithTokenW()(和其他API)时,它们的行为是否存在差异?

祝你好运, 的Marius

1 个答案:

答案 0 :(得分:1)

问题是在相关计算机上禁用了UAC,因此没有创建拆分令牌,并且Explorer进程具有完全管理员权限。

原则上,你可以使用CreateRestrictedToken()解决这个问题,但是如果UAC被禁用,你可能会认为这是故意的,这通常会产生默认行为,即赋予新进程管理员权限,最明智的选择。

如果您需要确认特定令牌具有管理权限的原因是因为UAC已禁用(包括用户是本地管理员帐户的情况),您可以GetTokenInformation()使用TokenLinkedToken option