Альтернативы LsaLogonUser с KERB_S4U_LOGON имеют доступ к сети?

Есть ли альтернативы LsaLogonUser для олицетворения данной учетной записи для доступа к сетевым ресурсам? Я ищу метод олицетворения, который позволил бы мне вызывать удаленный компьютер через UNC в том же домене.

Для исходных данных у меня есть: домен \ имя пользователя.

У меня нет пароля, потому что для этого я использую LsaRegisterLogonProcess и LsaLogonUser с пакетом Kerberos. Локально все работает, и я могу олицетворять и вызывать приложения, используя другое имя пользователя, однако, при попытке получить доступ к удаленной машине с помощью.. \\remotemachine\shared\somefile.bat У меня отказано в доступе.

Обычно я вызываю cmd.exe как команду..., а затем открывается консоль с новым пользователем, но если попытка вызвать путь UNC, доступ запрещен.

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

Это часть моего рабочего кода:

    ...

    NTSTATUS Status = STATUS_SUCCESS;

    LSA_OPERATIONAL_MODE unused;

    LSA_STRING lsaString;
    lsaString.Buffer = "User Impersonated LogonProcess";
    lsaString.Length = strlen(lsaString.Buffer);
    lsaString.MaximumLength = lsaString.Length + 1;

    Status = LsaRegisterLogonProcess(&lsaString, &lsa, &unused);
    if (Status != STATUS_SUCCESS) {
        printf("LsaRegisterLogonProcess failed: %x\n", Status);
    }

    ...

    NTSTATUS status = LsaLogonUser(
                                    lsa,
                                    &origin,
                                    Network,
                                    packageId,
                                    authInfo,
                                    authInfoSize,
                                    0,
                                    &source,
                                    &profileBuffer,
                                    &profileBufLen,
                                    &luid,
                                    &token,
                                    &qlimits,
                                    &subStatus
                                );

    if (status != ERROR_SUCCESS)
    {
        ULONG err = LsaNtStatusToWinError(status);
        printf("LsaLogonUser failed: %x\n", status);
        return 1;
    }

    ...

    DuplicateTokenEx(token, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &tokenDuplicate);

    if (CreateProcessWithTokenW(
                                tokenDuplicate,
                                LOGON_WITH_PROFILE,
                                command,
                                command_arguments,
                                CREATE_NEW_CONSOLE,
                                NULL,
                                NULL,
                                &si,
                                &pi))
            {
                pi.hThread = NULL;
                pi.hProcess = NULL;
                CloseHandle(pi.hProcess);
                CloseHandle(pi.hThread);
            }

0 ответов

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