none
ActiveDirectoryのユーザプロパティの変更方法について RRS feed

  • 質問

  • いつもお世話になっております。

    ActiveDirectoryのユーザプロパティの変更方法について悩んでおります。

    現在、New-ADUserを用いずに、Create関数を使用してユーザの作成を行っています。

    実装したいプログラムの動作は以下の通りです。

    ①CSVを読み込む

    ②CSVに記述されているユーザをADから検索

    ③検索でヒットしたユーザのプロパティ(パスワードやuserPricipalName等)の更新

    出来れば、Set-ADUserコマンドを用いずに更新を行いたいと思っております。

    ご回答の程をどうぞ宜しくお願い致します。

    以下、Create関数で実装したユーザ作成プログラムです。

    ------------------------------------------------------------

    $csvPath = "C:\powershell\file\import.csv"
    $strOU = "ou=MyOffice,dc=dev,dc=test,dc=com"
    $oOU = New-Object DirectoryServices.DirectoryEntry("LDAP:// $strOU")
    
    $csvDatas = Import-Csv -path $csvPath
    
    foreach($csvData in $csvDatas) {
    $cn = $csvData.cn
    $oUser = $oOU.Create("user","cn=$cn")
    $oUser.Put("sAMAccountName", $csvData.sAMAccountName)
    $oUser.Put("userPrincipalName", $csvData.userPrincipalName)
    $oUser.setInfo()
    $oUser.SetPassword($csvData.unicodePwd.ToString())
    $oUser.setInfo()
    }



    • 編集済み o, 2012年9月24日 14:33
    • 移動 星 睦美 2012年9月25日 2:40 (移動元:Windows PowerShell)
    • 編集済み 星 睦美 2012年9月25日 2:42 タイトルと内容から"PowerShellによる"を削除しました
    2012年9月24日 14:32

回答

  • こんにちは

    回答ではないのですが、レスがつかないようですので少しだけ。

    まず、現状の問題点が少し判り辛いのかなと思います。

    記載のスクリプトにて、何かしらエラーになる、エラーは出ないがユーザーが追加されない、ユーザーは追加されるが思い通りのユーザーではない、といったあたりが判るとレスも付きやすいのかと。

    また、Set-ADUserを使いたくない理由はどこら辺にあるのか。
    その理由いかんによっては他のアプローチがある可能性も考えられます。
    一応CSVからSet-ADUserでユーザー追加するのは以下でちょっとやったことがあります。
    http://mtgpowershell.blogspot.jp/2011/03/csvactivedirectory.html

    Set-ADUserを使わないとなると本質的には.NETの話になりそうなので.NET関係のフォーラムも良いかもしれません。

    Create関数は使っていないのですが、DirectoryEntryを使ったユーザー追加の例を検索すると以下のようなサンプルがありました。
    http://blog.hiros-dot.net/?cat=85
    そのまま単純にPowerShellで書くとこんな感じになりそうです。

    $strOU = "OU=OU-XXXXXX"
    $oOU = New-Object DirectoryServices.DirectoryEntry("LDAP:// $strOU")
    $user = $oOU.Children.Add("CN=testuser","user")
    $user.Properties["samAccountName"].Value = "testuser"
    $user.CommitChanges()
    何かしらのご参考になれば幸いです。
    2012年9月26日 0:48
  • チャブーンです。

    前のコードはダメだったので、修正したものになります。ひとまず大丈夫だと思います。

    ポイントとしては、検索条件をその都度設定してDirectorySeacherクラスに入れること、検索結果からオブジェクトを登録するメソッドGetDirectoryEntryを使う、というあたりでしょうか?Windows Server 2012でやってますが、それ以外のWindowでも大丈夫だと思います。

    $objDomain = New-Object System.DirectoryServices.DirectoryEntry
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = $objDomain
    $objSearcher.SearchScope = "Subtree"
    $csvDatas = Import-Csv -path "(path)"
    
    foreach($csvData in $CsvDatas) {
        $cn = $csvData.cn
    $userPrincipalName = $csvData.userPrincipalName
    $unicodePwd = $csvData.unicodePwd $strFilter = "(&(objectCategory=User)(cn=$cn))" $objSearcher.Filter = $strfilter $objUser = ($objSearcher.Findone()).GetDirectoryEntry() $objUser.Put("userPrincipalName",$userPrincipalName) $objUser.SetPassword($unicodePwd.ToString()) $objUser.setInfo() }
    追記:実現できてよかったです。コードが間違ってました(GetDirectoryEntry)ので、直しておきました。(たぶん)ご迷惑をかけました。


    2012年9月30日 0:59
    モデレータ
  • チャブーンです。

    minminnana_prof さんの回答に補足といいますか...。

    質問者さんの意図としては、エラー云々ではなくて、既存のスクリプトを流用して「ユーザプロパティを変更するサンプルコードを書いて欲しい」にあたるのかなぁと。

    今サンプルは書きませんが、DirectorySearcherクラスを使って、ユーザを検索してオブジェクトを得ればいいのではないでしょうか?細かい話はしたのぺーじをどうぞ。

    http://technet.microsoft.com/en-us/library/ff730967.aspx


    2012年9月27日 3:48
    モデレータ

