Администратирование и автозагрузка в Delphi

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ArchAngel212, 20 Nov 2012.

  1. ArchAngel212

    ArchAngel212 New Member

    Joined:
    18 Jun 2012
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Интересует автозагрузка программы в HKLM ветки реестра . Вот написаный мною код :
    Reg.RootKey:=HKEY_LOCAL_MACHINE;
    reg.OpenKey('Software',True);
    reg.OpenKey('Microsoft',True);
    reg.OpenKey('Windows',True);
    reg.OpenKey('CurrentVersion',True);
    reg.OpenKey('Run',True);
    reg.WriteString('project1.exe','"'+Application.Exename+'"');
    Программа на этот код выдает ошибку . Я так понял (ось Windows 7) , что программа требует права администратора . Нужен код для того , чтоб при запуске программы он требовал права администратора . Если будут права администратора , то в остальном проблем не будет . Можно с манифестом , но с описанием как его создать и вписать в проект (Если можно , то без манифеста).
     
  2. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    проще сразу открывать нужную ветку:
    Code:
    Reg.RootKey:=HKEY_LOCAL_MACHINE;
    reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
    reg.WriteString('project1.exe','"'+Application.Exename+'"');
    
    что касаемо привилегий администратора, то:
    - чего прописывать в манифест: link
    - если в названии проги содержится: *install*, *path*, *update* и подобное, точный список не знаю, то при запуске программы запрашиваются права администратора
    - проверить с какими правами запущена программа: link
     
  3. ArchAngel212

    ArchAngel212 New Member

    Joined:
    18 Jun 2012
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    В названии не получается . Можно по подробнее как и что прописывать в манифест , чтобы программа запрашивала разрешение ? Так же как его добавить в программу
     
  4. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Создаем файл 1.manifest с содержанием:
    Code:
    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    	<assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="UAC_Elevation_Prompt" type="win32" />
    [COLOR=Red]	<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    		<security>
    			<requestedPrivileges>
    				<requestedExecutionLevel level="requireAdministrator" />
    			</requestedPrivileges>
    		</security>
    	</trustInfo>[/COLOR]
    	<dependency>
    		<dependentAssembly>
    			<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="*" />
    		</dependentAssembly>
    	</dependency>
    </assembly>
    
    где обязательно наличие блока <security> с указанием требуемых привилегий администратора (requireAdministrator)
    Создаем файл manifest.rc с содержанием:
    Code:
    1 24 "1.manifest"
    
    Создаем батник createRes.bat с содержанием:
    Code:
    @echo off
    brcc32 manifest.rc
    pause
    
    кидаем все в одну папку и запускаем батник, при этом заранее убедившись, что в переменной PATH прописан путь до папки bin, где лежит компилятор ресурсов delphi (brcc32)
    Если все удачно, то создастся файл manifest.res, который подключаем к нужному проекту директивой:
    Code:
    {$R manifest.res}
    При этом, если используется WindowsXP.res удаляем его, а то компилятор будет ругаться на дублирующие ресурсы
     
  5. ArchAngel212

    ArchAngel212 New Member

    Joined:
    18 Jun 2012
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Код не работает . Повторюсь - ОСь 7
     
  6. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    пардонте, а у меня блин m$ linux 7 видимо, что при создании манифеста тем методом, что описал постом выше, при запуске рутовые права запрашиваются, может проблема то в коде записи в реестр? %)
     
  7. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    простой пример с использованием манифеста что выше, без проблем пишет на Win 7 если запущено с правами админа
    Code:
    program test;
    
    {$APPTYPE CONSOLE}
    
    //{$define reqAdmin} (* раскомментировать, если нужны права админа *)
    
    
    {$ifdef reqAdmin}
      {$R manifest.res}
    {$endif}
    
    uses
      Windows, SysUtils, Registry;
    
    type
      SC_HANDLE = THandle;
    function OpenSCManager(lpMachineName: LPCTSTR; lpDatabaseName: LPCTSTR;
      dwDesiredAccess: DWORD): SC_HANDLE; stdcall;  external advapi32 name 'OpenSCManagerA';
    function CloseServiceHandle(hSCObject: SC_HANDLE): BOOL; stdcall;  external advapi32 name 'CloseServiceHandle';
    
    const
      SC_MANAGER_ALL_ACCESS = $000F003F;
      strRigth: array[0..2] of String = ('False','True','Unknow');
    var
      g_SCManager: SC_HANDLE;
      isAdm: Byte;
      reg: TRegistry;
    begin
      g_SCManager:= OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
      if (g_SCManager <> 0) then begin
        isAdm:= 1;
        CloseServiceHandle(g_SCManager);
      end else begin
        if (GetLastError = ERROR_ACCESS_DENIED) then isAdm:= 0 else isAdm:= 2;
      end;
    
      WriteLn('Administrator rights: ', strRigth[isAdm]);
    
      if (isAdm = 1) then begin
    
        reg:= TRegistry.Create; try
    
          reg.RootKey:= HKEY_LOCAL_MACHINE;
          if reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True) then try
    
            WriteLn('Write: testWrite');
            reg.WriteString('testWrite','shutdown /r /t 10');
    
          finally
            reg.CloseKey;
          end;
        finally
          reg.Free;
        end;
      end;
    
      ReadLn;
    end.
     
  8. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    Если не троян, то просто пиши не в - HKEY_LOCAL_MACHINE -, а в - HKEY_CURRENT_USER и всё. Тогда не должен требовать права.