【问题标题】:Access mapped drive when running as user以用户身份运行时访问映射驱动器
【发布时间】:2015-07-08 01:58:49
【问题描述】:

我有一个运行 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 的操作,但它也不起作用。

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

【问题讨论】:

  • 您的主要提升程序是 Windows 服务吗?
  • 不抱歉,正如我提到的,这两个程序都以登录用户的身份运行。只是程序被提升了。
  • 当您以提升用户身份运行“net use”时,返回的是什么?

标签: c#


【解决方案1】:

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

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

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

【讨论】:

  • 我不相信你的回答真的能回答这个问题。
  • TL/DR?我相信我在“......可能(虽然复杂)的解决方法......”之后解决了你的问题
  • 我的回答中可能缺少的事实是,一旦提升流程,映射就会丢失。没有回头路。当然,除非您以非默认行为运行 UAC(我不知道,因为您没有回答 @AutomationNation 的评论)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多