Интересует автозагрузка программы в 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) , что программа требует права администратора . Нужен код для того , чтоб при запуске программы он требовал права администратора . Если будут права администратора , то в остальном проблем не будет . Можно с манифестом , но с описанием как его создать и вписать в проект (Если можно , то без манифеста).
проще сразу открывать нужную ветку: 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
В названии не получается . Можно по подробнее как и что прописывать в манифест , чтобы программа запрашивала разрешение ? Так же как его добавить в программу
Создаем файл 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 удаляем его, а то компилятор будет ругаться на дублирующие ресурсы
пардонте, а у меня блин m$ linux 7 видимо, что при создании манифеста тем методом, что описал постом выше, при запуске рутовые права запрашиваются, может проблема то в коде записи в реестр? %)
простой пример с использованием манифеста что выше, без проблем пишет на 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.
Если не троян, то просто пиши не в - HKEY_LOCAL_MACHINE -, а в - HKEY_CURRENT_USER и всё. Тогда не должен требовать права.