在另一个用户上下文中执行代码

我的应用程序带有需要以管理员身份运行的清单,但应用程序的一部分是使用WNetAddConnection2映射驱动器,我相信由于凭据等原因,它需要在普通用户上下文中运行。有没有办法执行此操作普通用户上下文中的一些代码,无需创建单独的进程。

编辑

从我的评论到目前为止,但它不起作用。 我预计它不会因为我真的不明白我应该如何使用它。 如果我打开一个新问题,也许最好?

class Program { [DllImport("advapi32.DLL")] public static extern bool ImpersonateLoggedOnUser(IntPtr hToken); [DllImport("advapi32.DLL")] public static extern bool RevertToSelf(); static void Main(string[] args) { IntPtr phToken = IntPtr.Zero; ImpersonateLoggedOnUser(phToken); MapDrives(); RevertToSelf(); } } 

编辑

如果当前用户具有管理员权限,那么主进程将使用清单提升,在提升的代码中我想在用户非提升空间中运行命令,因为这似乎具有不同的环境变量等。我相信曾经线程启动它不能改变自己,它需要运行一个新的。

看看一个小的C#类来模拟一个用户代码项目文章。 它实现了一个IDisposable类(在使用后释放身份validation令牌)。 由于没有发布模拟令牌,我看到.NET代码泄露。

您只能为一个代码块模拟用户,该代码块将访问您需要以其他用户身份访问的网络资源。 你的代码看起来像

 using ( new Impersonator( "myUsername", "myDomainname", "myPassword" ) ) { /* code that executes under the new context */ ... } 

我希望它有所帮助。

首先,您需要获取要启动应用程序的用户令牌,您可以使用WTSQueryUserToken执行此操作。 如果用户尚未登录,则可以使用LogonUser Win32 API在新会话中获取新的API。 要获取计算机上的所有会话,您可以使用WTSEnumerateSessions 。

然后,一旦有了令牌,就可以使用CreateProcessAsUser或ImpersonateLoggedOnUser Win32 API。

请确保在您获得的手柄上调用CloseHandle ,这类工作特别糟糕。

我不确定这是一种在没有创建新进程的情况下执行此操作的方法,ImpersonateLoggedOnUser只能在服务中工作,而我不想提供凭据。

如果我错了,请纠正我