none
PowerShellを使用したActive Directoryへのユーザー登録でのエラー RRS feed

  • 質問

  • Visual Stuion 2013

    .Net Framework 4.0

    Name属性に半角記号の括弧「)」が含まれていると例外が発生します。

    var remoteCredential = new PSCredential("adminuser",
                "pwdstring".Aggregate(new System.Security.SecureString(), (s, c) =>
                {
                    s.AppendChar(c);
                    return s;
                }));
    
                string plainPassText = (string)prmht["AccountPassword"];
                System.Security.SecureString secStr = new System.Security.SecureString();
    
                foreach (char c in plainPassText)
                    secStr.AppendChar(c);
                
                using (Runspace rs = RunspaceFactory.CreateRunspace())
                {
                    rs.Open();
    
                    using (PowerShell ps = PowerShell.Create())
                    {
                        PSCommand pscmd = new PSCommand();
    
                        pscmd.AddCommand("New-ADUser");
                        
                        pscmd.AddParameter("Name", "123) 例 太郎");
                        pscmd.AddParameter("DisplayName", "123) 例 太郎");
                        ...
                        pscmd.AddParameter("Credential", remoteCredential);
                        pscmd.AddParameter("Enabled", true);
    
                        ps.Commands = pscmd;
                        ps.Runspace = rs;
    
                        //'System.Management.Automation.CmdletInvocationException' の初回例外が System.Management.Automation.dll で発生しました
                        //ディレクトサービスを利用できません とエラー
                        System.Collections.ObjectModel.Collection<PSObject> pso = ps.Invoke();
                    }
                }

    ADを確認すると、登録されていますが無効の状態です。

    括弧がなければ正常に登録されます。

    エラーの回避策についてご教示ください。


    • 編集済み TwSoft 2015年11月19日 4:27
    • 移動 星 睦美 2015年11月19日 6:00 MSDN >.NET Framework から
    2015年11月19日 4:25

回答

  • チャブーンです。

    この件ですが、これだけだとなんなので、わかった範囲ですが簡単に解説をしておきます。

    まずご懸念の「Active Directory LDAP」で")"が禁則文字かどうかですが、禁則文字ではありません。したがってDNの一部としても、もちろん使えます。

    New-ADUserあるはSet-ADaccountPassword等でパスワードを指定すると、エラーが出ることが確認されましたが、少なくともActive Directoryのせいではなく、パスワード設定時だけ")"があることでDNを誤認識する挙動になっているようです(内部は調べていませんので、今はわからないです)。

    ちなみに、Active Directoryパスワードポリシーを「パスワード0文字OK」で設定すると、-Enabled $Trueで普通にアカウントが作成できますが、パスワードを同時設定しようとするとやはりエラーです。本当にパスワード設定だけの問題、という認識です。

    この問題をひとまず回避するには、要はこのロジックを使わなければいいので、以下の操作を行っています。

    1. パスワード無設定のアカウントを作成する。「無効」の状態で作成すれば、まったく無問題。
    2. ADSIでアカウントオブジェクトを取得しなおし、SetPasswordメソッドでパスワードを設定。
    3. 2の状態でaccountDisabledをFalseに設定し、有効化する(パスワード無設定だと有効化はできません)
    4. 最後に設定内容をコミット。

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

    • 回答としてマーク TwSoft 2015年11月24日 1:02
    2015年11月19日 13:49

すべての返信

  • フォーラム オペレーターの星 睦美です。
    TwSoft さん、.NET Framework フォーラムに投稿ありがとうございます。
    質問の内容からPowerShell に関するフォーラム、またはActive Directory に関するフォーラムでユーザーから回答が見つかるのではないかと思います。

    ")" は禁則文字として扱われる場合が多いため使用する際には配慮が必要ですが、プログラム以外の方法で登録した場合にActive Directoryで使用可能であれば、PowerShell のプログラム中での対応が可能かどうか調査してみることになると思います。(すでにTwSoft さんがActive Directory で使用可能かどうか確認済みでしたら、PowerShell フォーラムに質問を移動させていただきます。)
    お手数ですが、今回の質問にどちらのフォーラムが適当かどうかお知らせください。

    フォーラムのご利用方法(質問の投稿)について

    フォーラムのヘルプ




    フォーラム オペレーター 星 睦美 - MSDN Community Support


    • 編集済み 星 睦美 2015年11月19日 5:10 編集
    2015年11月19日 5:05
  • PowerShell ISEのスクリプトウィンドウに以下のように記述し実行しました。

    New-ADUser -SamAccountName test123 -Name "123`)` テスト 太郎"  -SurName テスト -GivenName 太郎 -Path ...

    ディレクトリサービスを利用できません。というエラーになります。

    (無効なアカウントとしてADに登録されます)

    したがって、c#依然の問題のようです。

    PowerShellフォーラムに投稿すべき内容でした。


    • 編集済み TwSoft 2015年11月19日 6:09
    2015年11月19日 5:42
  • チャブーンです。

    確かに、おっしゃる通りADUser系のコマンドレットを使ってパスワード変更をしようとすると、問題が出るようですね。仕方がないので、したのようなコードはどうでしょうか?(一応動作しますよ)

    New-ADUser -saMAccountName test123 -Name '123) テスト 太郎' -Enabled $False
    $AdPaths="LDAP://" + (Get-ADUser test123).distinguishedName
    $User=New-Object System.DirectoryServices.DirectoryEntry($ADPaths)
    $User.psbase.invoke("SetPassword","P@ssw0rd")
    $User.psbase.invokeset("accountDisabled","False")
    $User.psbase.commitchanges()

    やっていることは、作成したアカウントをADSIで拾い直して、パスワードセット(リセット)と有効化を行っただけです。


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



    2015年11月19日 9:16
  • チャブーンです。

    この件ですが、これだけだとなんなので、わかった範囲ですが簡単に解説をしておきます。

    まずご懸念の「Active Directory LDAP」で")"が禁則文字かどうかですが、禁則文字ではありません。したがってDNの一部としても、もちろん使えます。

    New-ADUserあるはSet-ADaccountPassword等でパスワードを指定すると、エラーが出ることが確認されましたが、少なくともActive Directoryのせいではなく、パスワード設定時だけ")"があることでDNを誤認識する挙動になっているようです(内部は調べていませんので、今はわからないです)。

    ちなみに、Active Directoryパスワードポリシーを「パスワード0文字OK」で設定すると、-Enabled $Trueで普通にアカウントが作成できますが、パスワードを同時設定しようとするとやはりエラーです。本当にパスワード設定だけの問題、という認識です。

    この問題をひとまず回避するには、要はこのロジックを使わなければいいので、以下の操作を行っています。

    1. パスワード無設定のアカウントを作成する。「無効」の状態で作成すれば、まったく無問題。
    2. ADSIでアカウントオブジェクトを取得しなおし、SetPasswordメソッドでパスワードを設定。
    3. 2の状態でaccountDisabledをFalseに設定し、有効化する(パスワード無設定だと有効化はできません)
    4. 最後に設定内容をコミット。

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

    • 回答としてマーク TwSoft 2015年11月24日 1:02
    2015年11月19日 13:49
  • チャブーンさん。

    ご連絡が遅くなり申し訳ございません。

    パスワード設定だけの問題という件、再現できました。

    ご教示いただいた手順1~4を実行することで作成できました。

    ありがとうございました。

    2015年11月24日 1:05