我以管理员身份在计算机上运行,但UAC设置为默认模式。
我启动安装程序(使用“以管理员身份运行”)。从安装过程(使用Wix)我启动一个客户端程序,在光盘上创建一些文件(C:\ ProgramData ...)。
var startInfo = new ProcessStartInfo()
{
WorkingDirectory = installLocation,
FileName = fullPath
};
Process.Start(startInfo);
程序第一次运行时,我可以毫无问题地访问存储在本地光盘上的所有数据。
如果我将其关闭并再次启动,则会收到以下错误消息:
拒绝访问路径'C:\ ProgramData ...'。
如果我使用“以管理员身份运行”重新启动应用程序,我可以从本地光盘访问文件;这次没有错误。仅当我直接启动应用程序时才会出现访问路径错误。
这是由于UAC的设置还是与更高权限的用户帐户下创建的本地文件有关?
答案 0 :(得分:1)
是的,应用程序将在没有提升访问ProgramData和其他敏感系统文件夹或用户相关文件夹所需的权限的情况下运行。
您在应用程序中生成的任何进程will inherit
您的应用程序拥有的权限。
您需要为应用程序创建一个清单,以便在启动时请求提升权限,以便您可以访问这些文件夹。
答案 1 :(得分:1)
是的,正如您所说,本地文件是在更高权限的用户帐户下创建的。
您可以通过ProcessStartInfo
var startInfo = new ProcessStartInfo()
{
WorkingDirectory = installLocation,
FileName = fullPath,
UserName = "Administrator",
Password = "password"
};
您可以绕过此操作,只需创建具有较低权限的ProgramData文件夹:
答案 2 :(得分:1)
或者您可以强制必须以管理员权限启动应用程序..
项目 - 添加新项目 - “应用程序清单文件”。
更改
<requestedExecutionLevel>
到
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
答案 3 :(得分:0)
启动新进程时,它会继承当前进程的权限。
因此,如果您的流程已升级,则创建的流程也会提升。第二次运行程序时,如果程序没有提升,则生成的进程也不会。
您可以指定runas
动词来强制显示UAC弹出窗口,以便手动提升您的衍生过程:
ProcessStartInfo startInfo = new ProcessStartInfo
{
UseShellExecute = true,
FileName = "cmd.exe",
Verb = "runas"
};