我正在尝试使用C#和目录服务进行一些简单的数据检索,但由于某种原因,它无法在任何XP计算机上运行。如果我在Server 2003机器上运行我的代码,则没有问题。我花了相当多的时间试图找出是否有一些可再发行版本我需要在XP上或者功能根本不存在,但我发现其他开发人员在XP下使用类似的代码。如果有人有任何经验或建议分享,我会很感激。
一个简单的代码片段让我崩溃:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.DirectoryServices;
namespace IIS_Site_Query_Tool
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
DirectoryEntry W3SVC = new DirectoryEntry("IIS://localhost/w3svc");
foreach (DirectoryEntry Site in W3SVC.Children)
{
//Do some data processing
}
}
}
}
在XP下运行这个给出了以下错误,HRESULT为-2147463168:
System.Runtime.InteropServices.COMException was unhandled
Message="Unknown error (0x80005000)"
Source="System.DirectoryServices"
ErrorCode=-2147463168
StackTrace:
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_IsContainer()
at System.DirectoryServices.DirectoryEntries.ChildEnumerator..ctor(DirectoryEntry container)
at System.DirectoryServices.DirectoryEntries.GetEnumerator()
...
在错误中搜索各种信息让我觉得这是一个非常通用的COM互操作错误,而且我现在已经没有想法了。任何帮助表示赞赏!
答案 0 :(得分:1)
根据堆栈跟踪和反射器,看起来ADsOpenObject的调用正在返回E_ADS_BAD_PATHNAME。此错误表示您提供给DirectoryEntry类的路径在当前计算机上无效。
如果安装了IIS,则可能是您的计算机上未正确安装IIS提供程序。
有关详情,请参阅此SO问题:ADSI will not connect to IIS from XP Workstation
答案 1 :(得分:0)
安装IIS修复它。在编写这个小实用程序之前我没有遇到ADSI,所以我没有意识到软件可以安装自己的ADSI功能块。谢谢你的帮助!