Хотите запустить процесс «X» с использованием токена пользователя «B» в сеансе пользователя «A» с помощью AdvApi в сервисном коде.

  1. У нас есть служба, которая работает как системный сеанс.
  2. Получение токена пользователя «B»
  3. В этом токене изменяется идентификатор сеанса пользователя «А»
  4. Используя этот токен, запускаем процесс «X»
  5. После запуска процесса «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.

0 ответов

Другие вопросы по тегам