|
In questo articolo viene applicata la procedura descritta nell'articolo
ProcessAsSystem al processo corrente. Il
trucco consiste nell'eseguire del codice all'inizio del sorgente del programma
corrente (es. prima riga del sorgente del progetto). Il codice in questione
manderà in esecuzione un'altra istanza del processo corrente stavolta però con
l'utenza SYSTEM (utilizzando la procedura RunAsSystem) e poi, in caso di
successo, terminerà l'istanza corrente.
1. Implementazione
function RunSelfAsSystem: Boolean;
var
ProgName: array[0..260] of Char;
DesktopName: string;
atom: Integer;
outValue, codError: Cardinal;
begin
//
Result := False;
atom := GlobalFindAtom('RunSelfAsSystem_ATOM');
if atom = 0 then //l'atom non esiste
begin
//creo l'atom
atom := GlobalAddAtom('RunSelfAsSystem_ATOM');
//ricavo il nome dell'eseguibile corrente (il nome del mio programma in pratica)
GetModuleFileName(0, ProgName, SizeOf(ProgName));
//ricavo il nome del Desktop
DesktopName := 'winsta0\default';
//creo un'altra istanza del processo corrente come processo figlio di winlogon
if RunAsSystem(ProgName, PAnsiChar(DesktopName), outValue, codError) then
begin
ExitProcess(1);
end
else
begin
GlobalDeleteAtom(atom);
end;
end
else //l'atom esiste già: vuol dire che il programma è in esecuzione come system
begin
GlobalDeleteAtom(atom);
end;
Result := True;
end;
e di seguito un esempio di utilizzo
program SelfAsSystem;
uses
Forms,
uMain in 'uMain.pas' {frmMain},
uUtils in 'uUtils.pas';
{$R *.res}
begin
//questa riga consente l'esecuzione del programma corrente come SYSTEM
RunSelfAsSystem;
//
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end.
SelfAsSystem
|