Newsgroup: it.comp.lang.delphi
Titolo: Opzioni di amministratore

Ciao a tutti,
e' possibile, da codice ovviamente, sapere se il programma e' stato 
lanciato con opzioni di amministratore ?
E, questo e' piu' complicato, e' possibile forzare un programma in 
maniera che attivi la modalita' di amministratore (ovviamente con 
inserimento di utente e password da parte dell'utente)
Grazie

 utente e password da parte dell'utente)
Mi vinene in mente che esiste una possibilitï¿œ di invocare il "runas" 
anche da delphi, cerca con google e facci sapere cosa hai trovato.
Piï¿œ in generale, il team Jedi ha creato un'API che lavora propro sulla 
ACL e compagnia bella, il progetti si chiama JWSCL.
"The JWSCL (security library) is an advanced object-oriented framework 
for programming with the Windows security features (ACL, Tokens, etc.)"
http://jedi-apilib.sourceforge.net/
 e segui i sottoprogetti
ciao
-- 
Morde

Per chi interessi ho trovato queste funzioni che sembrano funzionare:
// ---------------------------------------------------------------------
// Ritorna se il sistema operativo e' NT Based
// ---------------------------------------------------------------------
Function IsNT : Boolean;
Var
   OS : TOSVERSIONINFO;
Begin
   OS.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFO);
   GetVersionEx(OS);
   Result := (os.dwPlatformId >= VER_PLATFORM_WIN32_NT);
End;
// ---------------------------------------------------------------------
// Ritorna se l'utente corrente ha privilegi di amministratore
//
// Nota: Se IsNT e' FALSE ritorna sempre TRUE
// ---------------------------------------------------------------------
Function IsAdmin : Boolean;
Const
   SECURITY_NT_AUTHORITY       : SID_IDENTIFIER_AUTHORITY = (Value: 
(0,0,0,0,0,5));
   SECURITY_BUILTIN_DOMAIN_RID : DWORD = $00000020;
   DOMAIN_ALIAS_RID_ADMINS     : DWORD = $00000220;
   DOMAIN_ALIAS_RID_USERS      : DWORD = $00000221;
   DOMAIN_ALIAS_RID_GUESTS     : DWORD = $00000222;
   DOMAIN_ALIAS_RID_POWER_     : DWORD = $00000223;
Var
   hAccessToken       : tHandle;
   ptgGroups          : pTokenGroups;
   dwInfoBufferSize   : DWORD;
   psidAdministrators : PSID;
   int                : integer;            // counter
   blnResult          : boolean;            // return flag
begin
   If Not IsNT Then
      Begin
        Result := True;
        Exit;
      End;
   Result    := False;
   blnResult := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, 
hAccessToken);
   if (not blnResult) then
      begin
        if GetLastError = ERROR_NO_TOKEN
        then
          blnResult := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, 
hAccessToken);
      end;
   if (blnResult) then
      try
       GetMem(ptgGroups, 1024);
       blnResult := GetTokenInformation(hAccessToken, TokenGroups, 
ptgGroups, 1024, dwInfoBufferSize);
       CloseHandle( hAccessToken );
       if (blnResult) then
          begin
            AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
                                     SECURITY_BUILTIN_DOMAIN_RID,
                                     DOMAIN_ALIAS_RID_ADMINS,
         			    0, 0, 0, 0, 0, 0,
         			    psidAdministrators);
            {$R-}
            for int := 0 to ptgGroups.GroupCount - 1 do
                if EqualSid(psidAdministrators, 
ptgGroups.Groups[int].Sid) then
                   begin
                     Result := True;
                     Break;
                   end;
            {$R+}
            FreeSid( psidAdministrators );
          end;
      finally
        FreeMem( ptgGroups );
      end;
end;
// -----------------------------------------------------------------------
// Esegue un programma cambiando l'utente di default
// -----------------------------------------------------------------------
Function RunAsAdmin(hWnd : HWND; aFile : String; aParameters : String) : 
Boolean;
Var
   Sei : TShellExecuteInfoA;
Begin
   FillChar(Sei, SizeOf(Sei), 0);
   Sei.cbSize := SizeOf(Sei);
   Sei.Wnd := hWnd;
   Sei.fMask := SEE_MASK_FLAG_DDEWAIT Or SEE_MASK_FLAG_NO_UI;
   Sei.lpVerb := 'runas';
   Sei.lpFile := PChar(aFile);
   Sei.lpParameters := PChar(aParameters);
   Sei.nShow := SW_SHOWNORMAL;
   Result := ShellExecuteEx(@Sei);
End;

 inserimento di utente e password da parte dell'utente)
Per l'ultima parte, puoi utilizzare ImpersonateLoggedOnUser (con il
token che ti restituisce LogonUser, per esempio).
Il thread chiamante la funzione viene eseguito con i privilegi
dell'utente "impersonato" fino alla chiamata a RevertToSelf.
A meno che "attivare la modalità di amministratore" non si riferisca
al solo processo ma a tutto l'ambiente; come se si chiudesse la
sessione corrente e se ne aprisse una di un amministatore; in questo
caso dovresti dare un occhio a 
http://msdn.microsoft.com/en-us/library/aa374588(VS.85).aspx
Saluti
Paolo Arosio

Paolo, allora sei ancora in questo continuum temporale...!
Azz.. A volte ritornano! :-D
Bentornato a bordo, paisa'!
A.