c # WindowsIdentity Олицетворение не работает - PullRequest
2 голосов
/ 28 апреля 2011

Когда я использую олицетворение WindowsIdentity следующим образом:

 WindowsIdentity newId = null;
        WindowsImpersonationContext impersonatedUser = null;

                 Console.WriteLine("Name of the identity BEFORE impersonation: "
   + WindowsIdentity.GetCurrent().Name + ".");
                newId = new WindowsIdentity(_impersonationToken);
                impersonatedUser = newId.Impersonate();
                Console.WriteLine("Name of the identity AFTER impersonation: "
    + WindowsIdentity.GetCurrent().Name + ".");

(используется для копирования файлов с моего компьютера на машину winCE.)

Имя до и Имя после сохранениявозвращая то же самое.Когда я смотрю @ токен newId после олицетворения, он не совпадает с тем, который я использую для олицетворения.Токен, с которым я олицетворяю, определенно не тот же пользователь, что и тот, с кем я вошел в систему.

Есть ли у кого-нибудь предложения по поводу того, почему он не хочет использовать мой токен?(о да, вчера это сработало как талисман: s)

Вот как я генерирую свой токен:

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
            int dwLogonType, int dwLogonProvider, ref IntPtr phToken);


LogonUser(Username, IPMachine, Password,
                            LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT,
                            ref _token);

Это дает успешное бул, так что с моим токеном все в порядкея думаю

Ответы [ 3 ]

2 голосов
0 голосов
/ 16 марта 2019

Я получаю это работает:

/// <summary>
/// Summary description for Impersonate
/// </summary>
public class Impersonate
{
    #region "Class Members"
    public const int LOGON32_LOGON_INTERACTIVE = 2;
    public const int LOGON32_PROVIDER_DEFAULT = 0;
    WindowsImpersonationContext _impersonationContext;
    #endregion

    #region "Class Properties"
    private string domainName { get; set; }
    private string userName { get; set; }
    private string userPassword { get; set; }
    #endregion

    public Impersonate(string domainName, string userName, string userPassword)
    {
        this.domainName = domainName;
        this.userName = userName;
        this.userPassword = userPassword;
    }

    #region "Impersonation Code"
    [DllImport("advapi32.dll")]
    public static extern int LogonUserA(String lpszUserName,
        String lpszDomain,
        String lpszPassword,
        int dwLogonType,
        int dwLogonProvider,
        ref IntPtr phToken);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int DuplicateToken(IntPtr hToken,
        int impersonationLevel,
        ref IntPtr hNewToken);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool RevertToSelf();

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern bool CloseHandle(IntPtr handle);

    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    public bool ImpersonateValidUser()
    {
        var token = IntPtr.Zero;
        var tokenDuplicate = IntPtr.Zero;

        if (RevertToSelf())
        {
            if (LogonUserA(this.userName, this.domainName, this.userPassword, LOGON32_LOGON_INTERACTIVE,
                LOGON32_PROVIDER_DEFAULT, ref token) != 0)
            {
                if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
                {
                    var tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                    _impersonationContext = tempWindowsIdentity.Impersonate();

                    if (_impersonationContext != null)
                    {
                        CloseHandle(token);
                        CloseHandle(tokenDuplicate);

                        return true;
                    }
                }
            }
        }
        if (token != IntPtr.Zero)
            CloseHandle(token);

        if (tokenDuplicate != IntPtr.Zero)
            CloseHandle(tokenDuplicate);

        return false;
    }

    public void UndoImpersonation()
    {
        _impersonationContext.Undo();
    }
    #endregion
}

Вы можете назвать это:

            var impessonate = new Impersonate(".", "User", "Psw");

            if (impessonate.ImpersonateValidUser())
            {
                // do stuff
                impessonate.UndoImpersonation();
            }
0 голосов
/ 28 апреля 2011

Как вы генерируете свой _impersonationToken?

Существует отличное решение для олицетворения на CodeProject .Глядя на это может дать вам новые идеи.

...