Process.Start在哪个用户帐户下启动?

时间:2013-02-06 14:08:30

标签: c# service process

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

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

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

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

如果我将其关闭并再次启动,则会收到以下错误消息:

  

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

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

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

4 个答案:

答案 0 :(得分:1)

是的,应用程序将在没有提升访问ProgramData和其他敏感系统文件夹或用户相关文件夹所需的权限的情况下运行。

您在应用程序中生成的任何进程will inherit您的应用程序拥有的权限。

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

答案 1 :(得分:1)

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

您可以通过ProcessStartInfo

检查此管理凭据
var startInfo = new ProcessStartInfo()
            {
                WorkingDirectory = installLocation,
                FileName = fullPath,
                UserName = "Administrator",
                Password = "password"
            };

您可以绕过此操作,只需创建具有较低权限的ProgramData文件夹:

Add "Everyone" privilege to folder using C#.NET

答案 2 :(得分:1)

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

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

更改

<requestedExecutionLevel>

<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>

答案 3 :(得分:0)

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

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

您可以指定runas动词来强制显示UAC弹出窗口,以便手动提升您的衍生过程:

ProcessStartInfo startInfo = new ProcessStartInfo
{
    UseShellExecute = true,
    FileName = "cmd.exe",
    Verb = "runas"
};