INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Dieses Thema hat akzeptierte Lösungen:

UserImpersonation / advapi32.dll



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

28.01.2015, 09:35
Beitrag #1

Achim Offline
*****
*****


Beiträge: 4.222
Registriert seit: Nov 2005

20xx
2000
EN

978xx
Deutschland
UserImpersonation / advapi32.dll
Hallo,

ich habe aktuell ein Problem, an dem ich mir die Zähne ausbeisse...Grrr

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...85%29.aspx
https://msdn.microsoft.com/en-us/library...85%29.aspx
https://msdn.microsoft.com/en-us/library...85%29.aspx
https://msdn.microsoft.com/en-us/library...85%29.aspx
http://www.codeproject.com/Articles/2105...ersonation

Ideen?

Gruß
Achim

14.0 .vi  Logon_Test.vi (Größe: 38,6 KB / Downloads: 220)

"Is there some mightier sage, of whom we have yet to learn?"

"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
28.01.2015, 11:23
Beitrag #2

Achim Offline
*****
*****


Beiträge: 4.222
Registriert seit: Nov 2005

20xx
2000
EN

978xx
Deutschland
RE: UserImpersonation / advapi32.dll
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-t...Types.html

Schade das hier keine Zahlenwerte für die Enum-Einträge angegeben sind:
https://msdn.microsoft.com/en-us/library...85%29.aspx

A.

"Is there some mightier sage, of whom we have yet to learn?"

"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.01.2015, 14:11 (Dieser Beitrag wurde zuletzt bearbeitet: 28.01.2015 14:17 von rolfk.)
Beitrag #3

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: UserImpersonation / advapi32.dll

Akzeptierte Lösung

(28.01.2015 09:35 )Achim schrieb:  Hallo,

ich habe aktuell ein Problem, an dem ich mir die Zähne ausbeisse...Grrr

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...85%29.aspx
https://msdn.microsoft.com/en-us/library...85%29.aspx
https://msdn.microsoft.com/en-us/library...85%29.aspx
https://msdn.microsoft.com/en-us/library...85%29.aspx
http://www.codeproject.com/Articles/2105...ersonation

Ideen?

Gruß
Achim

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.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.01.2015, 15:27 (Dieser Beitrag wurde zuletzt bearbeitet: 28.01.2015 15:31 von Achim.)
Beitrag #4

Achim Offline
*****
*****


Beiträge: 4.222
Registriert seit: Nov 2005

20xx
2000
EN

978xx
Deutschland
RE: UserImpersonation / advapi32.dll
(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.

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.

STRIKE!Rofl2ThanxYourockGuru1

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

"Is there some mightier sage, of whom we have yet to learn?"

"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.01.2015, 16:50
Beitrag #5

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: UserImpersonation / advapi32.dll
(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 Big Grin :

#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.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30.01.2015, 09:12
Beitrag #6

Achim Offline
*****
*****


Beiträge: 4.222
Registriert seit: Nov 2005

20xx
2000
EN

978xx
Deutschland
RE: UserImpersonation / advapi32.dll
(28.01.2015 16:50 )rolfk schrieb:  Naja, weil ich weiss dass die Installation des SDKs nicht gerade eine kleine Angelegenheit ist hier ausnahmsweise Big Grin :

Hopper THANXALOT!Metal

"Is there some mightier sage, of whom we have yet to learn?"

"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
Antwort schreiben 


Gehe zu: