2

我以管理员身份在机器上运行,但 UAC 设置为默认模式。

我启动了一个安装程序(使用“以管理员身份运行”)。从安装过程(使用 Wix)开始,我启动了一个客户端程序,该程序在光盘上创建了一些文件(C:\ProgramData...)。

var startInfo = new ProcessStartInfo()
            {
                WorkingDirectory = installLocation,
                FileName = fullPath
            };
Process.Start(startInfo);

程序第一次运行时,我可以毫无问题地访问存储在本地磁盘上的所有数据。

如果我关闭它并重新启动它,我会收到以下错误消息:

拒绝访问路径“C:\ProgramData...”。

如果我使用“以管理员身份运行”再次启动应用程序,我可以从本地磁盘访问文件;这次没有错误。只有当我直接启动应用程序时才会出现访问路径错误。

这是由于 UAC 的设置,还是与在更具特权的用户帐户下创建的本地文件有关?

4

4 回答 4

1

是的,应用程序无需提升权限即可运行,这些权限是访问 ProgramData 和其他敏感系统文件夹或用户相关文件夹所需的权限。

您从应用程序中生成的任何进程都will inherit具有您的应用程序所拥有的权限。

您需要为您的应用程序创建一个清单,以便在启动时请求提升的权限,以便您可以访问这些文件夹。

于 2013-02-06T14:13:10.073 回答
1

是的,正如您所说,本地文件是在更有特权的用户帐户下创建的。

您可以通过以下方式检查此通过管理员凭据ProcessStartInfo

var startInfo = new ProcessStartInfo()
            {
                WorkingDirectory = installLocation,
                FileName = fullPath,
                UserName = "Administrator",
                Password = "password"
            };

您可以绕过这个简单地创建具有较低权限的 ProgramData 文件夹:

使用 C#.NET 将“所有人”权限添加到文件夹

于 2013-02-06T14:16:44.707 回答
1

或者您可以强制应用程序必须以管理员权限启动..

项目 - 添加新项目 - “应用程序清单文件”。

改变

<requestedExecutionLevel>

<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
于 2013-02-06T14:49:48.553 回答
0

当启动一个新进程时,它会继承当前进程的权限。

因此,如果您的进程被提升,则创建的进程也会被提升。第二次运行程序时,如果它没有被提升,则生成的进程也不会被提升。

您可以指定runas动词来强制显示 UAC 弹出窗口,该弹出窗口将允许手动提升您生成的进程:

ProcessStartInfo startInfo = new ProcessStartInfo
{
    UseShellExecute = true,
    FileName = "cmd.exe",
    Verb = "runas"
};
于 2013-02-06T14:24:10.797 回答