在.net中托管的网站如何获得网站运行的当前用户。即应用程序池用户而不是访问该站点的当前用户。
使用Windows集成和模拟。
<authentication mode="Windows"/>
<identity impersonate="true"/>
答案 0 :(得分:18)
要在托管代码中恢复为应用池用户,您可以执行以下操作:
using (WindowsIdentity.Impersonate(IntPtr.Zero))
{
//This code executes under app pool user
}
答案 1 :(得分:2)
找到解决方案。
使用RevertToSelf,您可以从线程中剥离模拟。在IIS中,这等同于App Pool用户。
一些doco
http://www.pinvoke.net/default.aspx/advapi32.reverttoself
http://msdn.microsoft.com/en-us/library/aa379317%28VS.85%29.aspx
代码
[DllImport("advapi32.dll", SetLastError = true)]
static extern bool RevertToSelf();
private static WindowsIdentity GetAppPoolIdentity()
{
WindowsIdentity identity = null;
Win32Exception win32Exception = null;
var thread = new Thread(o =>
{
if (!RevertToSelf())
{
var win32error = Marshal.GetLastWin32Error();
win32Exception = new Win32Exception(win32error);
}
identity = WindowsIdentity.GetCurrent();
});
thread.Start();
thread.Join();
if (win32Exception != null)
{
throw win32Exception;
}
return identity;
}
答案 2 :(得分:0)
如果您纯粹需要查看用户,那么您不能只使用Environment.UserName?
我只是将我的环境重新配置为使用经典应用程序池(启用了Impersonation),并且用户在IUSR上打开了Impersonate。
答案 3 :(得分:0)
With System.Security.Principal.WindowsIdentity.Impersonate(IntPtr.Zero)
Dim sCurrentUserName As String = System.Security.Principal.WindowsIdentity.GetCurrent.Name
End With