Ich habe ein wenig recherchiert und bin nur etwas weiter. Zumindest bei der
Jwscl-Variante muss das UserToken wohl erst konvertiert werden.
Ich vermute, das müsste so gehen:
Delphi-Quellcode:
var UserToken: TJwSecurityToken;
UserToken := TJwSecurityToken.CreateTokenByProcessId(ProcessId, MAXIMUM_ALLOWED);
UserToken.ConvertToImpersonatedToken(SecurityImpersonation, MAXIMUM_ALLOWED); //<-NEU
bAdmin := UserInGroup(DOMAIN_ALIAS_RID_ADMINS, UserToken.TokenHandle);
Zumindest wirft das keine
Exception mehr. CheckTokenMembership schließt aber anschließend mit IsMember=False ab (was nicht stimmt).
Also entweder meine Konvertierung ist falsch oder es liegt noch wo anders dran.
In der zweiten Variante weiß ich nicht, wie ich das UserTokenHandle konvertieren könnte...
Edit1: Das beschriebene Ergebnis ist aus dem Service heraus (so wie ich es letztlich brauche)! Beim Test aus der Desktopanwendung scheint es zu funktionieren. Was muss man denn im Service anders machen?
Edit2: Für die zweite Variante wäre das wohl:
Delphi-Quellcode:
if not OpenProcessToken(hProcessHandle, TOKEN_ALL_ACCESS, hUserToken) then
RaiseLastOSError;
try
if not DuplicateToken(hUserToken, SecurityIdentification, @hUserTokenDuplicate) then //<-NEU
RaiseLastOSError;
try
bAdmin := UserInGroup(DOMAIN_ALIAS_RID_ADMINS, hUserTokenDuplicate);
Aber das hat das gleiche Resultat wie der zuvor beschriebene
Jwscl-Versuch: Das Ergebnis ist IsMember=False, was nicht stimmt, da das ProcessHandle von einer Anwendung stammt, die in einem Administrator-Account gestartet wurde.
Was stimmt denn da nicht? :'(