Каков наилучший способ получить 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);