すべての返信

  • こんにちは

    回答ではないのですが、レスがつかないようですので少しだけ。

    まず、現状の問題点が少し判り辛いのかなと思います。

    記載のスクリプトにて、何かしらエラーになる、エラーは出ないがユーザーが追加されない、ユーザーは追加されるが思い通りのユーザーではない、といったあたりが判るとレスも付きやすいのかと。

    また、Set-ADUserを使いたくない理由はどこら辺にあるのか。
    その理由いかんによっては他のアプローチがある可能性も考えられます。
    一応CSVからSet-ADUserでユーザー追加するのは以下でちょっとやったことがあります。
    http://mtgpowershell.blogspot.jp/2011/03/csvactivedirectory.html

    Set-ADUserを使わないとなると本質的には.NETの話になりそうなので.NET関係のフォーラムも良いかもしれません。

    Create関数は使っていないのですが、DirectoryEntryを使ったユーザー追加の例を検索すると以下のようなサンプルがありました。
    http://blog.hiros-dot.net/?cat=85
    そのまま単純にPowerShellで書くとこんな感じになりそうです。

    $strOU = "OU=OU-XXXXXX"
    $oOU = New-Object DirectoryServices.DirectoryEntry("LDAP:// $strOU")
    $user = $oOU.Children.Add("CN=testuser","user")
    $user.Properties["samAccountName"].Value = "testuser"
    $user.CommitChanges()
    何かしらのご参考になれば幸いです。
    2012年9月26日 0:48
  • チャブーンです。

    minminnana_prof さんの回答に補足といいますか...。

    質問者さんの意図としては、エラー云々ではなくて、既存のスクリプトを流用して「ユーザプロパティを変更するサンプルコードを書いて欲しい」にあたるのかなぁと。

    今サンプルは書きませんが、DirectorySearcherクラスを使って、ユーザを検索してオブジェクトを得ればいいのではないでしょうか?細かい話はしたのぺーじをどうぞ。

    http://technet.microsoft.com/en-us/library/ff730967.aspx


    2012年9月27日 3:48
    モデレータ
  • こんにちは、

    あー、確かにそうですね。

    >ActiveDirectoryのユーザプロパティの変更方法について悩んでおります

    とありますものね。

    単にSet-ADUserを使わないプロパティ変更方法が問題だったのですね。

    失礼しました。

    2012年9月27日 6:29
  • チャブーンです。

    前のコードはダメだったので、修正したものになります。ひとまず大丈夫だと思います。

    ポイントとしては、検索条件をその都度設定してDirectorySeacherクラスに入れること、検索結果からオブジェクトを登録するメソッドGetDirectoryEntryを使う、というあたりでしょうか?Windows Server 2012でやってますが、それ以外のWindowでも大丈夫だと思います。

    $objDomain = New-Object System.DirectoryServices.DirectoryEntry
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = $objDomain
    $objSearcher.SearchScope = "Subtree"
    $csvDatas = Import-Csv -path "(path)"
    
    foreach($csvData in $CsvDatas) {
        $cn = $csvData.cn
    $userPrincipalName = $csvData.userPrincipalName
    $unicodePwd = $csvData.unicodePwd $strFilter = "(&(objectCategory=User)(cn=$cn))" $objSearcher.Filter = $strfilter $objUser = ($objSearcher.Findone()).GetDirectoryEntry() $objUser.Put("userPrincipalName",$userPrincipalName) $objUser.SetPassword($unicodePwd.ToString()) $objUser.setInfo() }
    追記:実現できてよかったです。コードが間違ってました(GetDirectoryEntry)ので、直しておきました。(たぶん)ご迷惑をかけました。


    2012年9月30日 0:59
    モデレータ
  • minminnana_prof様、チャブーン様

    ご返信が遅くなり大変申し訳御座いません。

    昨日、チャブーン様のスクリプトを基に新規にスクリプトを作成したところ、更新することが出来ました。

    質問の意図が不明確であったことのお詫び致します。

    お忙しい中、お二人にご回答を頂けたことを嬉しく思います。

    本当に有難うございます。

    【補足】

    今回、New-ADUser等のPowershellコマンドを使わずにプロパティを変更したいと思ったのは、

    Powershellの書籍で学習していた際に、Create関数を使ったユーザー作成は記述されていたのですが、

    変更は記載されておりませんでした。

    興味本位で調べては見たものの、見つからずこちらで質問をさせて頂きました。

    個人的な興味での質問であり、誠に恐縮では御座いましたが、ご回答を頂き有難う御座います。

    2012年10月2日 0:49