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
War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top