![公司范围内用户名政策和解决重复问题的最佳实践或经验](https://linux22.com/image/488660/%E5%85%AC%E5%8F%B8%E8%8C%83%E5%9B%B4%E5%86%85%E7%94%A8%E6%88%B7%E5%90%8D%E6%94%BF%E7%AD%96%E5%92%8C%E8%A7%A3%E5%86%B3%E9%87%8D%E5%A4%8D%E9%97%AE%E9%A2%98%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E6%88%96%E7%BB%8F%E9%AA%8C.png)
我是一名程序员,我的应用程序需要集成到新的公司范围的 Active Directory 登录方案中。这意味着要更改我们系统中的所有用户名以使用新方案。新方案是“首字母加姓氏”,因此 Joe Smith 的用户名将是 jsmith。如果 John Smith 现在被录用,他将获得 jsmith2。但是一旦 Joe 离开公司,他的 AD 帐户就会被删除,jsmith 又可用了。因此,如果 Jill Smith 现在被录用,她将获得 jsmith。从应用程序的角度来看,这在我看来会造成问题,因为我现在可能拥有与 Joe 相关的记录和与 Jill 相关的记录,这些记录是无法区分的,因为它们都是由“jsmith”创建的。
因此,我想知道是否存在一个标准或最佳实践来解决在组织范围内的目录中重复使用用户名的问题,尤其是在较大的公司中。当我在会议上提出我的担忧时,我被告知“[大公司名称]不可能仍然保留每个离开公司的用户的记录”,这让我感到非常疯狂。那么,是否有一个普遍接受的用户名处理解决方案?还是每家公司都在随心所欲地制定解决方案?
答案1
Windows 通过使用 GUID 来标识每个帐户来应对这种情况。用户名只是装饰。您会发现,即使用户名相同,旧的 jsmith 和新的 jsmith 也有不同的 GUID。
您可以将 GUID 与应用中的每个帐户关联起来吗?如果我考虑一下,我可能可以告诉您如何获取用户的 GUID。它将是活动目录中用户的属性。
JR
答案2
是的,我们会保留每一位曾经受雇的用户。我通常建议使用首字母、中间字母和姓氏来尽量减少 JQPublic1 帐户的数量,但这种情况确实存在,但从 AD 的角度来看,用户只是数字。您可以使用此脚本查看任何帐户的数字:
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
答案3
正如其他人提到的,使用用户 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,因此如果您需要“记住”LDAP 搜索库(或组,或任何其他内容)的 DN,您可以使用 GUID,这样如果它在 AD 中移动(想想某些管理员离开并重新组织 OU,或重命名组),您的“指针”不会中断(因为 GUID 永远不会改变)。
答案4
GUID 绝对是最佳选择。如果您确实需要以人性化的格式显示人员姓名,只需在代码中进行 AD 查找即可。