我有我的程序的部分需要pipe理访问(影响所有用户的设置,存储在HKLM,并限于pipe理访问)。
我已经改变了我的软件,以表明海拔是必需的:

作为回应,我将在提示升级时启动我的可执行文件:
SHELLEXECUTEINFO shExecInfo; shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); shExecInfo.fMask = NULL; shExecInfo.hwnd = NULL; shExecInfo.lpVerb = L"runas"; shExecInfo.lpFile = L"myapp.exe"; shExecInfo.lpParameters = NULL; shExecInfo.lpDirectory = NULL; shExecInfo.nShow = SW_MAXIMIZE; shExecInfo.hInstApp = NULL; ShellExecuteEx(&shExecInfo);
我要做的是在命令行中传递命名pipe道的名称,告诉自己可以连接到的位置,以便获得有关应该执行的操作的指示信息:
myapp.exe /uac 6C844671-E262-46DD-939E-47517F105FB6
(是的,使用GUID作为pipe道的名称)。
通过这个pipe道,我会告诉我的提升克隆什么数据库,例如:
我担心的是,任何人都可以启动myapp.exe ,然后提供各种请求 – 我不希望它做的事情,因为我没有启动它,例如:
MaliciousProgram.exe :
ShellExecute("myapp.exe /uac HahaYouDoWhatISayNow")
我记得在Longhorntesting版中,有一个Channel9video,或者一篇文章,谈论UAC和IPC(进程间通信)错误的危险。
我不想重新发明轮子,犯了已经解决的安全错误。 但我无法find任何现有的指导,以“ 正确 ”的方式来做与UAC海拔IPC。
他接受了什么样的模式来与IPC进行沟通,以形成一个临时boost的行为,
编辑: uac和ipc标签的联合追随者:53
我不相信这里有一个安全问题(有一些注意事项,如下所述)。 如果用户不能提升,这个解决方案将无法正常工作。 如果用户可以提升并且是恶意的,那么机器已经被盗用了。 例如,如果恶意用户想要对HKLM进行更改,那么为什么在注册表可用时使用myapp.exe?
但是,我提到服务器数据库,我感到困惑。 这如何符合海拔要求? 一般来说,访问远程资源不需要提升。 (如果myapp.exe或HKLM包含服务器数据库的密码,则不应该)。
至于IPC的选择:我不是UAC编程方面的专家,但是在MSDN中搜索我已经注意到提升的COM对象被多次提及,例如:
http://msdn.microsoft.com/en-us/magazine/cc163486.aspx
请参阅本文中第五个链接的PPT幻灯片:
http://msdn.microsoft.com/en-us/library/bb756996.aspx
但是,如果你对COM不满意(加入俱乐部!),那么使用你建议的命名管道应该同样有效。 但是,您需要采取通常的命名管道必要的预防措施 – 确保在启动提升的进程之前创建命名管道的服务器端,检查管道是否已经存在,并且使用适当的ACL创建。