2015-10-19 3 views
0

Моя служба работает под локальными системными правами и требует запуска приложения с правами администратора в сеансе пользователя.CreateProcessAsUser с повышенными привилегиями

То, что я получил это:

  1. WTSGetActiveConsoleSessionID()
  2. WTSQueryUserToken для сеанса ID
  3. CreateProcessAsUser

Проблема мне нужно, чтобы запустить процесс (шаг 3) в качестве администратора , не запрашивая у пользователя пароль администратора.

В системах Linux я бы просто сделал «su», но чтобы добиться этого в системе Windows?

+0

Возможно, вы не понимаете 'su', но она не может быть использована для получения привилегий суперпользователя без предоставления учетных данных в какой-то момент. Продолжайте, что вы предлагаете сделать, если зарегистрированный пользователь не является администратором? –

+0

У вас есть вещи назад. Запустите приложение, как и любое другое приложение, и сообщите ему об услуге, если приложение должно запросить операции, чтобы у пользователя не было достаточных привилегий для выполнения. Не тратьте время на реализацию хорошо спроектированного нарушения безопасности. – IInspectable

+0

Сценарий: 1) Пользователь должен изменить что-то, требующее административных разрешений, 2) Пользователь вызывает нашу службу поддержки, 3) Helpdesk запускает локальную службу для выполнения нашего специального инструмента в качестве администратора. – gorootde

ответ

0

Я наконец-то нашел решение для управления этим:

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

Мне нужно запустить процесс (шаг 3) в качестве администратора, не спрашивая у пользователя пароль администратора.

Если бы пользователь с низким уровнем привилегий мог выполнять код в качестве привилегированного пользователя, система безопасности системы была бы нарушена. Если вы хотите выполнить код с правами администратора, тогда вам необходимо предоставить соответствующие учетные данные в какой-то момент.

В предлагаемом плане действий вы вызываете CreateProcessAsUser, передавая токен пользователя для пользователя с низким приоритетом. Этот план, как указано в вопросе, не может быть успешным. Поскольку пользовательский токен, который вы предоставите, относится к пользователю с низкими привилегиями, процесс не сможет выполнять административные задачи.

Вам необходимо будет предоставить, так или иначе, учетные данные для пользователя с правами администратора.

+0

Поскольку мы говорим об услуге, мне нужно получить токен для учетной записи администратора. Как это сделать? – gorootde

+0

Почему вы не настраиваете свой сервис для запуска под учетной записью администратора? –

Смежные вопросы