none
VBSでユーザ名から所属するOUを逆引きしたい RRS feed

  • 質問

  • LDAPアクセスで認証が必要な環境からのスクリプト実行になります。

    inputboxで入力したユーザ名がどのOUに所属するかを確認したいスクリプトを作成検討しています。

    strUser = inputbox("UserName","Input")

    baseDN="DC=hoge,DC=local"

    strServer="192.168.1.1"

    set objUser=~

    wscript.echo objUser.OrganizationalUnit的なもの

    といった内容を想定しています。

    以上、よろしくお願いいたします。

    2015年5月18日 6:06

回答

  • チャブーンです。

    この件ですが、質問を読み直してみて、こちらが読み違えていたように思います。すみません。

    言葉通りに理解した場合ですが、ユーザのOUはParentプロパティで所得できます。OUの名前だけ必要であればnameプロパティを最終的に取得することになります。LDAPによる認証が必要、という環境が具体的になんなのかわからないので、前回同様ユーザとパスワードを明示指定させます。

    cscript ParentOU.vbs <IPアドレス>\<ユーザ名> <パスワード>

    ParentOU.vbs

    Set objParam = Wscript.Arguments
    
    strServer=left(objParam(0),instr(objParam(0),"\")-1)
    strUser=mid(objParam(0),instr(objParam(0),"\")+1)
    strOpassword=objParam(1)
    'strNpassword=objParam(2)
    strFilter="(&(objectClass=user)(saMAccountName=" & strUser & "))"
    
    'ドメインDNを指定します
    baseDN="DC=example,DC=com"
    
    Set objAdo=createObject("ADODB.Connection")
    objAdo.provider="ADsDsoObject"
    objAdo.properties("User ID")=strUser
    objAdo.properties("Password")=strOpassword
    objAdo.properties("Encrypt Password")=True
    objAdo.Open "dssearch"
    
    
    Set objRecordSet=objAdo.execute("<LDAP://" & strServer & "/" & baseDN & ">;" & strFilter & ";ADsPath;subtree")
    strADsPath=objRecordSet.Fields("ADsPath").value
    
    Set objDS=GetObject("LDAP:")
    Set objUser=objDS.OpenDSObject(strADsPath,strUser,strOpassword,1)
    
    objUser.GetInfo
    strParent=objUser.Parent
    
    Set objOU=objDS.OpenDSObject(strParent,strUser,strOpassword,1)
    
    Wscript.echo strUser & " の親 OU は " & (objOU.Get("name")) & " です。 "


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。



    2015年5月22日 1:38
    モデレータ

すべての返信

  • LDAPへの接続は ”LDAP://” & strServer & "/" & baseDN

    といった形になる想定です。

    2015年5月18日 6:25
  • チャブーンです。

    この件ですが、実質以下のスレッドの続編ですよね。

    https://social.technet.microsoft.com/Forums/ja-JP/aed85ae4-3753-4021-9b6d-34a71e452fd9/pcadcli?forum=activedirectoryja#59ee4a48-9f6e-41d5-a789-8e4fdc306ce3

    で、答えの方ですがユーザの所属OUを直接確認する必要はなく、ドメイン内で「該当するユーザー名」で検索をかけ、その位置パス(ADsPath)を検出し、パスワード変更をかけます。コマンドとしての書式は以前と同じになります。

    cscript chgpass.vbs <IPアドレス\ユーザ名> <古いパスワード> <新しいパスワード>

    chgpass.vbs

    Set objParam = Wscript.Arguments
    
    strServer=left(objParam(0),instr(objParam(0),"\")-1)
    strUser=mid(objParam(0),instr(objParam(0),"\")+1)
    strOpassword=objParam(1)
    strNpassword=objParam(2)
    strFilter="(&(objectClass=user)(saMAccountName=" & strUser & "))"
    
    'ドメインDNを指定します
    baseDN="DC=example,DC=com"
    
    Set objAdo=createObject("ADODB.Connection")
    objAdo.provider="ADsDsoObject"
    objAdo.properties("User ID")=strUser
    objAdo.properties("Password")=strOpassword
    objAdo.properties("Encrypt Password")=True
    objAdo.Open "dssearch"
    
    
    Set objRecordSet=objAdo.execute("<LDAP://" & strServer & "/" & baseDN & ">;" & strFilter & ";ADsPath;subtree")
    strADsPath=objRecordSet.Fields("ADsPath").value
    
    Set objDS=GetObject("LDAP:")
    Set objUser=objDS.OpenDSObject(strADsPath,strUser,strOpassword,1)
    
    objUser.changePassword strOpassword,strNpassword


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2015年5月20日 1:30
    モデレータ
  • チャブーンです。

    この件ですが、質問を読み直してみて、こちらが読み違えていたように思います。すみません。

    言葉通りに理解した場合ですが、ユーザのOUはParentプロパティで所得できます。OUの名前だけ必要であればnameプロパティを最終的に取得することになります。LDAPによる認証が必要、という環境が具体的になんなのかわからないので、前回同様ユーザとパスワードを明示指定させます。

    cscript ParentOU.vbs <IPアドレス>\<ユーザ名> <パスワード>

    ParentOU.vbs

    Set objParam = Wscript.Arguments
    
    strServer=left(objParam(0),instr(objParam(0),"\")-1)
    strUser=mid(objParam(0),instr(objParam(0),"\")+1)
    strOpassword=objParam(1)
    'strNpassword=objParam(2)
    strFilter="(&(objectClass=user)(saMAccountName=" & strUser & "))"
    
    'ドメインDNを指定します
    baseDN="DC=example,DC=com"
    
    Set objAdo=createObject("ADODB.Connection")
    objAdo.provider="ADsDsoObject"
    objAdo.properties("User ID")=strUser
    objAdo.properties("Password")=strOpassword
    objAdo.properties("Encrypt Password")=True
    objAdo.Open "dssearch"
    
    
    Set objRecordSet=objAdo.execute("<LDAP://" & strServer & "/" & baseDN & ">;" & strFilter & ";ADsPath;subtree")
    strADsPath=objRecordSet.Fields("ADsPath").value
    
    Set objDS=GetObject("LDAP:")
    Set objUser=objDS.OpenDSObject(strADsPath,strUser,strOpassword,1)
    
    objUser.GetInfo
    strParent=objUser.Parent
    
    Set objOU=objDS.OpenDSObject(strParent,strUser,strOpassword,1)
    
    Wscript.echo strUser & " の親 OU は " & (objOU.Get("name")) & " です。 "


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。



    2015年5月22日 1:38
    モデレータ
  • こんにちは、H______W_______ さん
    フォーラムオペレータの佐伯 玲 です。

    その後の状況はいかがでしょうか?
    チャブーンさんからご参考になるかと思われる情報をお寄せいただけているので私のほうから「回答としてマーク」とさせていただきますね。

    お試しいただけましたら経過や結果をお寄せ下さいね。


    宜しくお願い致します。

    TechNet Community Support 佐伯 玲

    2015年5月29日 6:11
  • こちらで確認が遅れており、御礼のご連絡が遅くなってしまいました。

    上記内容で、取得したかった情報無事取得もできましたので、無事解決いたしました。

    本件、非常に助かりました。ありがとうございます。

    2015年6月4日 2:32