2010-06-04 65 views
7

我有一个应用程序需要以管理员身份运行,但应用程序的一部分是使用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(); 
    } 
} 

EDIT

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

+0

来获得当前用户的身份验证令牌的方式是通过WindowsIdentity.GetCurrent()。令牌。不过,我认为在你的情况下,它会返回管理员用户的令牌(因为你的应用程序以管理员身份运行)。 – 2010-06-04 18:52:55

+0

这是模仿。一个非常方便的[nuget包](https://www.nuget.org/packages/SimpleImpersonation/2.0.0)和[相关帖子](https://stackoverflow.com/a/7250145/465053)来实现通过'LogonUser()'p/invoke调用相同。 – RBT 2017-07-06 10:25:17

回答

0

我不确定这是一种不创建新进程的方式,ImpersonateLoggedOnUser只能从一个服务中工作,而我不想提供凭据。

纠正我,如果我错了

+0

如何在不提供凭证的情况下模拟用户?我的意思是你想只提供用户名?还有什么? – 2010-06-04 18:44:02

+0

如果当前用户具有管理员权限,那么主进程将通过清单提升,在这个提升的代码中,我想在用户未升级的空间中运行命令,因为这看起来有不同的环境变量等。我相信一次一个线程启动它不能改变它自己,它需要运行一个新的 – 2010-06-11 16:00:10

+0

这是你如何做进程模拟。一个非常方便的[nuget包](https://www.nuget.org/packages/SimpleImpersonation/2.0.0)和[相关帖子](https://stackoverflow.com/a/7250145/465053)来实现通过'LogonUser()'p/invoke调用相同。 – RBT 2017-07-06 10:26:33

1

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

然后,一旦你有令牌,你可以使用CreateProcessAsUser或其他ImpersonateLoggedOnUser Win32 APIs。

请确保在您获得的手柄上拨打CloseHandle,这对于此类工作来说尤其严重。

+0

完成后请不要忘记提及调用CloseHandle函数以使用LogonUser函数返回的令牌。如果你不这样做,你可以有一个操作系统级别的处理泄漏。我以前见过这种情况。 – 2010-06-04 13:17:36

+0

@卡洛斯:同样他们也是特别糟糕的泄漏。我加了一个评论。 – 2010-06-04 13:19:31

+0

Arent都使用CreateProcessAsUser和ImpersonateLoggedOnUser创建具有不同凭据的新线程?我如何让WNetAddConnections2在这个新过程中运行? – 2010-06-04 13:31:09

4

看看A small C# Class for impersonating a User代码项目文章。它实现了一个IDisposable类(在使用后释放身份验证令牌)。由于未发布模拟令牌,我已经看到.NET代码泄漏。

您可以模拟一个用户只为一个代码块,它将访问您需要以不同的用户身份访问的网络资源。您的代码看起来像

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

我希望它有帮助。

相关问题