用vbs确定用户的登录名的代码
程序员文章站
2022-06-23 21:04:07
问: 您好,脚本专家!如何确定名为 john smith 的用户的用户登录名? -- fr 答: 您好,fr。您知道,我们很愿意告诉...
问:
您好,脚本专家!如何确定名为 john smith 的用户的用户登录名?
-- fr
答:
您好,fr。您知道,我们很愿意告诉您如何确定名为 john smith 的用户的用户登录名,但是我们不能这样做:因为在我们的某个样例脚本中有一个特定的姓名列表,表示我们只能引用的用户名。遗憾的是,john smith 不在该列表中,因此我们不能使用他的名字。
是的,对此我们也觉得不舒服,但是我们无能为力。但是要告诉您的是:向您介绍一个确定名为 ken myer 的用户的用户登录名的脚本怎么样?是的,我们知道:确实不一样,不是吗?但我们最多只能做到这样了:
on error resume next
const ads_scope_subtree = 2
set objconnection = createobject("adodb.connection")
set objcommand = createobject("adodb.command")
objconnection.provider = "adsdsoobject"
objconnection.open "active directory provider"
set objcommand.activeconnection = objconnection
objcommand.properties("page size") = 1000
objcommand.properties("searchscope") = ads_scope_subtree
objcommand.commandtext = _
"select samaccountname from 'ldap://dc=fabrikam,dc=com' where objectcategory='user' " & _
"and givenname='ken' and sn='myer'"
set objrecordset = objcommand.execute
objrecordset.movefirst
do until objrecordset.eof
wscript.echo objrecordset.fields("samaccountname").value
objrecordset.movenext
loop
您可能已经发现了,这是一个用于搜索 active directory 的脚本。我们不打算逐个解释此脚本中使用的每一行代码,那样会花费太多时间。如果您不熟悉 active directory 搜索脚本,建议您看一下我们的两篇“脚本故事”系列文章 dude:where's my printer? 您在此脚本中看到的所有看起来怪怪的东西 - adsdsoobject、ds_scope_subtree、adodb.command - 在这两个专栏中都有详细的解释。
但是,我们将指出与用于进行搜索的查询有关的几件事情。在编写用于搜索 active directory 的脚本时,最难的部分也许就是知道要搜索的属性名。例如,您提到的用户登录名。我们知道用户登录名的意思,您也知道用户登录名的意思,但是 active directory 不知道用户登录名是什么。active directory 会改为调用 samaccountname。(注意:尽管字母的大小写无关紧要,但是我们会将此属性名写作 samaccountname,仅仅是因为这是该属性的正式名称而已。因而,sql 查询将检索指定用户的 samaccountname。
那么如何指定该用户呢?嗯,我们要查找符合以下三个条件的 active directory 对象:
• 是用户帐户。为了将返回的数据限制为用户帐户,我们要搜索 objectcategory 等于 user 的项。
• 名字为 ken。当然,active directory 不知道什么是“名字”。因此,我们需要搜索 givenname 为 ken 的用户。
• 姓氏为 myer。正如您所料,active directory 也从未听说过“姓氏”一词。因此,我们需要改为搜索 sn(姓)myer。
将以上所有条件加起来,查询最后将如下所示:
objcommand.commandtext = _
"select samaccountname from 'ldap://dc=fabrikam,dc=com' where objectcategory='user' " & _
"and givenname='ken' and sn='myer'"
剩下的就很容易了。执行此查询,active directory 将返回一个记录集,该记录集由 givename 为 ken 且 sn 为 myer 的所有用户组成。然后,设置一个 do until 循环来遍历该记录集,并回显每个用户的 samaccountname。(理想的情形为,active directory 中只有一个 ken myer,但是实际上可能会有多个同名同姓的用户。在这种情况下,samaccountname 将是一个区别因素,因为 samaccountnames 必定是唯一的。)
明白一些了吧?好了,看(不要告诉任何人是我们说的),拿刚才向您介绍的脚本来说,用 john 替换 ken、用 smith 替换 myer,您将得到用于搜索名为 john smith 的用户的脚本。但是,这只是您和我们之间的秘密,好吗?好
您好,脚本专家!如何确定名为 john smith 的用户的用户登录名?
-- fr
答:
您好,fr。您知道,我们很愿意告诉您如何确定名为 john smith 的用户的用户登录名,但是我们不能这样做:因为在我们的某个样例脚本中有一个特定的姓名列表,表示我们只能引用的用户名。遗憾的是,john smith 不在该列表中,因此我们不能使用他的名字。
是的,对此我们也觉得不舒服,但是我们无能为力。但是要告诉您的是:向您介绍一个确定名为 ken myer 的用户的用户登录名的脚本怎么样?是的,我们知道:确实不一样,不是吗?但我们最多只能做到这样了:
on error resume next
const ads_scope_subtree = 2
set objconnection = createobject("adodb.connection")
set objcommand = createobject("adodb.command")
objconnection.provider = "adsdsoobject"
objconnection.open "active directory provider"
set objcommand.activeconnection = objconnection
objcommand.properties("page size") = 1000
objcommand.properties("searchscope") = ads_scope_subtree
objcommand.commandtext = _
"select samaccountname from 'ldap://dc=fabrikam,dc=com' where objectcategory='user' " & _
"and givenname='ken' and sn='myer'"
set objrecordset = objcommand.execute
objrecordset.movefirst
do until objrecordset.eof
wscript.echo objrecordset.fields("samaccountname").value
objrecordset.movenext
loop
您可能已经发现了,这是一个用于搜索 active directory 的脚本。我们不打算逐个解释此脚本中使用的每一行代码,那样会花费太多时间。如果您不熟悉 active directory 搜索脚本,建议您看一下我们的两篇“脚本故事”系列文章 dude:where's my printer? 您在此脚本中看到的所有看起来怪怪的东西 - adsdsoobject、ds_scope_subtree、adodb.command - 在这两个专栏中都有详细的解释。
但是,我们将指出与用于进行搜索的查询有关的几件事情。在编写用于搜索 active directory 的脚本时,最难的部分也许就是知道要搜索的属性名。例如,您提到的用户登录名。我们知道用户登录名的意思,您也知道用户登录名的意思,但是 active directory 不知道用户登录名是什么。active directory 会改为调用 samaccountname。(注意:尽管字母的大小写无关紧要,但是我们会将此属性名写作 samaccountname,仅仅是因为这是该属性的正式名称而已。因而,sql 查询将检索指定用户的 samaccountname。
那么如何指定该用户呢?嗯,我们要查找符合以下三个条件的 active directory 对象:
• 是用户帐户。为了将返回的数据限制为用户帐户,我们要搜索 objectcategory 等于 user 的项。
• 名字为 ken。当然,active directory 不知道什么是“名字”。因此,我们需要搜索 givenname 为 ken 的用户。
• 姓氏为 myer。正如您所料,active directory 也从未听说过“姓氏”一词。因此,我们需要改为搜索 sn(姓)myer。
将以上所有条件加起来,查询最后将如下所示:
objcommand.commandtext = _
"select samaccountname from 'ldap://dc=fabrikam,dc=com' where objectcategory='user' " & _
"and givenname='ken' and sn='myer'"
剩下的就很容易了。执行此查询,active directory 将返回一个记录集,该记录集由 givename 为 ken 且 sn 为 myer 的所有用户组成。然后,设置一个 do until 循环来遍历该记录集,并回显每个用户的 samaccountname。(理想的情形为,active directory 中只有一个 ken myer,但是实际上可能会有多个同名同姓的用户。在这种情况下,samaccountname 将是一个区别因素,因为 samaccountnames 必定是唯一的。)
明白一些了吧?好了,看(不要告诉任何人是我们说的),拿刚才向您介绍的脚本来说,用 john 替换 ken、用 smith 替换 myer,您将得到用于搜索名为 john smith 的用户的脚本。但是,这只是您和我们之间的秘密,好吗?好