Ich habe mich mal an CreateRestrictedToken versucht. Dank
JWSCL klappt das auch alles ganz einfach
Wenn ich damit Paint starte, darf ich nicht nach C:\Programme speichern. Daher gehe ich davon aus, dass der Rechteentzug klappt.
Eigentlich möchte ich aber den Internet Explorer (nicht den Standardbrowser) starten. Der startet auch kurz, schließt sich aber sofort wieder. Das ganze tritt auf bei Windows Vista Ultimate SP 2 + IE 8. Auf einem XP Pro SP3 + IE 8 gibt es das Problem nicht. Der XP Rechner führt den Code fehlerfrei aus. (TokenIntegrityLevelType natürlicht nicht, da auf XP nicht verfügbar)
Setze ich JwAdministratorsSID nicht auf die Liste der zu deaktivierenden SIDs, startet er normal. Aber dann hat er ja möglicherweise Adminrechte, oder?
Habe ich das RestrictedToken soweit richtig erstellt?
Delphi-Quellcode:
var
lApp: String;
lToken, lRestrictedToken: TJwSecurityToken;
lSIDs: TJwSecurityIdList;
lStartupInfo: TStartupInfo;
lProcessInfo: TProcessInformation;
...
lSIDs := TJwSecurityIdList.Create(false);
lToken := TJwSecurityToken.CreateTokenEffective(TOKEN_ALL_ACCESS);
JwInitWellKnownSIDs;
lSIDs.Add(JwAdministratorsSID); // <-- IE schließt sich sofort wieder
lSIDs.Add(JwLocalSystemSID);
lSIDs.Add(JwNetworkServiceSID);
lSIDs.Add(JwLocalServiceSID);
lSIDs.Add(JwIntegrityLabelSID[iltMedium]);
lSIDs.Add(JwIntegrityLabelSID[iltHigh]);
lSIDs.Add(JwIntegrityLabelSID[iltSystem]);
lSIDs.Add(JwIntegrityLabelSID[iltProtected]);
lRestrictedToken := TJwSecurityToken.CreateRestrictedToken(lToken.TokenHandle, TOKEN_ALL_ACCESS, DISABLE_MAX_PRIVILEGE, lSIDs, nil, nil);
lRestrictedToken.TokenIntegrityLevelType := iltLow;
ZeroMemory(@lStartupInfo, SizeOf(lStartupInfo));
ZeroMemory(@lProcessInfo, SizeOf(lProcessInfo));
lStartupInfo.cb := SizeOf(lStartupInfo);
//lApp:= 'c:\program files\Internet Explorer\iexplore.exe';
lApp:= 'c:\windows\system32\mspaint.exe';
CreateProcessAsUser(lRestrictedToken.TokenHandle, PWideChar(lApp), nil, nil, nil, false, 0, nil, nil, lStartupInfo, lProcessInfo)