我写了一个应该从Windows启动时开始的应用程序。我在HKCU \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run中的Windows注册表中添加了一个条目。已成功添加条目,但程序无法正常启动。
我在Windows 7 64位上测试了应用程序。 应用程序需要具有管理员权限才能运行,也许这就是它无法启动的原因?
我还看到条目的值不在引号中,但其他的是。这是强制性的吗?
这是我的c#代码:
var registry = Registry.CurrentUser;
var key = registry.OpenSubKey(runKeyBase, true);
key.SetValue(KEY, directory + @"\" + filename);
Registry.CurrentUser.Flush();
我怎么能让它发挥作用?
答案 0 :(得分:5)
为什么不在Startup文件夹中放置快捷方式?这样,您还可以将快捷方式的属性设置为以管理员身份运行
编辑:
导航到您要在启动时运行的exe并右键单击,创建快捷方式。
在该快捷方式的属性中,选中以管理员身份运行。
然后将其放在启动文件夹中(您可以通过单击开始菜单中文件夹上的“浏览”来实现)。这将在Windows登录时启动该应用程序。如果UAC需要批准,它将提示用户是否可以运行该程序。
答案 1 :(得分:3)
据我所知,这是由于用户访问控制设置只允许已签名的应用程序启动,否则它将要求管理员权限。
由于在启动期间,即使您已完成注册表设置,操作系统也不会运行该应用程序。
报价也不是强制性的。你可以拥有或不拥有它们。
我的方法是在Startup文件夹中放置一个快捷方式。注册表设置无效。
此外,您可以尝试将文件放在/ system32或/ windows中,然后尝试在注册表中进行设置。
答案 2 :(得分:0)
您可以在启动时自行升级程序。只需在开头执行以下代码:
public static void runAsAdmin(string[] args)
{
ProcessStartInfo proc = new ProcessStartInfo();
if (args != null)
proc.Arguments = string.Concat(args);
proc.UseShellExecute = true;
proc.WorkingDirectory = Environment.CurrentDirectory;
proc.FileName = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
proc.Verb = "runas";
bool isElevated;
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
isElevated = principal.IsInRole(WindowsBuiltInRole.Administrator);
if (!isElevated)
{
try
{
Process.Start(proc);
}
catch
{
//No Admin rights, continue without them
return;
}
//Close current process for switching to elevated one
Environment.Exit(0);
}
return;
}
获得管理员权限后,您可以在以后禁用UAC通知(如果已启用)以进行静默启动:
private void disableUAC()
{
RegistryKey regKey = null;
try
{
regKey = Registry.LocalMachine.OpenSubKey(ControlServiceResources.UAC_REG_KEY, true);
}
catch (Exception e)
{
//Error accessing registry
}
try
{
regKey.SetValue("ConsentPromptBehaviorAdmin", 0);
}
catch (Exception e)
{
//Error during Promt disabling
}
}