Хотите запустить процесс «X» с использованием токена пользователя «B» в сеансе пользователя «A» с помощью AdvApi в сервисном коде.
- У нас есть служба, которая работает как системный сеанс.
- Получение токена пользователя «B»
- В этом токене изменяется идентификатор сеанса пользователя «А»
- Используя этот токен, запускаем процесс «X»
- После запуска процесса «X» возникает ошибка Исключение неизвестного программного исключения (0xc06d007e) в приложении по адресу 0x0000000076855232.
Найдите ниже код для достижения этого, но он выдает ошибку после запуска процесса
boolean res =
Advapi32.INSTANCE.LogonUser(
user, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, userToken);
WinBase.SECURITY_ATTRIBUTES sa = new WinBase.SECURITY_ATTRIBUTES();
sa.dwLength = new WinDef.DWORD(sa.size());
WinNT.HANDLEByReference hUserTokenDup = new WinNT.HANDLEByReference();
boolean duplicateTokenEx =
Advapi32.INSTANCE.DuplicateTokenEx(
userToken.getValue(),
WinNT.TOKEN_ALL_ACCESS|WinNT.TOKEN_ADJUST_SESSIONID,
sa,
SECURITY_IMPERSONATION_LEVEL.SecurityIdentification,
TOKEN_TYPE.TokenPrimary,
hUserTokenDup);
if (!duplicateTokenEx) {
Kernel32.INSTANCE.CloseHandle(userToken.getValue());
Kernel32.INSTANCE.CloseHandle(hUserTokenDup.getValue());
throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
}
boolean setTokenInfo =
Advapi32.INSTANCE.SetTokenInformation(
hUserTokenDup.getValue(),
TOKEN_INFORMATION_CLASS.TokenSessionId,
new IntByReference(sessionId),
DWORD.SIZE);
if (!setTokenInfo) {
Kernel32.INSTANCE.CloseHandle(hUserTokenDup.getValue());
Kernel32.INSTANCE.CloseHandle(userToken.getValue());
throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
}
final STARTUPINFO startupInfo = new STARTUPINFO();
startupInfo.lpDesktop = "Winsta0\\Winlogon";
// final STARTUPINFO startupInfo = new STARTUPINFO();
final PROCESS_INFORMATION processInformation = new PROCESS_INFORMATION();
final PointerByReference ref = new PointerByReference();
try {
boolean createProcess =
Advapi32.INSTANCE.CreateProcessAsUser(
hUserTokenDup.getValue(),
null,
cmd,
null,
null,
false,
CREATE_UNICODE_ENVIRONMENT,
ref.getValue(),
null,
startupInfo,
processInformation);
if (!createProcess) {
throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
}
} finally {
Kernel32.INSTANCE.CloseHandle(hUserTokenDup.getValue());
Kernel32.INSTANCE.CloseHandle(userToken.getValue());
}
Процесс запускается, но выдает ошибку при запуске, как показано ниже.
Исключение неизвестное программное исключение (0xc06d007e) произошло в приложении по адресу 0x0000000076855232.