0

さて、Active DirectoryからDirectoryUserオブジェクトにユーザーをプルしようとしています。このように入力すると、正常に機能します。

DirectoryEntry user = new DirectoryEntry(@"LDAP://CN=Name, OU=Department, OU=Group, DC=Domain1, DC=Domain2");
user.Properties["thumbnailPhoto"].Clear();

しかし、値を変更できるようにする必要があるので、フォーマットされた文字列を試しました。

string ldap = string.Format("LDAP://CN={0}, OU={1}, OU={2}, DC={3}, DC={4}", cn, group, ou, domain1, domain2);
DirectoryEntry user = new DirectoryEntry(ldap);
user.Properties["thumbnailPhoto"].Clear();

しかし、これは「サーバー上にそのようなオブジェクトはありません」というエラーを引き起こします

コンストラクターは文字列を受け取り、文字通りに書いたときに使用していたのとまったく同じ値を渡しますが、なぜ一方の方法で機能し、もう一方の方法では機能しないのですか?!

編集:ビルドされた文字列がハードコードされた文字列と同じであるかどうかを確認するために、いくつかの異なる方法でダブルチェックしたことを追加したかっただけです。デバッガーを実行し、user.path値をチェックして、文字列がまったく同じように格納されていることを確認しました。これまでのところすべてが同じですが、一方は機能し、もう一方は機能しません。

更新:文字列変数に直接ハードコーディングすると、次のことに気付きました。

string ldap = @"Jeremy Stafford", "IT", "QGT", "QGT", "Local";
DirectoryEntry user = new DirectoryEntry(ldap);

これは問題なく機能します。これは、文字列「type」に問題がある可能性があると私に信じさせます。構築された文字列をプリミティブ文字列(または値型と参照型)に戻すことができれば、うまくいくでしょうか?しかし、私にはそれを行う方法がわかりません。何か案は?

更新:セマンティックテストを実行しました。これが私が使用したコードです:

string ldapFormatted = string.Format("LDAP://CN={0}, OU={1}, OU={2}, DC={3}, DC={4}", cn, group, ou, domain1, domain2);                
                var ldapHardCoded = @"LDAP://CN=Jeremy Stafford, OU=IT, OU=QGT, DC=QGT, DC=Local";
                string message;

                if (ldapFormatted.Equals(ldapHardCoded))
                {
                    message = "They're the same value\n";
                }
                else
                {
                    message = "Strings are not the same value\n";
                }

                if (ldapFormatted.GetType() == ldapHardCoded.GetType())
                {
                   message += "They are the same type";
                }
                else
                {
                    message += "They are not the same type";
                }
                message += "\n\n" + ldapFormatted + "\n" + ldapHardCoded;
                MessageBox.Show(message);

そしてここに結果がありました:

ここに画像の説明を入力してください

4

3 に答える 3

2

私はあなたのコードを試して、フォーマット変数を入力しました。スクリーンショットでわかるように、私にとってはうまくいきます。

  string cn = "Jeremy Stafford";
  String group = "IT";
  string ou = "QGT";
  String domain1 = "QGT";
  string domain2 = "Local";
  string ldapFormatted = string.Format("LDAP://CN={0}, OU={1}, OU={2}, DC={3}, DC={4}", cn, group, ou, domain1, domain2);

  var ldapHardCoded = @"LDAP://CN=Jeremy Stafford, OU=IT, OU=QGT, DC=QGT, DC=Local";
  string message;

  if (ldapFormatted.Equals(ldapHardCoded))
  {
    message = "They're the same value\n";
  }
  else
  {
    message = "Strings are not the same value\n";
  }

  if (ldapFormatted.GetType() == ldapHardCoded.GetType())
  {
    message += "They are the same type";
  }
  else
  {
    message += "They are not the same type";
  }
  message += "\n\n" + ldapFormatted + "\n" + ldapHardCoded;
  MessageBox.Show(message);

メッセージ

入力変数の内容を実際に確認する必要があります。目に見えない文字が含まれている可能性があります。入力変数をバイト配列に変換し、配列を出力して、そこにあるものをより深く理解してください。

于 2012-02-21T16:55:41.473 に答える
1

ハードコードされた値を変数にコピーすると、テストが機能するため、ハードコードされた文字列に何か問題があると思いますcn, group, ...。したがって、変数を初期化するコードを共有してくださいcn, group, ou, domain1, domain2

以下のテストコードは正常に動作します。

 string cn = "Jeremy Stafford";
 string group = "IT";
 string ou = "QGT";
 string domain1 = "QGT";
 string domain2 = "Local";

 string ldap = string.Format("LDAP://CN={0}, OU={1}, OU={2}, DC={3}, DC={4}", 
                             cn, group, ou, domain1, domain2);    
 string ldapFormatted = string.Format("LDAP://CN={0}, OU={1}, OU={2}, DC={3}, DC={4}", 
                                      cn, group, ou, domain1, domain2);                
 var ldapHardCoded = @"LDAP://CN=Jeremy Stafford, OU=IT, OU=QGT, DC=QGT, DC=Local";

 bool bothTheSame = ldapFormatted.Equals(ldapHardCoded) 
                    && 
                    ldapFormatted.GetType() == ldapHardCoded.GetType();
于 2012-02-21T16:45:13.213 に答える
0

うーん、string.format の値をハード コーディングしてみませんか。それが機能する場合は、変数に何か問題があります。

string ldap = string.Format("LDAP://CN={0}, OU={1}, OU={2}, DC={3}, DC={4}", "Name", "Department", "Group", "Domain1", "Domain2");

それ以外は、ハードコーディングがなくても機能しない理由はないと思います。結局のところ、どちらも文字列です。

于 2012-02-21T15:30:12.637 に答える