Я наконец-то нашел решение для управления этим:
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);
}
}
Возможно, вы не понимаете 'su', но она не может быть использована для получения привилегий суперпользователя без предоставления учетных данных в какой-то момент. Продолжайте, что вы предлагаете сделать, если зарегистрированный пользователь не является администратором? –
У вас есть вещи назад. Запустите приложение, как и любое другое приложение, и сообщите ему об услуге, если приложение должно запросить операции, чтобы у пользователя не было достаточных привилегий для выполнения. Не тратьте время на реализацию хорошо спроектированного нарушения безопасности. – IInspectable
Сценарий: 1) Пользователь должен изменить что-то, требующее административных разрешений, 2) Пользователь вызывает нашу службу поддержки, 3) Helpdesk запускает локальную службу для выполнения нашего специального инструмента в качестве администратора. – gorootde