使用KERB_S4U_LOGON的LsaLogonUser的替代方案是否具有网络访问权限?

时间:2017-07-13 09:43:16

标签: c++ winapi impersonation sspi

为了访问网络资源,是否有任何替代LsaLogonUser用于模拟指定帐户?我正在寻找模仿的方法,这可以让我通过UNC在同一个域中调用远程机器。

对于初始数据,我有:domain \ username。

我没有密码,因为我使用的是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 个答案:

没有答案