Довольно просто получить группы для текущего пользователя.Существует несколько различных методов, но это, вероятно, самый простой:
UserPrincipal.Current.GetAuthorizationGroups()
. Он получит все группы безопасности, членом которых является пользователь, рекурсивно - поэтому, если пользователь является членом группы A,и эта группа находится в группе B, вы увидите группу B в этом списке.(На самом деле я написал статью, в которой обсуждал, как работает этот метод: Поиск всех групп пользователей )
Затем вы просто проверяете, какая группа вам нужна, посмотрев на Name
свойство групп в списке.
Если вы обнаружите, что это слишком медленно, есть гораздо более быстрый, но не столь дружественный способ сделать это.Токен аутентификации пользователя содержит все SID их групп (это фактически то, что GetAuthorizationGroups()
использует), но он only содержит SID.Таким образом, GetAuthorizationGroups()
отправится в AD и получит свойства каждого из них (один сетевой запрос на группу).
Чтобы избежать этого сетевого трафика (и времени), вы можете посмотреть на идентификаторы безопасности, используя это:
System.Security.Principal.WindowsIdentity.GetCurrent().Groups
Возвращает список SecurityIdentifier
.Если вы сохраняете SID группы, которую вы используете, вместо названия, вы можете сравнить его с Value
из SecurityIdentifier
, и вы можете делать все это, не связываясь с AD вообще.
Обновление: Все это поможет вам определить, входит ли пользователь в нужную вам группу (администраторы домена?).Если вы хотите дать пользователю возможность вводить разные учетные данные, ну ... есть несколько способов сделать это.
Самое простое, на мой взгляд, это создать собственный диалог, который принимает имя пользователя ипароль и используйте решение здесь , чтобы перезапустить приложение с новыми учетными данными (переведено на VB.NET):
Dim proc As System.Diagnostics.Process = New System.Diagnostics.Process()
proc.StartInfo.UseShellExecute = False
proc.StartInfo.FileName = Application.ExecutablePath
proc.StartInfo.Domain = "domainname"
proc.StartInfo.UserName = "username"
'Translate the user-entered String into a SecureString
'If you take the password as a SecureString in the first place
'you won't have to do this
Dim password As String = "user entered password"
Dim ssPwd As System.Security.SecureString = New System.Security.SecureString()
For x As Integer = 0 To password.Length - 1
ssPwd.AppendChar(password(x))
Next
proc.StartInfo.Password = ssPwd
proc.Start()
Application.Exit()
Обратите внимание, что документация на UserName
свойство говорит:
Если вы используете формат UPN, user
@ DNS_domain_name
, свойство домена должно быть null
.
может потребоваться проверить, дал ли пользователь вам DOMAIN\Username
или Username@domain.com
и назначить свойства UserName
и Domain
соответствующим образом.