具有提升权限的CreateProcessAsUser

时间:2015-10-19 11:16:26

标签: windows winapi service

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

我得到的是:

  1. WTSGetActiveConsoleSessionID()
  2. 会话ID的WTSQueryUserToken
  3. CreateProcessAsUser
  4. 问题是我需要以管理员身份运行流程(步骤3),而不要求用户提供管理员密码。

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

2 个答案:

答案 0 :(得分:2)

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

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);
        }
    }

答案 1 :(得分:1)

  

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

如果低权限用户可以作为特权用户执行代码,那么系统的安全模型将被破坏。如果要使用管理员权限执行代码,则需要在某些时候提供适当的凭据。

您提议的行动计划让您呼叫CreateProcessAsUser为低权限用户传递用户令牌。该计划在问题中逐项列出,不能成功。由于您将提供的用户令牌是低权限用户的用户令牌,因此该进程将无法执行管理任务。

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