如何仅限制VB.Net中的某些设置?

时间:2018-12-20 18:17:20

标签: vb.net active-directory uac

我正在尝试在VB.Net中编写一个程序以提供给组织中的某些人员。这将使他们能够管理AD的某些方面,但仅管理已委派的访问权限。这部分有效。

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

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

1 个答案:

答案 0 :(得分:2)

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

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而不是名称,则可以将其与Value的{​​{1}}进行比较,而无需联系AD即可完成全部操作。

更新:所有这些都将帮助您确定用户是否在所需的组中(域管理员?)。如果您想让用户选择输入不同的凭据,那么...可以采用几种方法。

我认为最简单的方法是创建一个使用用户名和密码的对话框,然后使用solution here使用新凭据(转换为VB.NET)重新启动应用程序:

SecurityIdentifier

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

  

如果您使用UPN格式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() @ user,则Domain属性必须为DNS_domain_name

因此,您可能必须检查用户是否给了您nullDOMAIN\Username,并适当地分配了Username@domain.comUserName属性。