我关注了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
答案 0 :(得分:1)
问题是在相关计算机上禁用了UAC,因此没有创建拆分令牌,并且Explorer进程具有完全管理员权限。
原则上,你可以使用CreateRestrictedToken()解决这个问题,但是如果UAC被禁用,你可能会认为这是故意的,这通常会产生默认行为,即赋予新进程管理员权限,最明智的选择。
如果您需要确认特定令牌具有管理权限的原因是因为UAC已禁用(包括用户是本地管理员帐户的情况),您可以GetTokenInformation()使用TokenLinkedToken option 。