باستخدام advapi32.dll: LogonUserA () لانتحال صفة مستخدم محلي جهاز بعيد ل

StackOverflow https://stackoverflow.com/questions/1035116

سؤال

وأنا بحاجة إلى أن تكون قادرة على تشغيل RegLoadKey () على جهاز بعيد، وأنه قد يكون ذلك الجهاز الخاص بي والجهاز البعيد ليست في نفس المجال. إذا لم تكن، رمز أدناه يعمل موافق، وأستطيع أن انتحال صفة مستخدم لديه امتيازات المسؤول على الجهاز. خلاف ذلك، إذا كنا نتحدث عن المستخدمين المحليين، وفقا لهذه المناقشة لقد وجدت ...

http://www.eggheadcafe.com/conversation.aspx؟messageid = 34224301 ورقم الموضوع = 34224226

... يجب أن يكون هناك مستخدم محلي على الجهاز الخاص بي مع نفس اسم المستخدم وكلمة المرور. قرف. هل هناك طريقة للالتفاف حول ذلك؟

using System.Runtime.InteropServices;
using System.Security.Principal;

[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);

public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;

public WindowsImpersonationContext WearDrag(string Username, string Password, string DomainOrMachine)
{
    WindowsImpersonationContext impersonationContext;
    WindowsIdentity tempWindowsIdentity;
    IntPtr token = IntPtr.Zero;
    IntPtr tokenDuplicate = IntPtr.Zero;

    if (RevertToSelf())
    {
        if (LogonUserA(Username, DomainOrMachine, Password,
            LOGON32_LOGON_INTERACTIVE,
            LOGON32_PROVIDER_DEFAULT, ref token) != 0)
        {
            if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
            {
                tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                impersonationContext = tempWindowsIdentity.Impersonate();
                if (impersonationContext != null)
                {
                    CloseHandle(token);
                    CloseHandle(tokenDuplicate);
                    return impersonationContext;
                }
            }
        }
    }
    if (token != IntPtr.Zero)
        CloseHandle(token);
    if (tokenDuplicate != IntPtr.Zero)
        CloseHandle(tokenDuplicate);
    return null;
}
هل كانت مفيدة؟

المحلول

وهنا ما لقد تم استخدام دون الحاجة إلى تعريف المستخدم المحلي:

const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
const int LOGON32_PROVIDER_DEFAULT = 0;

bool isSuccess = LogonUser(username, domain, password,
            LOGON32_LOGON_NEW_CREDENTIALS,
            LOGON32_PROVIDER_DEFAULT, ref token);

وبعد ذلك:

WindowsIdentity newIdentity = new WindowsIdentity(token);
WindowsImpersonationContext impersonatedUser = newIdentity.Impersonate();

وأنا لا تكرار التعامل مع ذلك.

وملاحظة أخرى - أنا لا أستعمل LogonUserA، وأنا ببساطة استخدام LogonUser

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top