Каков наилучший способ получить SID текущего пользователя?

Необходимая информация

  • Работа в .NET 2.0.
  • Код находится в общей библиотеке, которая может быть вызвана из ASP.Net, Windows Forms или приложения консоли.
  • Работа в домене Windows в корпоративной сети.

Вопрос

Каков наилучший способ получить SID текущего пользователя? Я не говорю о том, что выполняется приложение, но пользователь, который обращается к интерфейсу. В фоновых приложениях и на настольных системах это должно быть тождество, выполняющее приложение, но в ASP.Net(без наведения) это должен быть идентификатор SID HttpContext.Current.User.

Текущий метод

Вот что я получил прямо сейчас. Просто кажется... неправильно. Это неприятно. Есть ли лучший способ сделать это или какой-либо встроенный класс, который делает это для вас?

public static SecurityIdentifier SID
{
    get
    {
        WindowsIdentity identity = null;

        if (HttpContext.Current == null)
        {
            identity = WindowsIdentity.GetCurrent();
        }
        else
        {
            identity = HttpContext.Current.User.Identity as WindowsIdentity;
        }

        return identity.User;
    }
}

Ответы

Ответ 1

Я не думаю, что есть лучший способ получить эту информацию - вы должны каким-то образом получить WindowsPrincipal и .NET довольно чистые абзацы API, которые находятся за объектом User. Я просто оставил бы это красиво и завернутый в метод и назвал бы это день.

Хорошо, хорошо, есть одна вещь, которую вы должны сделать (если ваши веб-пользователи не всегда будут WindowsIdentity), что должно было бы проверить нулевую идентификацию и обрабатывать ее в соответствии с любыми правилами, которые у вас есть.

Ответ 2

Класс WindowsIdentity - это "встроенный класс, который делает это для вас". У вас есть такое же простое решение, какое вы действительно получите, если у вас есть действующий WindowsIdentity для работы.

В качестве альтернативы, если у вас есть имя пользователя, о котором идет речь, и вы хотите получить SID непосредственно из AD, вы можете создать свою собственную библиотеку для использования пространства имен DirectoryServices и получить DirectoryEntry для своего пользователя (это довольно сложно процесс как DirectoryServices является сложным). Вы даже можете использовать LDAP, чтобы получить его, если у вас есть необходимость.

Ответ 3

Без использования сторонних библиотек Этот код даст правильные результаты, если пользователь изменил свое имя пользователя.

String SID = "";
string currentUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString();

RegistryKey regDir = Registry.LocalMachine;

            using (RegistryKey regKey = regDir.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SessionData", true))
            {
                if (regKey != null)
                {
                    string[] valueNames = regKey.GetSubKeyNames();
                    for (int i = 0; i < valueNames.Length; i++)
                    {
                        using (RegistryKey key = regKey.OpenSubKey(valueNames[i], true))
                        {
                            string[] names = key.GetValueNames();
                            for (int e = 0; e < names.Length; e++)
                            {
                                if (names[e] == "LoggedOnSAMUser")
                                {
                                    if (key.GetValue(names[e]).ToString() == currentUserName)
                                        SID = key.GetValue("LoggedOnUserSID").ToString();
                                }
                            }
                        }
                    }
                }
            }MessageBox.Show(SID);