【问题标题】:DirectoryEntry string working as literal but not as formatted string?DirectoryEntry 字符串作为文字但不是格式化字符串?
【发布时间】:2023-03-04 13:52:01
【问题描述】:

好的,所以我正在尝试将用户从活动目录拉到 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);

结果如下:

【问题讨论】:

  • 抱歉,我用它们作为占位符。我已经更新了 OP 以显示我传入的实际值。
  • 我觉得我应该为我糟糕的打字道歉。 /责备技术
  • 请出示初始化变量的代码:cn, group, ou, domain1, domain2
  • 我猜你在动态组合字符串的变量中有一些不可见的字符。例如,如果有一个制表符,我认为它不会显示在消息框中。字符串的长度是否相同?如果你逐个字符比较它们,它们是否相同? (您可以为此使用 Linq 的 Enumerable.SequenceEqual。)
  • 是的,字符串长度相同

标签: .net c#-4.0 active-directory directoryentry


【解决方案1】:

我尝试了您的代码并填写了格式变量,它对我有用,正如您在屏幕截图中看到的那样。

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

您应该真正检查输入变量中的内容。也许你有一些看不见的字符。将您的输入变量转换为字节数组并打印出该数组以更深入地了解其中的内容。

【讨论】:

  • 我一直在测试变量,但它们一直在失败。不过没关系。我们找到了另一种解决大局的方法,这似乎奏效了。
【解决方案2】:

我认为硬编码字符串有问题,因为如果您将硬编码值复制到变量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();

【讨论】:

    【解决方案3】:

    嗯,你为什么不尝试用 string.format 对值进行硬编码,如果这样的话,你的变量有问题。

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

    除此之外,我不认为为什么它不能与硬编码一起工作,而且它们都是字符串,毕竟。

    【讨论】:

    • 就像我说的,我比较了字符串并且它们是相同的。仅针对 S&Gs,我尝试对 string.format 中的值进行硬编码并得到相同的错误。
    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 2012-03-26
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多