以用户身份运行时访问映射驱动器

时间:2015-04-29 01:05:12

标签: c#

我有一个运行Elevated的程序。从这个程序中我启动了其他可执行文件。

现在默认情况下,我创建的任何进程都将运行Elevated。因此,对于它运行的某些程序,我希望它们像没有提升一样运行,作为登录的标准用户。

主要的Elevated程序在登录用户的用户帐户下运行。

所以这就是我试过的

var psi = new ProcessStartInfo(Exe.GetExePath());
psi.UseShellExecute = false;
psi.RedirectStandardError = false;
psi.RedirectStandardInput = false;
psi.RedirectStandardOutput = false;
psi.WorkingDirectory = Exe.Version.GetInstallPath();
if(Exe.Elevated == false)
{
    psi.UserName = Global.Username;
    var pass = new SecureString();
    Global.Password.ToCharArray().ToList().ForEach(p => pass.AppendChar(p));
    psi.Password = pass;
}
Process = Process.Start(psi);

这样可行,因为在启动的程序中没有提升。但是,由于某些奇怪的原因,它在那时失去了对所有映射网络驱动器的访问权限。

我甚至尝试在启动的应用程序中执行此类Impersonating a Windows user之类的操作,但它也无法正常工作。

所以我想我想知道,如何获得对这些映射驱动器的访问权限(所有应用程序都在正确的用户下运行)。

1 个答案:

答案 0 :(得分:0)

默认情况下,UAC行为,提升的进程在不同的安全上下文上运行,因此它不应该能够访问任何映射的驱动器,对于从该进程生成的任何进程也是如此。您可以通过在Windows中运行提升的命令提示符来测试它;默认情况下,您无权访问未提升会话的映射驱动器。

有关此行为和可能的解决方法的更多详细信息,请参阅这些superuser questions。(更改映射的驱动器设置,全局注册表更改等)。

如果不能更改UAC默认值或映射创建,可能的(虽然很复杂)解决方法可能是在没有提升的情况下启动应用程序,等待需要提升的代码启动第二个提升的进程,然后回调到原始进程(在带有映射驱动器的安全上下文中运行的进程)使用选择的IPC方法(例如带有named pipes的WCF)实际启动新应用程序。)