我是一个程序员,需要将这个应用程序集成到新的公司范围的Active Directoryloginscheme中。 这意味着更改我们系统中的所有用户名以使用新的scheme。 新的计划是“第一名,姓氏”,所以乔·史密斯将有一个用户名jsmith。 如果约翰史密斯现在被雇用,他会得到jsmith2。 但是,一旦乔离开公司,他的AD帐户被删除,并且jsmith再次可用。 所以如果吉尔史密斯现在被聘用,她会得到jsmith。 从应用程序的angular度来看,这在我看来会引起一些问题,因为我现在可以有关于Joe的logging和与Jill有关的logging是无法区分的,因为它们都是由“jsmith”创build的。
因此,我不禁要问,是否有一个标准或最佳实践来解决在组织范围内重用用户名的问题,特别是在大公司中。 当我在会议上提出自己的担忧时,我被告知:“大公司名称没有办法logging每个离开公司的用户的logging”,这让我感到如此疯狂。 那么,是否有一个普遍接受的解决scheme来处理用户名? 还是每个公司都是这样做的?
Windows通过使用GUID识别每个帐户来应对这种情况。 用户名只是装饰。 你会发现旧的jsmith和新的jsmith有不同的GUID,即使用户名是一样的。
你可以关联一个GUID与你的应用程序中的每个帐户? 如果我考虑一下,我可以告诉你如何获得用户的GUID。 它将是活动目录中用户的属性。
JR
是的,我们保持每一个用户的雇用。 我通常会推荐第一个首字母,中间首字母,姓氏,以尽量减lessJQPublic1帐号的数量,但是从AD的angular度来看,用户只是数字。 你可以看到这个脚本的任何帐号的号码:
strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set objAccount = objWMIService.Get ("Win32_UserAccount.Name='myusername',Domain='mydomain'") Wscript.Echo objAccount.SID
作为一个免费的奖金,这里是如何把一个sid变成一个用户名 :
strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set objAccount = objWMIService.Get ("Win32_SID.SID='S-1-5-21-1454471165-1004336348-1606980848-5555'") Wscript.Echo objAccount.AccountName Wscript.Echo objAccount.ReferencedDomainName
正如其他人所说,使用用户的Active Directory帐户的GUID属性是一个好主意。 但是,如果您希望具有可读性,则应该查看iADsNameTranslate接口的文档。 你可以得到很多里程来处理翻译AD帐户(GUID,SID,samAccountName,displayName,DN等)的各种可能的名称。
例:
Option Explicit ' Constants for the iADsNameTranslate object. (from http://msdn.microsoft.com/en-us/library/aa772267(VS.85).aspx) Const ADS_NAME_TYPE_NT4 = 3 Const ADS_NAME_TYPE_GUID = 7 Const ADS_NAME_INITTYPE_GC = 3 Dim objNameTranslate Dim strUserGUID ' Create a nametranslate object and init to talk to a global catalog server Set objNameTranslate = CreateObject("NameTranslate") objNameTranslate.Init ADS_NAME_INITTYPE_GC, "" ' We're looking for an "NT 4" account name type-- aka a samAccountName objNameTranslate.Set ADS_NAME_TYPE_NT4, "DOMAIN\username" ' Translate into the user's GUID strUserGUID = objNameTranslate.Get(ADS_NAME_TYPE_GUID) WScript.Echo strUserGUID
这不仅仅是用户帐户。 AD中的每个对象都有一个GUID,所以如果你需要为一个LDAPsearch基(或者一个组或者任何东西)“记住”一个DN,那么你可以使用GUID,如果它在AD中移动关于一些pipe理员closures和重新组织OU,或重命名组),你的“指针”不会中断(因为GUID永远不会改变)。
Active Directory中有几个命名属性:
DN是一个不好的选项,因为如果用户被移动或重命名,它将会改变。 sane可能为userPrincipalName / sAMAccountName(如果它们被重命名)。
正如另一张海报所说,用户的真正独特的属性可能是GUID,并不好,人类可读,唉。
GUID绝对是要走的路。 如果您确实需要以人性化的格式显示该人的姓名,只需在代码中进行AD查找即可。
其他人已经发布了脚本片段,你会发现很多代码片断,在通常的编码网站的各种语言。 尝试search“用户指导”,“用户到ID”等等。
海事组织,好的做法是永远不要删除帐户,只是禁用它们。 这样他们不能被重新使用。
彼得,我自己的经验是 – 不要指望用户名是唯一的,除非你有一个方法来保证用户名的唯一性。 正如你所说,它从来没有真正解决。
该应用程序无论是什么,都需要使用其他相关数据来确定是什么使得用户在任何应用程序的上下文中都是唯一的。 例如,如果您正在制作一个应用程序来生成邮件传单,则您可能不希望每个唯一的邮政地址发送多个传单。