是否可以为没有管理员权限的当前用户在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");
但是如果没有管理员权限,它也会失败。
有什么办法吗?
答案 0 :(得分:0)
如果您使用正确的路径,则修改注册表不需要管理员特权:HKCU\Software\Microsoft\Windows\CurrentVersion\Run
应该可由普通帐户写入。
注意HKEY_CURRENT_USER
与HKEY_LOCAL_MACHINE
不同-每个FOLDERID_Startup
都有一个启动程序列表,但是权限不同,并且第一个不是所有用户共享的。
或者,如果要创建快捷方式,请使用ShGetKnownFolderPath
确定目录并传递FOLDERID_Startup
。请勿尝试自行构建此路径-Ken White提供的值将在Windows的本地化版本或用户自定义其配置文件时中断。
与注册表一样,已知文件夹FOLDERID_CommonStartup
和using 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");
}
}
}
的作用相似,但权限不同,并且第一个仅影响单个用户。