さて、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);
そしてここに結果がありました:

