In meinem Weg, die Nuancen der Benutzeridentitätswechsel in Windows zu meistern, hatte ich zuerst ein Problem über Identitätswechsel zu einer entfernten Datenbank überhaupt auftreten (siehe this SO question), aber ich habe das schließlich herausgefunden. Meine nächste Hürde ist Rückgängigmachen/Abbrechen/Zurücksetzen (wählen Sie Ihr Lieblingsverb) Identitätswechsel.Windows-Identitätswechsel: Ein Fehler in der Salbe
Ich habe ein paar verschiedene Identitätswechsel Bibliotheken versucht, die mir glaubwürdig erscheinen:
- Phil Impersonator
- Matt Johnson SimpleImpersonation
Die Ergebnisse Harding mit beiden Bibliotheken identisch sind. Bewährte Methoden schreiben die Verwendung des Anmeldetyps LOGON32_LOGON_NEW_CREDENTIALS (siehe Windows-API LogonUser function) für eine ferne DB-Verbindung vor. Wenn ich das hier tun ist, was mein Beispielcode erzeugt:
// SCENARIO A
BEGIN impersonation.
Local user = MyDomain\MyUser
DB reports: MyDomain\ImpersonatedUser
END impersonation.
Local user = MyDomain\MyUser
DB reports: MyDomain\ImpersonatedUser << NOT EXPECTED HERE!!
Die einzige Abhilfe, die ich gefunden habe, ist den LOGON32_LOGON_INTERACTIVE Anmeldetyp verwendet wird und dann bekomme ich diese:
// SCENARIO B
BEGIN impersonation.
Local user = MyDomain\ImpersonatedUser << EXPECTED, BUT NOT WANTED!
DB reports: MyDomain\ImpersonatedUser
END impersonation.
Local user = MyDomain\MyUser
DB reports: MyDomain\MyUser
Aus der lapidaren Beschreibung die WindowsImpersonationContext.Undo Methode scheint es sollte wie in Szenario A gearbeitet haben.
Ist es möglich, mithilfe der Anmeldetyp LOGON32_LOGON_NEW_CREDENTIALS wiederherstellen?
Schließen und öffnen Sie die Verbindung zur Datenbank. Die Datenbank erhält keine Benachrichtigung, wenn Sie Identitätswechselebenen ändern. Ich kann nur vermuten, dass der Datenbank-Client in Szenario B automatisch eine neue Verbindung herstellt. –
Danke für den Kommentar, @ HarryJohnston; Ich hätte sagen sollen, dass ich tatsächlich die SQL-Verbindung geschlossen und eine neue gestartet habe. –
Vielleicht speichert der Datenbankclient die SQL-Verbindung oder wahrscheinlicher die zugrunde liegende Netzwerkverbindung (eine Named Pipe?). Ihre beste Option ist wahrscheinlich, einen Unterprozess (im Kontext des neuen Tokens) zu starten, um die imitierte Datenbankverbindung für Sie auszuführen. –