我的服务在本地系统权限下运行,需要在用户会话中启动具有管理员权限的应用程序。
我得到的是:
WTSGetActiveConsoleSessionID()WTSQueryUserTokenCreateProcessAsUser问题是,我需要以管理员的身份运行流程(步骤3),而无需向用户询问管理员的密码。
在Linux系统上,我只需要做一个"su ",但是要在Windows系统上实现这一点呢?
发布于 2016-03-08 13:25:37
我终于找到了管理这个问题的解决方案:
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);
}
}发布于 2015-10-19 13:48:24
我需要以管理员的身份运行流程(步骤3),而无需向用户询问管理员的密码。
如果低特权用户能够以特权用户的身份执行代码,那么系统的安全模型就会被打破。如果希望以管理员权限执行代码,则需要在某一时刻提供适当的凭据。
建议的操作计划让您调用CreateProcessAsUser,为低特权用户传递用户令牌。这个计划如问题中逐项列出的那样,是不可能成功的。由于您将提供的用户令牌是低特权用户的令牌,因此该进程将无法执行管理任务。
您将需要以某种方式为具有管理权限的用户提供凭据。
https://stackoverflow.com/questions/33212984
复制相似问题