如何获取来宾/管理员的本地组名?
题:
我使用http://support.microsoft.com/kb/306273上的代码
添加Windows用户。 问题是我需要将用户添加到组中,但组名已本地化。
例如,MS-example使用英文计算机,这意味着您可以像这样获取访客组:grp = AD.Children.Find(“Guests”,“group”)
但是在非英语计算机上,“访客”组名是本地化的,例如在我的德语操作系统上,来宾的组名是“Gäste”。
这意味着支持示例在我的计算机上运行我需要将该行更改为grp = AD.Children.Find(“Gäste”,“group”)
然后它工作。
现在,如果操作系统是任何其他语言,我如何找到访客用户的名称? 或者如何从sid获取来宾用户名?
注意:.NET 2.0,而不是3.0或3.5
正如您所指出的,组的名称根据系统语言进行了本地化。
对于“众所周知”的群组,例如“管理员”和“访客”,您应该根据SID进行检索。 客人的SID是:
S-1-5-32-546
这里有一个众所周知的SID列表:
http://support.microsoft.com/kb/243330
可以在此处找到从SID获取组名的代码
您可以使用此代码,返回的值对于非英语系统是正确的:
var guestsGroup = new SecurityIdentifier(WellKnownSidType.BuiltinGuestsSid, null).Translate(typeof(NTAccount)).Value;
通过SID查找帐户是最好的方法。 它有点做作,但它的工作方式是这样的:
-
管理员帐户的SID 始终以
S-1-5-21
,以-500
结尾。 中间的其他所有内容都是随机的(域名的SID)。 -
Guest帐户的SID 始终以
S-1-5-21
,以-501
。
可以在此处获得描述此内容的Microsoft知识库文章。
要查找这些帐户,您必须枚举本地计算机上的所有帐户,并查找哪些SID以这些数字开头并以这些数字结尾。 一旦匹配,您就拥有了内置帐户。 不是最好的方法,但它的工作原理。
安全设置\本地策略\安全选项下的组策略设置称为帐户:重命名管理员帐户和帐户:重命名访客帐户 。 我无法在注册表中找到存储这些设置的位置,但如果您能够找到并查找它们,您很可能会获得这两个帐户的“官方”名称。
此页面包含一些用于获取用户详细信息并进行检查的代码。
这段代码:
public IdentityReferenceCollection GetUserGroups() { System.Security.Principal.WindowsIdentity currentUser = System.Security.Principal.WindowsIdentity.GetCurrent(); return currentUser.Groups; }
返回当前用户的组。
可以在此处找到有关WindowsIdentity
类的更多详细信息,其中包含Groups
属性。
您应该能够使用WindowsIdentity和WindowsPrincipal类:
Dim currentIdentity as WindowsIdentity = WindowsIdentity.GetCurrent() Dim currentPrincipal as WindowsPrincipal = New WindowsPrincipal(currentIdentity) If currentPrincipal.IsInRole(WindowsBuiltInRole.Guest) Then Foobar() End If
没关系,我发现你实际上是在尝试将用户添加到该组中。
- C#/ .NET 4.5 – 为什么“等待Task.WhenAny”在WPF应用程序的UI线程中提供Task.Delay时永远不会返回?
- 如何更改Settings.settings值的值
- 使用标记类来控制逻辑流程
- 在手机上查看互联网连接
- 从IEnumerable <IEnumerable > linq中选择IEnumerable
- 常量(标签文本等)应该放在WPF MVVM应用程序中
- ‘Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment’的类型初始值设定项引发exception
- 如何将Cookie添加到WebRequest?
- C#:如何从XML元素中删除命名空间信息