هل من الممكن تكرار التالية الاعتماد في عملية VB.NET?
-
03-07-2019 - |
سؤال
الحل (نوعا ما):
اتضح أن هذا الانتحال مع .صافي الأمن يسمح فقط على مستوى التطبيق الوصول.منذ COM الكائن على مستوى النظام ، انتحاله المستخدم لا يزال لا مثيل ذلك.لقد اكتشفت هذا عن طريق النقر بزر الماوس الأيمن فوق الملف القابل للتنفيذ واختيار "تشغيل..." ، برنامج عمل جيد.اكتشفت أن تطلق البرنامج مع نظام الوصول (على افتراض أن المستخدم الذي يتم تشغيله مع التفويض).أنا الآن في عملية إنشاء برنامج خارجي أن إطلاق هذا التطبيق باستخدام هذا الأسلوب.
شكرا على النصائح :D
لدي ويندوز XP على الجهاز الظاهري.بل هو جزء من المجال ، ولكن تسجيل الدخول المستخدم هو مستخدم محلي فقط.ومن الواضح إن محاولة الوصول إلى مشاركة الشبكة فإنه سيتم مطالبة المستخدم/كلمة المرور:
البرنامج أنا اختبار على الجهاز الظاهري يستخدم كائن 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