UserImpersonation / advapi32.dll - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +---- Forum: DLL & externer Code (/Forum-DLL-externer-Code) +---- Thema: UserImpersonation / advapi32.dll (/Thread-UserImpersonation-advapi32-dll) |
UserImpersonation / advapi32.dll - Achim - 28.01.2015 09:35 Hallo, ich habe aktuell ein Problem, an dem ich mir die Zähne ausbeisse... Folgende Problemstellung: - Auf einem Rechner (am Netzwerk!) gibt es einen lokalen Order (C:\Outbox). - Auf diesen Ordner kann nur der User "John.Connor" mit dem Passwort "HastaLaVista" zugreifen. Das kann man im Windows Explorer mit einem Rechtsklick auf den Ordner >> Eigenschaften >> Sicherheit >> Bearbeiten einstellen - Die LabVIEW-Applikation auf diesem Rechner läuft in einem allgemeinen User-Kontext ("Labor" o. ä.), "John.Connor" ist also nicht am Rechner angemeldet - Nun soll innerhalb der LV-Applikation mithilfe der advapi32.dll ein Zugriff auf den Ordner erfolgen, d.h. im Code sind Benutzername und Passwort von "John.Connor" fest hinterlegt. - Über "LogonUser" und "ImpersonateLoggedOnUser" soll also im Hintergrund der Zugriff auf den gesperrten Ordner erfolgen, um da was reinzuschreiben. Es gibt wohl zwei Möglichkeiten: - LogonUser mit dem Parameter "LOGON32_LOGON_NETWORK", dann wird direkt ein "impersonation token" erzeugt, auf dass man mit "ImpersonateLoggedOnUser" zugreifen kann -LogonUser mit dem Parameter "LOGON32_LOGON_NETWORK_CLEARTEXT", es wird ein "primary token" erzeugt. Dieses kann man mit "DuplicateToken" und dem "ImpersonationLevel" = "SecurityImpersonation" in ein "impersonation token" umwandeln um dann wieder "ImpersonateLoggedOnUser" aufzurufen Ich habe das im angehängten VI vorbereitet. Beide Varianten funktionieren zwar, d.h. es kommt keine Fehlermeldunge etc., aber leider kann ich trotz erfolgreichem Logon keine Dateien schreiben (Error 8: File permission error), bzw. auch keine vorhandenen Files lesen (Error 7: File not found). Seltsam: Nach dem erfolgreichen Logon + Impersonate kann ich mit "List Folder" den Inhalt des Ordners sehen, das funktioniert sonst nicht. Das kann man auch mit der Kommandozeile nachvollziehen. Wenn man das ganz VI unmittelbar vor "Open File" (Breakpoint!) stoppt, und sich dann "manuell" die Rechte am Ordner "Outbox" holt und dann das VI weiterlaufen lässt, läuft das Schreiben ohne Fehler durch. Das Open File-VI interessiert sich also gar nicht für den Hintergrund-Logon, sondern "sieht" nur die Benutzerrechte des aktuell am Rechner angemeldeten Users. Ich habe in den zahlreichen Links (siehe unten) gelesen, dass die Rechte nach dem Logon für den aufrufenden Thread gelten...evtl. läuft das Open/Write/Close in einem anderen Thread?! Wie könnte man das ändern? Die cmd.exe läuft ja vermutlich auch in einem anderen Thread, das Verhalten ist ja ähnlich. Im letzten der Links ist ein Beispiel (C++), da wird meiner Ansicht nach auch nichts anderes gemacht. https://msdn.microsoft.com/en-us/library/windows/desktop/aa378184%28v=vs.85%29.aspx https://msdn.microsoft.com/en-us/library/windows/desktop/aa378612%28v=vs.85%29.aspx https://msdn.microsoft.com/en-us/library/windows/desktop/aa446616%28v=vs.85%29.aspx https://msdn.microsoft.com/en-us/library/windows/desktop/aa379572%28v=vs.85%29.aspx http://www.codeproject.com/Articles/21050/Security-User-Impersonation Ideen? Gruß Achim [attachment=51925] RE: UserImpersonation / advapi32.dll - Achim - 28.01.2015 11:23 Ergänzung: Die Logon Types könnten evtl. falsch bezeichnet sein, es gibt da ne Liste, das ist 2 = Interactive und 3 = Network http://www.windowsecurity.com/articles-tutorials/misc_network_security/Logon-Types.html Schade das hier keine Zahlenwerte für die Enum-Einträge angegeben sind: https://msdn.microsoft.com/en-us/library/windows/desktop/aa378184%28v=vs.85%29.aspx A. RE: UserImpersonation / advapi32.dll - rolfk - 28.01.2015 14:11 (28.01.2015 09:35 )Achim schrieb: Hallo, Grundsätzlich ist LabVIEW multithreading und VIs werden in einem von vielen möglichen Threads ausgeführt, auch verschiedene Teile eines Diagrams in unterschiedlichen Threads. Es gibt ein paar Methoden um bestimmte Threadausführung zu erzwingen in LabVIEW. 1) UI Thread: Das ist ein spezielles Subsystem in LabVIEW in dem nur ein einziger Thread besteht. Du kannst ein VI so konfigurieren dass es in diesem Thread läuft. Daneben führt LabVIEW verschiedene Interaktionen mit dem Betriebssystem in diesem Thread aus, so etwa die Messagepump die dafür sorgt dass Keyboard, Mouse und andere Events vom Betriebsystem empfangen werden, aber auch alles was mit grafischer Ausgabe (deshalb UI Thread) zu tun hat. Wenn Du dann die Impersonatelogik und den Filezugriff in so einem VI hast, wird das alles im selben Thread ausgeführt. Du solltest aber aufpassen dass Du keine VIs in diesem Thread ausführen lässt die lang dauernde oder blockierende Aufrufe ins Betriebssystem machen, ansonsten kan die Maschine blockiert erscheinen, weil LabVIEW auch keine Events verarbeiten und keinen Bildschirmaufbau mehr machen kann. 2) Ein VI das als Subroutine konfiguriert wird, wird ebenfalls als Ganzes im selben Thread ausgeführt, aber dann nicht unbedingt im UI Thread. Auch hier gilt, wenn auch etwas abgeschwächt, keine langdauernden oder blockierenden Aufrufe in so einem VI machen oder das System kann aufgehängt erscheinen. 3) Last but not least alles in eine C(++) Funktion auslagern. Die C Funktion wird von LabVIEW aus in einem der verfügbaren Threads ausgeführt aber bleibt für die gesamte Dauer in diesem Thread bis sie die Kontrolle an LabVIEW zurückgibt indem die Funktion zum Aufrufer zurückkehrt. Was die Zahlenwerte von "Enums" (meist nicht wirklich enums sondern einfach #defines) angeht, ich habe dazu das Windows SDK installiert und benütze Notepad++ um das entsprechende Include Directory nach diesen defines suchen zu lassen. Das ist ohnehin die authoritive Quelle, MSDN ist nicht immer korrekt auch wenn die Information manchmal drinsteht. RE: UserImpersonation / advapi32.dll - Achim - 28.01.2015 15:27 (28.01.2015 14:11 )rolfk schrieb: Grundsätzlich ist LabVIEW multithreading und VIs werden in einem von vielen möglichen Threads ausgeführt, auch verschiedene Teile eines Diagrams in unterschiedlichen Threads. Es gibt ein paar Methoden um bestimmte Threadausführung zu erzwingen in LabVIEW. STRIKE! Vielen Dank, Rolf! Ich hab gehofft das du mir da helfen kannst, und so isses gekommen! Die anderen Vorschläge hab ich nicht getestet. Das auslagern in ne DLL hab ich auch schon ins Auge gefasst, weil es bei uns z.b. unter VB einwandfrei gelaufen ist. Aber das ist nicht so meine Welt... (28.01.2015 14:11 )rolfk schrieb: Was die Zahlenwerte von "Enums" (meist nicht wirklich enums sondern einfach #defines) angeht, ich habe dazu das Windows SDK installiert und benütze Notepad++ um das entsprechende Include Directory nach diesen defines suchen zu lassen. Das ist ohnehin die authoritive Quelle, MSDN ist nicht immer korrekt auch wenn die Information manchmal drinsteht. Hm...kannst du mir die tatsächlichen/korrekten Werte aus der advapi32 irgenwie raussuchen? Als Referenz, sozusagen, für meine Doku. Gruß Achim RE: UserImpersonation / advapi32.dll - rolfk - 28.01.2015 16:50 (28.01.2015 15:27 )Achim schrieb: Hm...kannst du mir die tatsächlichen/korrekten Werte aus der advapi32 irgenwie raussuchen? Als Referenz, sozusagen, für meine Doku. Naja, weil ich weiss dass die Installation des SDKs nicht gerade eine kleine Angelegenheit ist hier ausnahmsweise : #define LOGON32_LOGON_INTERACTIVE 2 #define LOGON32_LOGON_NETWORK 3 #define LOGON32_LOGON_BATCH 4 #define LOGON32_LOGON_SERVICE 5 #define LOGON32_LOGON_UNLOCK 7 #if(_WIN32_WINNT >= 0x0500) #define LOGON32_LOGON_NETWORK_CLEARTEXT 8 #define LOGON32_LOGON_NEW_CREDENTIALS 9 #endif // (_WIN32_WINNT >= 0x0500) Die letzten zwei in der >= 0x0500 Kondition bedeutet dass die nur unter Windows >= XP vorhanden ist, also heutzutage unter jeder noch vernünftigen Windows Installation. RE: UserImpersonation / advapi32.dll - Achim - 30.01.2015 09:12 (28.01.2015 16:50 )rolfk schrieb: Naja, weil ich weiss dass die Installation des SDKs nicht gerade eine kleine Angelegenheit ist hier ausnahmsweise : THANXALOT! |