piątek, 22 marca 2013

Set Application Run As Admin

Dzisiaj potrzebowałem funkcji do ustawienia instalowanej aplikacji w tryb uruchomienia jako administrator - oto ona:


export prototype BOOL SetRunAsAdmin(STRING, BOOL);
Parametry funkcji:
  • szFile - nazwa pliku
  • bLog - czy zapisywać do logu
function BOOL SetRunAsAdmin(szFile, bLog)
#define UKEYLAYERS "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers"
#define DATA "RUNASADMIN"
string szName, sKey;
LIST listSubKeys;
number nReturn;
int i;
begin
 if (bLog) then WriteLog(0,"- Dodanie praw administratora do uruchomienia pliku: "+szFile); endif;
 
 //Przestaw rejestr na 64 bity
 if (SYSINFO.bIsWow64!=0) then REGDB_OPTIONS = REGDB_OPTIONS | REGDB_OPTION_WOW64_64KEY;  endif;
 
 szName = szFile;
 RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
 if (!RegDBKeyExist(UKEYLAYERS)) then
   if (bLog) then WriteLog(1," - brak klucza rejestru "+UKEY); endif;
   if (SYSINFO.bIsWow64!=0) then REGDB_OPTIONS = REGDB_OPTIONS & ~REGDB_OPTION_WOW64_64KEY;  endif;  
   return FALSE;
 endif;
 
 //Na istniejącym kluczu;
 listSubKeys  = ListCreate(STRINGLIST);
 nReturn = RegDBQueryKey(UKEYLAYERS, REGDB_NAMES, listSubKeys );
 if (nReturn=0) then
  if (ListCount(listSubKeys)>0) then        
   ListSetIndex(listSubKeys,LISTFIRST);
    for i=0 to ListCount(listSubKeys)-1                  
     ListCurrentString ( listSubKeys, sKey );                       
     if (sKey==szName) then
      if (bLog) then WriteLog(1," - klucz ustawien już istnieje"); endif;
      RegDBSetKeyValueEx(UKEYLAYERS, szName, REGDB_STRING, DATA, -1);
      if (SYSINFO.bIsWow64!=0) then REGDB_OPTIONS = REGDB_OPTIONS & ~REGDB_OPTION_WOW64_64KEY; endif;  
      return TRUE;        
      endif;
     
     ListSetIndex ( listSubKeys, LISTNEXT );
    endfor;  
  endif;      
 endif;
  
  //Stworz nowy
  nReturn =  RegDBSetKeyValueEx(UKEYLAYERS, szName, REGDB_STRING, DATA, -1);
  if (nReturn==0) then
   if (bLog) then WriteLog(1," - prawa administratora dodane"); endif;
   if (SYSINFO.bIsWow64!=0) then REGDB_OPTIONS = REGDB_OPTIONS & ~REGDB_OPTION_WOW64_64KEY; endif;   
   return TRUE;
  else
   if (bLog) then WriteLog(1," - nie dodano praw administratora"); endif;
   if (SYSINFO.bIsWow64!=0) then REGDB_OPTIONS = REGDB_OPTIONS & ~REGDB_OPTION_WOW64_64KEY; endif;   
   return FALSE;   
  endif;
end;

1 komentarz: