2012-02-20 95 views
0

好了,所以我试图从Active Directory用户拉入一个DirectoryUser对象,如果我喜欢这种类型,它工作得很好:DirectoryEntry字符串作为文字而不是格式化字符串?

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); 

这里是结果:

enter image description here

+0

道歉,我用它们作为占位符。我已经更新了OP,以显示我通过的实际值。 – Sinaesthetic 2012-02-21 15:46:50

+0

我觉得我应该为我糟糕的打字道歉。 _ /指责technology_ – 2012-02-21 15:49:43

+1

请出示用来初始化变量代码:'CN,组,OU,域1,domain2' – sll 2012-02-21 16:43:25

回答

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); 

Message

你真的应该检查什么在你的输入变量。也许你有一些看不见的字符。将输入变量转换为字节数组并打印出数组以获得更多信息。

+0

我继续测试这些变量,并且它们保持失败。它确定,但。我们找到了另一种方式去了解更大的局面,这似乎正在起作用。 – Sinaesthetic 2012-02-21 17:20:54

0

嗯,你为什么不尝试在硬编码的String.Format的值,如果你的作品你的变量有问题。

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

除此之外,我不认为它为什么不会与硬编码和没有工作,他们两个都是字符串,毕竟。

+0

就像我说的,我比较了字符串和'是相同的。只是为了S&G,我努力在string.format中编码值,并得到了相同的错误。 – Sinaesthetic 2012-02-21 15:36:19

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();