Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以不同用户身份启动进程_C++_Winapi - Fatal编程技术网

C++ 以不同用户身份启动进程

C++ 以不同用户身份启动进程,c++,winapi,C++,Winapi,我希望有人能帮我!我有一个类似的问题,如中所述: 我希望能够从以提升的管理员权限(UAC执行级别:requireAdministrator)运行的应用程序中创建一个作为标准用户的流程。用户通过借用其中一个管理员帐户的权限来启动应用程序 我已成功获取该用户的explorer.exe进程的句柄,它存储在变量m_hExplorerProc中。之后,我将进行以下工作: HANDLE hProcToken = NULL; BOOL success = OpenProcessToken(m_hExplo

我希望有人能帮我!我有一个类似的问题,如中所述:

我希望能够从以提升的管理员权限(UAC执行级别:requireAdministrator)运行的应用程序中创建一个作为标准用户的流程。用户通过借用其中一个管理员帐户的权限来启动应用程序

我已成功获取该用户的explorer.exe进程的句柄,它存储在变量m_hExplorerProc中。之后,我将进行以下工作:

HANDLE hProcToken = NULL;

BOOL success = OpenProcessToken(m_hExplorerProc, TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_PRIVILEGES, &hProcToken);

BOOL lookupRet = LookupPrivilegeValue(NULL, SE_ASSIGNPRIMARYTOKEN_NAME,
    &(tokenPrivs.Privileges[0].Luid));
tokenPrivs.PrivilegeCount = 1;
tokenPrivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
BOOL adjustRet = AdjustTokenPrivileges(hProcToken, FALSE, &tokenPrivs, 0, NULL, NULL);

lookupRet = LookupPrivilegeValue(NULL, SE_INCREASE_QUOTA_NAME, &(tokenPrivs.Privileges[0].Luid));
tokenPrivs.PrivilegeCount = 1;
tokenPrivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
adjustRet = AdjustTokenPrivileges(hProcToken, FALSE, &tokenPrivs, 0, NULL, NULL);

HANDLE hDuplicatedToken = NULL;
success = DuplicateTokenEx(hProcToken,
    TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_PRIVILEGES,
    NULL,
    SECURITY_IMPERSONATION_LEVEL::SecurityImpersonation,
    TOKEN_TYPE::TokenPrimary,
    &hDuplicatedToken);
int err = 0;
if(FALSE == success)
    err = GetLastError();

LPCTSTR appName = L"C:\\testapp.exe";

PROCESS_INFORMATION procInfo;
ZeroMemory(&procInfo, sizeof(procInfo));

STARTUPINFO startupInfo;
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
startupInfo.wShowWindow = SW_NORMAL;
startupInfo.dwFlags = STARTF_USESHOWWINDOW;

success = CreateProcessAsUser(hDuplicatedToken, appName, NULL, NULL, NULL, FALSE,
    NORMAL_PRIORITY_CLASS | CREATE_DEFAULT_ERROR_MODE,
    NULL, L"C:\\", &startupInfo, &procInfo);

if(FALSE == success)
    err = GetLastError();
未创建该进程,最后一个错误是1314,这将转换为:“客户端未持有所需的权限”


在这段代码中,我只是尝试执行一个虚拟应用程序,但我最终希望运行该用户选择为默认的浏览器。是否有人知道我做错了什么,或者有人建议我的问题的替代解决方案

我知道回答你自己的问题并不酷,但三个月过去了,仍然没有人提出答案

我无法使用函数CreateProcessAsUser解决上述问题,但我偶然发现了另一种方法,使用IShellDispatch2界面中的ShellExecute,您可以作为当前交互用户启动程序。完整代码可在以下位置找到:


我希望这能帮助有类似问题的人

我知道这个问题很老了,但我想补充一些有用的东西(我认为)。如果您想使用
CreateProcessAsUser
您需要特权,这可以通过模拟功能强大的令牌来获得。有关详细信息,请参阅。

您是否试图抢劫其他进程以获取其凭据?如果可能的话,请考虑一下安全问题。@MSalters:我不认为从管理员变成特权较低的用户会带来安全问题。话虽如此,安装程序以管理员权限启动应用程序是一个常见问题,这会导致问题。@dauphic:在Windows中,权限没有完全排序。很简单,管理员帐户通常没有权限写入其他人的配置文件。更重要的是,
Administrator
SYSTEM
是不同的。@MSalters:正如Daupic所说,我正从管理员变成特权较低的用户。事实上,我试图解决的问题是从一个安装程序中打开标准用户的默认浏览器,他开始使用提升的管理员权限。如果您可以作为管理员执行此操作,则还可以运行
CMD.EXE/C DEL/S%APPDATA%
。正如我所说,你不能只给别人写个人资料。