Как ограничить только определенные настройки в VB.Net? - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь написать программу на VB.Net, чтобы дать ее определенному персоналу в моей организации.Это позволит им управлять некоторыми аспектами AD, но только тем, для чего им был делегирован доступ.Эта часть работает.

Часть, которая, кажется, озадачивает меня, состоит в том, как заблокировать настройки в программе, которые будут разрешены только определенной группе (например, администраторам домена), но не только локальным администраторам (то есть с помощьюUAC).В настоящее время настройки хранятся в My.Settings.* и являются настройками в пользовательской области (поэтому они могут быть изменены позднее).

В идеале, я бы хотел, чтобы появилось диалоговое окно в стиле UAC, но чтобыаутентифицироваться в группе Active Directory, а не в группе администраторов локальной системы, тогда пользователь может изменять настройки.Программа не всегда будет запускаться администратором домена, но должна быть возможность изменить настройки, если введены учетные данные.Это возможно?

1 Ответ

0 голосов
/ 20 декабря 2018

Довольно просто получить группы для текущего пользователя.Существует несколько различных методов, но это, вероятно, самый простой:

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 соответствующим образом.

...