Как получить текущего пользователя пула приложений в IIS при использовании impersonate = true? - PullRequest
8 голосов
/ 30 апреля 2010

В .net, когда веб-сайт размещен в IIS, как вы получаете текущего пользователя, под которым работает сайт. т. е. пользователь пула приложений, а не текущий пользователь, обращающийся к сайту.

Использование встроенных и олицетворяющих окон.

<authentication mode="Windows"/>
<identity impersonate="true"/>

Ответы [ 4 ]

18 голосов
/ 18 мая 2010

Чтобы вернуться к пользователю пула приложений в управляемом коде, вы можете сделать следующее:

using (WindowsIdentity.Impersonate(IntPtr.Zero)) 
{
   //This code executes under app pool user
}
2 голосов
/ 11 мая 2010

Нашли решение.

Используя RevertToSelf, вы можете удалить олицетворение из потока. В IIS это соответствует пользователю пула приложений.

Немного доко

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;
    }
0 голосов
/ 16 февраля 2016

Джон Саймонс: Именно то, что я хотел, спасибо. Для версии VB.net:

With System.Security.Principal.WindowsIdentity.Impersonate(IntPtr.Zero)
    Dim sCurrentUserName As String = System.Security.Principal.WindowsIdentity.GetCurrent.Name
End With
0 голосов
/ 30 апреля 2010

Если вам просто нужно увидеть пользователя, не могли бы вы просто использовать Environment.UserName?

Я только что перенастроил свою среду для работы с пулом классических приложений (с включенным олицетворением), и пользователь вышел как IUSR с включенным олицетворением.

...