unit SimpleRights
type
TRightInfo =
record
noch ein paar Infos hier über die Rechte
end;
TOnPrivExecute =
procedure (Sender: TObject; RightsInfo : TRightsInfo; UserData : Pointer)
of object;
{Führt OnPrivExecute aus auf zwei Wegen aus:
1. Der Benutzer hat bereits die notwendigen Privilegien => OnPrivExecute wird einfach aufgerufen
2. Der Benutzer hat nicht die notwendigen Privilegien =>
Ein LoginDialog wird angezeigt und im Erfolgsfall wird OnPrivExecute aufgerufen.
}
function ExecutePrivilegedUser(Sender: TObject; OnPrivExecute : TOnPrivExecute; UserData : Pointer; <*> ForceShowLoginDlg : Boolean = false) : Boolean;
...
<*>Hier sollten weitere Parameterstrukturen rein,
die es ermöglichen anzugeben, welche Privilegien (Administrator?) nötig sind, um OnPrivExecute auszuführen.
Sowie die Dialogeinstellungen.
function ExecutePrivilegedUser(Sender: TObject; OnPrivExecute : TOnPrivExecute; UserData : Pointer; <*> ForceShowLoginDlg : Boolean = false) : Boolean;
var
AdminToken : Cardinal;
begin
hier noch überprüfen ob Benutzer genug Rechte hat
---> aber wie? vermutlich dieser link:
[
url]http:
//msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthz/security/accesscheck.asp[/url]
und ggf. den RunAsDialog (selbstgemacht) anzeigen für die Eingaben (<USERNAME,<DOMAIN>,...)
if LogonUser(PAnsiChar(<USERNAME>),
// UserName
PAnsiChar(<DOMAIN>),
// Domäne oder lokaler Rechner
PAnsiChar(<PASSWORD>),
// Password
<LOGON32_LOGON_BATCH
or LOGON32_LOGON_NETWORK
or LOGON32_LOGON_INTERACTIVE>,
<LOGON32_PROVIDER_DEFAULT>,
AdminToken)
then begin
if ImpersonateLoggedOnUser(AdminToken)
then begin
// hier kommt Dein Prog.-Code hin
try
OnPrivExecute(Sender,...,UserData);
finally
RevertToSelf;
// zurückschalten zum angemeldeten Benutzer
end;
end;
end;
end;
unit FormTest;
...
procedure TForm.OnMyPrivExecute (Sender : TObject; RightsInfo : TRightsInfo; UserData : Pointer);
begin
//hier mit anderen Rechten arbeiten
end;
procedure TForm1.ButtonClick(...)
var MyData : Pointer;
begin
MyData :=
nil;
if ExecutePrivilegedUser(Self,OnMyPrivExecute,...[benötigte Rechte],MyData)
then
//ok
else
//abbruch
end;