Come ottenere il pool utente dell'applicazione corrente in IIS quando si utilizza impersonate = true?
-
02-10-2019 - |
Domanda
In .net quando un sito web ospitato in IIS come si fa a ottenere l'utente corrente il sito è in esecuzione in. cioè l'utente del pool di applicazioni non l'utente corrente l'accesso al sito.
Utilizzando finestre integrati e impersonate.
<authentication mode="Windows"/>
<identity impersonate="true"/>
Soluzione
Per ripristinare l'utente pool di applicazione in codice gestito è possibile effettuare le seguenti operazioni:
using (WindowsIdentity.Impersonate(IntPtr.Zero))
{
//This code executes under app pool user
}
Altri suggerimenti
Trovato una soluzione.
Utilizzando RevertToSelf si può mettere a nudo la rappresentazione da un thread. In IIS questo equivale per l'utente del pool di applicazioni.
Alcuni doco
http://www.pinvoke.net/default.aspx/advapi32.reverttoself
http://msdn.microsoft.com /en-us/library/aa379317%28VS.85%29.aspx
E il codice
[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;
}
Se puramente bisogno di vedere l'utente, allora non si potrebbe semplicemente usare Environment.UserName?
Ho appena riconfigurato il mio ambiente per far funzionare con un pool Classic App (con rappresentazione su) e l'utente esce come IUSR con Rappresenta su.
John Simons: Esattamente quello che volevo, grazie. Per la versione VB.net:
With System.Security.Principal.WindowsIdentity.Impersonate(IntPtr.Zero)
Dim sCurrentUserName As String = System.Security.Principal.WindowsIdentity.GetCurrent.Name
End With