我有一个应用程序,其清单需要以管理员身份运行,但该应用程序的一部分是使用 WNetAddConnection2 映射驱动器,我认为由于凭据等原因,它需要在正常用户上下文中运行。有没有办法执行此操作普通用户上下文中的一些代码,无需创建单独的进程。
EDIT
从评论来看,我已经得到了这么多,但它不起作用。我预计不会,因为我不太明白应该如何使用它。也许我最好提出一个新问题?
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
如果当前用户具有管理员权限,则主进程会随清单一起提升,在提升的代码中,我想在用户非提升空间中运行命令,因为这似乎具有不同的环境变量等。我相信一旦线程启动后它无法更改自身,它需要运行一个新线程。
看看用于模拟用户的小型 C# 类 http://www.codeproject.com/KB/cs/zetaimpersonator.aspx代码项目文章。它实现了 IDisposable 类(在使用后释放身份验证令牌)。我曾见过由于未释放模拟令牌而导致 .NET 代码泄漏。
您只能为一段代码来模拟用户,该代码块将访问您需要以其他用户身份访问的网络资源。你的代码看起来像
using ( new Impersonator( "myUsername", "myDomainname", "myPassword" ) )
{
/* code that executes under the new context */
...
}
我希望它有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)