好的,所以我试图将用户从活动目录拉到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);
结果如下:
答案 0 :(得分: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);
你应该检查输入变量中的最新信息。也许你有一些看不见的字符。将输入变量转换为字节数组并打印出数组,以便更深入地了解您所拥有的内容。
答案 1 :(得分: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();
答案 2 :(得分:0)
string ldap = string.Format("LDAP://CN={0}, OU={1}, OU={2}, DC={3}, DC={4}", "Name", "Department", "Group", "Domain1", "Domain2");
除此之外,我不会想到为什么它不能使用硬编码,没有,它们都是字符串,毕竟。