如何在win7实现自动启动

幽游闭关 2012-04-17 11:18:53
一个带界面的MFC应用程序
安装目录在C:\Program Files\

1. 之前涉及到读写本地配置文件,win7的UAC策略保护了该目录,只能读,不能写,最终只能把配置文件写到别处
问题:该目录下新建文件夹是可以的,然后可以往新建文件夹里写文件,这样删除的时候会不会有权限问题。
现在主流的软件是怎么实现的(QQ,迅雷等)


2. 程序想实现开机自动启动,我用RegSetValueEx函数写注册表,xp下没问题,win7下返回5,5=Access Denied
应该是没有权限,右键【管理员权限运行】就OK。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

问题:win7下注册表是不是也受保护了,那么主流的软件又是怎么实现的呢
另: 我用inno setup打包程序候写注册表就能写进去,难道打包程序就能自动取得管理员权限了么


2个问题,其实都是win7权限问题,goole啥的翻了个遍,没有满意答案,望高人指点之。
...全文
931 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
EchoAm3 2014-09-04
  • 打赏
  • 举报
回复
1,我觉的win7 的权限是用户使用的时候会降低是用权限,然后就问你要不要提权限,,。这个问题:在“计算机配置”-“Windows 配置”-“安全设置”-“本地策略”-“安全选项”下:修改“用户帐户控制: 在管理审批模式下管理员的提升提示行为”选项为“不提示,直接提升”就不会再弹出提示框了搜索。 如果你是administrator 应该不会出现类似情况。。 2,然后,关于自动启动程序问题,win7在控制面板有个 任务计划程序。(win8 在控制面板的系统安全里面有 任务计划程序),这里启动也很简答。。。希望对你有用~
fly4free 2012-04-23
  • 打赏
  • 举报
回复
VirtualStore …………oh, my god...
Lactoferrin 2012-04-23
  • 打赏
  • 举报
回复
说了好几次要把配置文件写到用户专用目录
Lactoferrin 2012-04-23
  • 打赏
  • 举报
回复
virtualstore是给不会用uac的程序员和旧程序准备的,新程序应该把配置文件存档在%apppath%
幽游闭关 2012-04-23
  • 打赏
  • 举报
回复
对windows那套还是了解的太少了

上周5在win7下又碰到个问题
我明明读取指定安装目录下(C:\Program Files\)配置文件,但读出来的内容就不对,把应用程序放在其它位置又是对的,怎么都找不出问题,又赶时间,那个着急啊。
后来傻瓜式的收索了一遍C盘目录,发现读的是C:Users\xxx\AppData\Local\VirtualStore
下的配置文件(前一个版本的配置文件,安装的是同一个目录)
整了半天,又是win7的权限问题,我一直以为只有写的时候才会有权限问题
原来读的时候也有,因为我的客户端程序不是管理员权限,它竟然会去读VirtualStore 这个重定向后的文件(C:\Program Files\目录受UAC保护了)。而我把客户端程序放在其他盘时,就没有这问题了。

这么说的话,我是不是应该直接把配置问题什么的写到用户目录下面去
有没有直接对VirtualStore 这个目录进行读写的
fly4free 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]
一定要遵循特权最小化原则,不要动不动就管理员,all access
[/Quote]
估计这得需要对 权限种类、所要进行的操作api、自己想要做什么相当熟悉才能用的自如吧。
Lactoferrin 2012-04-19
  • 打赏
  • 举报
回复
一定要遵循特权最小化原则,不要动不动就管理员,all access
Lactoferrin 2012-04-19
  • 打赏
  • 举报
回复
dacl可能拒绝all access中其他的access
幽游闭关 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]
引用 15 楼 的回复:
KEY_QUERY_VALUE换成
KEY_QUERY_VALUE|KEY_SET_VALUE


可以了,多谢兄弟!
这里用KEY_ALL_ACCESS不知道是否可以,按理是应该可以的
但之前在读注册表串口值时,用KEY_ALL_ACCESS竟然不可以,改为KEY_QUERY_VALUE就可以了,不太明白为什么
[/Quote]

补充下,xp下都OK的,win7下才有这问题
幽游闭关 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
KEY_QUERY_VALUE换成
KEY_QUERY_VALUE|KEY_SET_VALUE
[/Quote]

可以了,多谢兄弟!
这里用KEY_ALL_ACCESS不知道是否可以,按理是应该可以的
但之前在读注册表串口值时,用KEY_ALL_ACCESS竟然不可以,改为KEY_QUERY_VALUE就可以了,不太明白为什么
chayedanwc 2012-04-18
  • 打赏
  • 举报
回复
安装在programe file其实是没有问题的,但是配置文件的目录不要放在programe file下。
正规的配置文件和临时文件的存放目录应该是“C:\Users\xxxxx(用户名)\AppData\Roaming”,你可以发现你安装的第三方应用程序的配置文件一般是在这里。

另外关于注册表,如果不想关闭UAC的话,你不应该使用Loaca Machine根键,应该使用Current User根键。
fly4free 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
迅雷也会弹出UAC的确认框啊
[/Quote]

如果我是用户,我认为这种情况很好。它有提醒。
说到这个,我想起目前我家里使用的 金山毒霸2012,网上下载的压缩文件,在要解压的时候弹出个提示是否确认对话框,难道xxx.rar/zip被解压的过程也会执行包内的危害性脚本?有那种脚本?

又不是.exe等文件。。这世界变化太快了?还是金山毒霸多此一举?
Lactoferrin 2012-04-18
  • 打赏
  • 举报
回复
KEY_QUERY_VALUE换成
KEY_QUERY_VALUE|KEY_SET_VALUE
幽游闭关 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
那估计是你的代码有问题
[/Quote]
就是下面的代码,XP下没有问题的。


//设置传输协议(TCP/UDP)
const char * cRegistryEntryProtocol = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\";

BOOL CRegistry::SetProtocol(const char* inProtocol)
{
const long cMaxLength = 1024;
BYTE protocolData[cMaxLength];
DWORD actualLength = 0;

memset(protocolData, 0, cMaxLength);
// 生成Filter信息注册部分的注册表入口
HKEY hKey = NULL;
LONG result = ::RegOpenKeyEx(HKEY_CURRENT_USER, cRegistryEntryProtocol, 0, KEY_QUERY_VALUE, &hKey);
BOOL pass = (result == ERROR_SUCCESS);
if (pass)
{
// 读取protocol的值
actualLength = cMaxLength;
result = ::RegQueryValueEx(hKey, "3GWaSuTV", NULL, NULL, protocolData, &actualLength);
pass = (result == ERROR_SUCCESS);
}
if (pass)
{
if (strcmp((const char*)protocolData, inProtocol) != 0)
{
// 修改protocol部分,然后写回到注册表
//result = ::RegSetValueEx(hKey, "3GWaSuTV", NULL, REG_SZ, (const BYTE*)inProtocol, actualLength);
result = ::RegSetValueEx(hKey, "3GWaSuTV", NULL, REG_SZ, (const BYTE*)inProtocol, actualLength);
pass = (result == ERROR_SUCCESS);
}
}
if (hKey)
{
::RegCloseKey(hKey);
}

return pass;
}
Lactoferrin 2012-04-18
  • 打赏
  • 举报
回复
那估计是你的代码有问题
幽游闭关 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
安装在programe file其实是没有问题的,但是配置文件的目录不要放在programe file下。
正规的配置文件和临时文件的存放目录应该是“C:\Users\xxxxx(用户名)\AppData\Roaming”,你可以发现你安装的第三方应用程序的配置文件一般是在这里。

另外关于注册表,如果不想关闭UAC的话,你不应该使用Loaca Machine根键,应该使用Current U……
[/Quote]

经测试
HKCU也没有权限写
幽游闭关 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
1. 之前涉及到读写本地配置文件,win7的UAC策略保护了该目录,只能读,不能写,最终只能把配置文件写到别处
问题:该目录下新建文件夹是可以的,然后可以往新建文件夹里写文件,这样删除的时候会不会有权限问题。
现在主流的软件是怎么实现的(QQ,迅雷等)

不要往programfiles里写,qq迅雷都是往appdata,我的文档这样的目录写

开机启动只在设置时写一次,或者放在HK……
[/Quote]

HKCU没受保护么?我去试试看
但是这里能设置自动启动么
sj720618 2012-04-17
  • 打赏
  • 举报
回复
迅雷也会弹出UAC的确认框啊
oyljerry 2012-04-17
  • 打赏
  • 举报
回复
这个没什么办法,wIN7加强了安全限制。
要么换目录,%UserProfile%目录,HKCU注册表等
或者做一个service,需要权限的工作都交给service来做
Lactoferrin 2012-04-17
  • 打赏
  • 举报
回复
1. 之前涉及到读写本地配置文件,win7的UAC策略保护了该目录,只能读,不能写,最终只能把配置文件写到别处
问题:该目录下新建文件夹是可以的,然后可以往新建文件夹里写文件,这样删除的时候会不会有权限问题。
现在主流的软件是怎么实现的(QQ,迅雷等)

不要往programfiles里写,qq迅雷都是往appdata,我的文档这样的目录写

开机启动只在设置时写一次,或者放在HKEY_CURRENT_USER里面
加载更多回复(5)

2,644

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