【问题标题】:How to restrict only certain settings in VB.Net?如何仅限制 VB.Net 中的某些设置?
【发布时间】:2019-05-21 07:01:54
【问题描述】:

我正在尝试在 VB.Net 中编写一个程序,以提供给我组织中的某些员工。它将让他们管理 AD 的某些方面,但仅限于他们被委派访问的内容。这部分有效。

似乎让我感到困惑的部分是如何将程序中的设置锁定为仅由特定组(即域管理员)允许,而不仅仅是本地管理员(即通过使用 UAC)。这些设置当前存储在My.Settings.* 中,并且是用户范围的设置(因此可以在以后更改它们)。

理想情况下,我希望显示一个 UAC 样式的对话框,但要针对 Active Directory 组而不是本地系统的管理员组进行身份验证,然后用户可以更改设置。该程序并不总是由域管理员运行,但如果输入凭据,则需要更改设置的选项。这可能吗?

【问题讨论】:

  • 用户是否记录在他们的 AD 凭据下运行您的程序?
  • @GabrielLuci 是的。如果程序没有 AD 凭据来监控谁在做什么,预计程序将在启动例程期间出错

标签: vb.net active-directory uac


【解决方案1】:

获取当前登录用户的组相当容易。有几种不同的方法,但这可能是最简单的:

UserPrincipal.Current.GetAuthorizationGroups()

这将递归地获取用户所属的所有安全组 - 因此,如果用户是组 A 的成员,并且该组在组 B 中,您将在此列表中看到组 B。 (实际上我写了一篇文章,讨论了该方法的工作原理:Finding all of a user’s groups

然后您只需通过查看列表中组的Name 属性来检查您想要的组是否存在。

如果您发现这太慢了,可以使用一种更快但不太友好的方法来实现。用户的身份验证令牌包含其组的所有 SID(这实际上是 GetAuthorizationGroups() 使用的),但它包含 SID。所以GetAuthorizationGroups() 会去 AD 并获取每一个的属性(每组一个网络请求)。

为了避免网络流量(和时间),您可以使用以下命令直接查看 SID:

System.Security.Principal.WindowsIdentity.GetCurrent().Groups

这将返回SecurityIdentifier 的列表。如果您存储正在使用的组的 SID,而不是名称,那么您可以将其与 SecurityIdentifierValue 进行比较,您可以在不联系 AD 的情况下完成整个操作。

更新:所有这些都将帮助您确定用户是否在您想要的组中(域管理员?)。如果您想为用户提供输入不同凭据的选项,那么……您可以通过多种方式来实现。

我认为最简单的方法是创建您自己的接受用户名和密码的对话框,并使用solution here 使用新凭据重新启动您的应用程序(转换为 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()

请注意,documentation on the UserName property 表示:

如果您使用 UPN 格式 user@DNS_domain_name,则域属性必须为 null

因此您可能需要检查用户是否给了您DOMAIN\UsernameUsername@domain.com 并适当地分配UserNameDomain 属性。

【讨论】:

  • 这很好,如果用户也是域管理员的话。我的要求是让用户使用他们的普通帐户运行,但只有域管理员可以通过应用程序设置设置。如果当前运行程序的用户不是域管理员,我希望出现一个身份验证对话框,然后允许更改设置。这有意义吗?
  • 我更新了我的答案,提供了一些可以帮助您入门的详细信息。
  • 请注意,proc.Start() 如果他们的凭据错误,将会抛出异常。
猜你喜欢
  • 2019-12-14
  • 2017-10-09
  • 2014-10-06
  • 2015-08-01
  • 2016-09-10
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多