I am using the following code to try to make a RunOnce entry:
program RunOnceTest;
{$APPTYPE CONSOLE}
uses
SysUtils, Registry, Windows;
var
R: TRegistry;
begin
try
WriteLn('Testing RunOnStartup.......'开发者_JAVA技巧);
R := TRegistry.Create;
try
R.RootKey := HKEY_LOCAL_MACHINE;
R.LazyWrite := False;
R.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce', True) ;
R.WriteString('this', 'that') ;
R.CloseKey;
finally
R.free;
end;
WriteLn('Test Finished');
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
I run the app, and it executes.
However, there is no entry at:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
in my registry. Do I need administrator privileges? What else do I need to do?
ADDED: I should explain better and really ask a question about what I am trying to do. I am trying to get my app to run automatically at startup. Lot's of applications do this without appearing to require admin privileges. What is the normal way to do this?
First of all you need to have admin rights to write there. Mostly it's just installers that write to this key and they generally run elevated. Add this to your application manifest if that's the way you want to go:
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
If this write to HKLM
is being made from an application that doesn't otherwise need elevation then please consider separating out the write to HKLM
into a separate process so that only that registry key write needs elevation. This is best practise with UAC.
The other thing that might bite you is that your Delphi app will be 32 bit and so subject to registry redirection. Accesses of HKLM\Software
will get redirected to HKLM\Software\Wow6432Node
.
On a 64 bit system I think you should endeavour to write to HKLM\Software
and so you'll need to disable redirection. Do this by including KEY_WOW64_64KEY
in the Access
property of your TRegistry
instance.
Windows will merge both views of the registry when it processes Run
and RunOnce
keys but your application will leave clearer trails if you write to the 64 bit area of the registry for this particular key.
Yes, administrator privileges are required to modify HKEY_LOCAL_MACHINE.
Three possibilities:
- Don't use that key and find another way.
- Read here. An app manifest might be the way to go (section "Marking Required Privileges Using an Application Manifest"). This will ask the user for consent when he starts the app. That's the easy way.
- Let the user run your application without admin privileges and put the code requiring them in another executable. Run this on demand and only if the user requested it. That's the preferable way.
Edit for the added part:
Have you tried using HKEY_CURRENT_USER instead? This runs the app for the current user only but you don't need to have admin privileges to write to the registry.
精彩评论