首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >特权提升的CreateProcessAsUser

特权提升的CreateProcessAsUser
EN

Stack Overflow用户
提问于 2015-10-19 11:16:26
回答 2查看 4.2K关注 0票数 5

我的服务在本地系统权限下运行,需要在用户会话中启动具有管理员权限的应用程序。

我得到的是:

  1. WTSGetActiveConsoleSessionID()
  2. 会话ID的WTSQueryUserToken
  3. CreateProcessAsUser

问题是,我需要以管理员的身份运行流程(步骤3),而无需向用户询问管理员的密码。

在Linux系统上,我只需要做一个"su ",但是要在Windows系统上实现这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-08 13:25:37

我终于找到了管理这个问题的解决方案:

代码语言:javascript
复制
public void launchProcessInUserSession(String process) throws WindowsAPIException {

        final DWORD interactiveSessionId = kernel32.WTSGetActiveConsoleSessionId();
        final DWORD serviceSessionId = getCurrentSessionId();

        final HANDLEByReference pExecutionToken = new HANDLEByReference();

        final HANDLE currentProcessToken = getCurrentProcessToken();
        try {

            final HANDLE interactiveUserToken = getUserToken(interactiveSessionId);

            checkAPIError(advapi32.DuplicateTokenEx(currentProcessToken, WinNT.TOKEN_ALL_ACCESS, null, SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation,
                    WinNT.TOKEN_TYPE.TokenPrimary, pExecutionToken));
        } finally {
            kernel32.CloseHandle(currentProcessToken);
        }

        final HANDLE executionToken = pExecutionToken.getValue();
        try {
            checkAPIError(advapi32.SetTokenInformation(executionToken, TOKEN_INFORMATION_CLASS.TokenSessionId, new IntByReference(interactiveSessionId.intValue()), DWORD.SIZE));

            final WinBase.STARTUPINFO si = new WinBase.STARTUPINFO();
            final PROCESS_INFORMATION processInfo = new WinBase.PROCESS_INFORMATION();
            final int dwFlags = WinBase.DETACHED_PROCESS;

            checkAPIError(advapi32.CreateProcessAsUser(executionToken, null, process, null, null, false, dwFlags, null, null, si, processInfo));
            LOGGER.debug("Execution done. Process ID is {}", processInfo.dwProcessId);
        } finally {
            kernel32.CloseHandle(executionToken);
        }
    }
票数 3
EN

Stack Overflow用户

发布于 2015-10-19 13:48:24

我需要以管理员的身份运行流程(步骤3),而无需向用户询问管理员的密码。

如果低特权用户能够以特权用户的身份执行代码,那么系统的安全模型就会被打破。如果希望以管理员权限执行代码,则需要在某一时刻提供适当的凭据。

建议的操作计划让您调用CreateProcessAsUser,为低特权用户传递用户令牌。这个计划如问题中逐项列出的那样,是不可能成功的。由于您将提供的用户令牌是低特权用户的令牌,因此该进程将无法执行管理任务。

您将需要以某种方式为具有管理权限的用户提供凭据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33212984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档