Am 29.03.2013 00:16, schrieb Robert Hartmann:
> ImpersonateLoggedOnUser kann ich nicht verwenden, denn der
> Nutzer ist auf dem Server nicht eingelogt
Mit dem Problem habe ich bei meinem (socketbasierten)
Service auch zu kᅵmpfen gehabt.
Also ohne (Pipe-)Proxies, per direkter Socket-Kommunikation...
Die ᅵber Sockets einlaufenden "Client-Jobs" enden letztlich
in einem (beliebigen) Thread aus einem serverseitigen
Worker-Threadpool.
Der Server-Listener stellt in der (keep-alive basierten)
"ClientSocket-Connect-Phase" einmalig eine Assoziation
mit dem serverseitig diese Client-Connection reprᅵsentierenden
Socket-Handle her (ᅵber eine "Connection-Pool-MemberKlasse) -
und performt dann auf Serverseite in dieser mit dem SocketHandle
assoziierten Connection-Klasse einmalig einen 'LogonUser'-API-Call
(nach ein wenig Diffie-Hellman-Ping-Pong kurz nach dem Connect).
Habe also keine andere Mᅵglichkeit gefunden, als den Client
ᅵber einen User-Dialog nochmalig sein Passwort- und den Domain-
Namen angeben zu lassen. Den aktuellen UserName bekommt man
ja per API geliefert, den aktuellen Domain-Name fᅵr einen
gegebenen clientseitigen Logon kriegt man clientseitig auch
noch raus (um den Dialog vorzubesetzen) - was bleibt, ist halt
das Passwort...
Wenn es mᅵglich ist, auf Clientseite ᅵber eine User-SID -
oder auf anderen "offiziellen Wegen" das Passwort "automatisiert"
herauszubekommen, dann wᅵrde ich das ebenfalls gern wissen, aber
das ist wohl nicht so ganz im Sinne des Erfinders... ;-)
Und fᅵr die Serverseite habe ich einfach nix anderes gefunden,
was als Alternative zum LogonUser-Call herhalten hᅵtte kᅵnnen.
Naja - ich beschreib das noch kurz zu Ende, was serverseitig
passiert - aber in den sauren Apfel der clientseitig nᅵtigen
"Passwort-Doppeleingabe" wirst Du (IMO) nicht umhin kommen.
(Es sei denn, Du ersetzt den zentralen Client-Logon-Dialog mit
was Eigenem - was ja auch irgendwo geht - unter XP noch per
GINA - und seit Vista ᅵber "Windows Credential Providers").
Also die serverseitige Connection-Klasse bleibt solange die
Socket-Connection besteht, am Leben - und hᅵlt intern dann
das einmalig per LogonUser ermittelte Logon-hToken.
Neu einlaufende Job-Pakete in diesen serverseitigen Connection-
Klassen, kleben dann an den jeweiligen Job immer das aktuelle
hToken, bevor der Job in den Worker-Threadpool ᅵbergeben wird.
Und da solch ein WorkerThread nicht "weiss", welchen Job von
welchem Client er als nᅵchstes bekommt, wird von ihm fᅵr jeden
dieser einlaufenden RPCs eine Impersonation um den Job-Call gelegt.
ImpersonateLoggedOnUser(Job.Description.hToken)
//perform the RPC
RevertToSelf
Das funktioniert in guter Performance (unterhalb 1msec -
lange nicht mehr gemessen) fᅵr jeden Job explizit.
> ImpersonateSelf kᅵnnte hilfreich sein aber wie setze ich dann
> praktisch den Wechsel zum Userkontext um?
ImpersonateSelf scheint mir ungeignet in Deinem Szenario,
da Du ja schriebst, dass Du auf Serverseite noch ᅵberhaupt
gar keine (auf spezielle Client-Accounts gemappte) Prozesse
oder Threads am Laufen hast.
Wie gesagt, anders als ᅵber LogonUser(Ex) hab ich das jedenfalls
nicht hinbekommen serverseitig - und diese Calls erfordern nunmal
eine Passwort-Angabe.
Olaf