هل من الممكن تكرار التالية الاعتماد في عملية VB.NET?

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

سؤال

الحل (نوعا ما):

اتضح أن هذا الانتحال مع .صافي الأمن يسمح فقط على مستوى التطبيق الوصول.منذ COM الكائن على مستوى النظام ، انتحاله المستخدم لا يزال لا مثيل ذلك.لقد اكتشفت هذا عن طريق النقر بزر الماوس الأيمن فوق الملف القابل للتنفيذ واختيار "تشغيل..." ، برنامج عمل جيد.اكتشفت أن تطلق البرنامج مع نظام الوصول (على افتراض أن المستخدم الذي يتم تشغيله مع التفويض).أنا الآن في عملية إنشاء برنامج خارجي أن إطلاق هذا التطبيق باستخدام هذا الأسلوب.

شكرا على النصائح :D


لدي ويندوز XP على الجهاز الظاهري.بل هو جزء من المجال ، ولكن تسجيل الدخول المستخدم هو مستخدم محلي فقط.ومن الواضح إن محاولة الوصول إلى مشاركة الشبكة فإنه سيتم مطالبة المستخدم/كلمة المرور:

alt text

البرنامج أنا اختبار على الجهاز الظاهري يستخدم كائن COM التفاعل مع بيانات من برنامج آخر.إذا كنت لا انتحال شخصية ، أحصل على الأخطاء لأنني لم يكن لديك وثائق التفويض اللازمة.

فعلت بعض البحوث في هذه المسألة وجدت عدد من المواقع التي كان مبلغ محترم من VB.NET المعلومات.المشكلة أنا بعد مع رمز كتبت هو لا يمكن الوصول إلى موارد شبكة الاتصال ولكن أنا لا يمكن إنشاء مثيل كائن COM.

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

Public Sub BeginImpersonation()
    Const LOGON32_PROVIDER_DEFAULT As Integer = 0
    Const LOGON32_LOGON_INTERACTIVE As Integer = 2
    Const SecurityImpersonation As Integer = 2

    Dim win32ErrorNumber As Integer

    _tokenHandle = IntPtr.Zero
    _dupeTokenHandle = IntPtr.Zero

    If Not LogonUser(_username, _domainname, _password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, _tokenHandle) Then
        win32ErrorNumber = System.Runtime.InteropServices.Marshal.GetLastWin32Error()
        Throw New ImpersonationException(win32ErrorNumber, GetErrorMessage(win32ErrorNumber), _username, _domainname)
    End If

    If Not DuplicateToken(_tokenHandle, SecurityImpersonation, _dupeTokenHandle) Then
        win32ErrorNumber = System.Runtime.InteropServices.Marshal.GetLastWin32Error()

        CloseHandle(_tokenHandle)
        Throw New ImpersonationException(win32ErrorNumber, "Unable to duplicate token!", _username, _domainname)
    End If

    Dim newId As New System.Security.Principal.WindowsIdentity(_dupeTokenHandle)
    _impersonatedUser = newId.Impersonate()
    _impersonating = True
End Sub

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

Enum LOGON32_LOGON
    INTERACTIVE = 2
    NETWORK = 3
    BATCH = 4
    SERVICE = 5
    UNLOCK = 7
    NETWORK_CLEARTEXT = 8
    NEW_CREDENTIALS = 9
End Enum
Enum LOGON32_PROVIDER
    [DEFAULT] = 0
    WINNT35 = 1
    WINNT40 = 2
    WINNT50 = 3
End Enum
Enum SECURITY_LEVEL
    Anonymous = 0
    Identification = 1
    Impersonation = 2
    Delegation = 3
End Enum
هل كانت مفيدة؟

المحلول

ولقد واجه هذا من قبل، وتستخدم اثنين soloution مختلفة - أسهل كان يستخدم التطبيق طرف ثالث: TqcRunas: <لأ href = "http://www.quimeras.com/Products/products.asp" يختلط = "نوفولو noreferrer"> http://www.quimeras.com/Products/products.asp الذي يسمح لك لحزم creentials المطلوبة في ملف مشفر. ومع ذلك هو الألم إذا اضطر كلمة السر على الانتهاء.

والحل الآخر أن أكون قد تستخدم لاستدعاء عملية جديدة مع أوراق اعتماد بديلة:

        Dim myProcessStartInfo As ProcessStartInfo = New ProcessStartInfo

    With myProcessStartInfo

        .FileName = "file path and name"

        .Domain = "domainname"
        .UserName = "username"

        'password needs to be a SerureString
        Using NewPassword As New Security.SecureString
            With NewPassword
                For Each c As Char In "password".ToCharArray
                    .AppendChar(c)
                Next c
                .MakeReadOnly()
            End With
            .Password = NewPassword.Copy
        End Using

        'UseShellExecute must be false for impersonated process
        .UseShellExecute = False

    End With

    Using Process As New System.Diagnostics.Process
        With Process
            .StartInfo = myProcessStartInfo
            .Start()
        End With
    End Using

نصائح أخرى

ومع التعاريف الخاصة بك، وأنا استخدم

LogonUser(_username, _domainname, _password, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, _tokenHandle)

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

أنا لا شيء مماثل إلى خريطة محركات أقراص الشبكة لنسخ الملفات بين الأجهزة.أنا لم أكتب الكود ولكن انها الى حد كبير نفس لك ، باستثناء أمرين:

  • بعد انتحال صفة الأسلوب بإرجاع أغلق كل الرموز باستخدام CloseHandle الروتينية قبل الخروج بلدي منتحل الأسلوب.

  • في الجزء العلوي من منتحل الشيء الأول الذي يحدث هو دعوة إلى RevertToSelf ، ويفترض أن إلغاء أي السابقة الانتحال.

أنا لا أعرف إذا كانوا فرقا ولكن الأمر يستحق المحاولة.وهنا الإعلانات ذات الصلة:

Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As Long
Declare Auto Function RevertToSelf Lib "advapi32.dll" () As Long
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top