如何从管理员权限进程启动普通用户权限的Windows应用?
从管理员权限程序以普通用户权限启动应用的解决方案
方法1:通过Explorer进程间接启动
Windows的explorer.exe默认以当前登录用户的普通权限运行,借助它启动目标程序,可让目标程序继承其普通权限:
SHELLEXECUTEINFO sei = { sizeof(sei) }; sei.lpVerb = L"open"; sei.lpFile = L"explorer.exe"; sei.lpParameters = L"\"C:\\Path\\To\\YourApp.exe\""; // 替换为你的应用实际路径 sei.nShow = SW_SHOWNORMAL; ShellExecuteEx(&sei);
方法2:获取登录用户令牌创建进程
通过Windows API获取当前交互式登录用户的令牌,再用该令牌启动程序,步骤如下:
- 获取当前活动控制台会话ID
- 查询对应会话的用户令牌
- 复制令牌并调整权限
- 用复制后的令牌调用
CreateProcessAsUser启动目标程序
示例代码:
HANDLE hUserToken = NULL; DWORD dwSessionId = WTSGetActiveConsoleSessionId(); if (WTSQueryUserToken(dwSessionId, &hUserToken)) { HANDLE hDupToken = NULL; if (DuplicateTokenEx(hUserToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hDupToken)) { STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi = { 0 }; wchar_t szAppPath[] = L"C:\\Path\\To\\YourApp.exe"; // 替换为你的应用实际路径 if (CreateProcessAsUser(hDupToken, NULL, szAppPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } CloseHandle(hDupToken); } CloseHandle(hUserToken); }
注意:使用该方法需链接wtsapi32.lib,且程序需具备获取用户令牌的权限。
方法3:用runas动词指定普通用户上下文
通过ShellExecuteEx的runas动词,指定当前登录的普通用户名启动程序(可能触发UAC提示):
SHELLEXECUTEINFO sei = { sizeof(sei) }; sei.lpVerb = L"runas"; sei.lpFile = L"C:\\Path\\To\\YourApp.exe"; // 替换为你的应用实际路径 sei.lpUsername = L"当前登录普通用户名"; // 替换为实际用户名 sei.nShow = SW_SHOWNORMAL; ShellExecuteEx(&sei);
内容的提问来源于stack exchange,提问作者marciel.deg
相关产品推荐
相关产品推荐

