使用C ++以编程方式将程序添加到启动中,而无需管理员权限

时间:2018-10-05 22:22:30

标签: c++ windows

是否可以为没有管理员权限的当前用户在C ++中添加程序以启动?

一种选择是修改注册表,但这需要管理员权限。

另一个选择是将符号链接放置到%APPDATA%\Roaming\Microsoft\Windows\Start Menu\Programs\Startup。我尝试使用filesystem library来做到这一点:

fs::create_symlink("C\\Users\\example\\myapp.exe", "C:\\Users\\example\\Documents\\myapp.lnk");

但是,除非我以管理员身份运行该应用程序,否则我会得到:Invalid Arguments: Operation not permitted

我还尝试过从c ++运行shell命令,如下所示:

system("mklink C:\\Users\\example\\myapp.exe C:\\Users\\example Documents\\myapp.lnk");

但是如果没有管理员权限,它也会失败。

有什么办法吗?

1 个答案:

答案 0 :(得分:0)

如果您使用正确的路径,则修改注册表不需要管理员特权:HKCU\Software\Microsoft\Windows\CurrentVersion\Run应该可由普通帐户写入。

注意HKEY_CURRENT_USERHKEY_LOCAL_MACHINE不同-每个FOLDERID_Startup都有一个启动程序列表,但是权限不同,并且第一个不是所有用户共享的。

或者,如果要创建快捷方式,请使用ShGetKnownFolderPath确定目录并传递FOLDERID_Startup。请勿尝试自行构建此路径-Ken White提供的值将在Windows的本地化版本或用户自定义其配置文件时中断。

与注册表一样,已知文件夹FOLDERID_CommonStartupusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IAMAGoodDeveloper { public static class Program { static void Main(string[] args) { programStart(); } private static void programStart() { var myFactory = new MyFactory(); var secretsProvider = myFactory.GenerateKeyProvider(); const int cert = secretsProvider.GetKey("arg"); } } } 的作用相似,但权限不同,并且第一个仅影响单个用户。