You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从管理员权限进程启动普通用户权限的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获取当前交互式登录用户的令牌,再用该令牌启动程序,步骤如下:

  1. 获取当前活动控制台会话ID
  2. 查询对应会话的用户令牌
  3. 复制令牌并调整权限
  4. 用复制后的令牌调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 16:43:26