Ist es möglich, den folgenden Berechtigungsnachweis Prozess in VB.NET zu duplizieren?
-
03-07-2019 - |
Frage
Lösung (ein bisschen):
Mit diesem Identitätswechsel mit .NET Sicherheit stellt sie heraus, erlaubt nur auf Anwendungsebene Zugriff. Da das COM-Objekt auf der Systemebene ist nach wie vor der imitierte Benutzer kann es nicht instanziiert. Ich dies die ausführbare Datei mit der rechten Maustaste herausgefunden und „Ausführen als ...“ wählen, wird das Programm funktionierte gut. Ich fand heraus, dass das Programm mit Zugriff auf das System startet (vorausgesetzt, der Benutzer, den Sie es laufen mit diesen Anmeldeinformationen verfügt). Jetzt bin ich in den Prozess ein externes Programm zu schaffen, das die Nutzung dieser Anwendung dieser Methode wird gestartet.
Danke für die Tipps: D
Ich habe einen Windows XP-Installation auf einer virtuellen Maschine. Es ist ein Teil meiner Domain, aber die angemeldeten Benutzer ist ein lokaler Benutzer nur. Natürlich, wenn ich versuche, eine Netzwerkfreigabe zuzugreifen es für einen Benutzer / Kennwort fragt:
Das Programm, das ich auf der virtuellen Maschine am testet verwendet ein COM-Objekt mit Daten aus einem anderen Programm zu verbinden. Wenn ich Identitätswechsel nicht, bekomme ich Fehler, weil ich nicht die richtigen Anmeldeinformationen.
habe ich einige der Forschung in die Sache und fand eine Reihe von Websites, die einen angemessenen Betrag von VB.NET Informationen hatte. Das Problem, das ich mit dem Code habe ich geschrieben habe, das ich die Netzwerkressourcen zugreifen kann, aber ich kann das COM-Objekt nicht instanziiert.
Wenn ich ausfüllen und senden Sie die Anmeldeaufforderung (siehe oben), bevor es zu instanziieren, es funktioniert gut. Das führt mich zu glauben, dass etwas sein muss, dass die WinXP Anmeldeaufforderung tut, dass ich nicht. Unten ist der Code, den ich für Personifizierung bin mit:
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
Ich habe auch versucht, verschiedene Flaggen zum Imitator Methode sendet, aber nichts scheint zu funktionieren. Hier sind die verschiedenen Flaggen ich gefunden:
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
Lösung
Ich habe vor, in diesem Lauf, und verwendet zwei verschiedene soloution - die einfachste einen Dritten App wurde mit: TqcRunas: http://www.quimeras.com/Products/products.asp das Ihnen erlaubt, die erforderlichen creentials in einer verschlüsselten Datei zu verpacken. Allerdings ist ein Schmerz, wenn das Passwort gezwungen wird, abläuft.
Die andere Lösung, die ich verwendet habe, ist ein neues Verfahren mit alternativen Anmeldeinformationen zu nennen:
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
Andere Tipps
Mit Ihren Definitionen, verwende ich
LogonUser(_username, _domainname, _password, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, _tokenHandle)
in meinem Code, der über das Netzwerk authentifiziert. Ich bin einen lokalen Benutzer auf dem Remote-Box Identitätswechsel, wie Sie sind. Es war so lange her, dass ich mich nicht erinnern, die Gründe, diese Werte für die Verwendung jedoch.
Ich habe ein ähnliches Ding Netzlaufwerke für das Kopieren von Dateien zwischen Rechnern abzubilden. Ich habe nicht den Code schreiben, aber es ist so ziemlich das gleiche wie Sie, mit Ausnahme von zwei Dingen:
-
Nachdem die Impersonate-Methode zurückgibt schließen ich beide Token die Closehandle-Routine, bevor ich meine Imitator Methode verlassen.
-
An der Spitze des Imitator das erste, was ein Aufruf an RevertToSelf passiert ist, vermutlich alle früheren Identitätswechsel abzubrechen.
Ich weiß nicht, ob sie einen Unterschied machen würde, aber es ist ein Versuch wert. Hier sind die entsprechenden Erklärungen:
Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As Long
Declare Auto Function RevertToSelf Lib "advapi32.dll" () As Long