【问题标题】:How to read TermainsServices IADsTSUserEx Property from LDAP in C#?如何在 C# 中从 LDAP 读取 TermainsServices IADsTSUserEx 属性?
【发布时间】:2008-12-10 09:19:22
【问题描述】:

我从 AD 中阅读了以下属性,

TerminalServicesProfilePath
TerminalServicesHomeDirectory
TerminalServicesHomeDrive

我已经尝试过 DirectoryEntry 和 DirectorySearcher。但它们不包括属性。

我在 vbscript 和 VC 中找到了一些示例来阅读它们。 但是我未能使其在 C# 中工作。我错过了一些棘手的事情吗?

编辑:我必须在“Windows Server”上运行它才能使其工作吗? win XP 可以读取吗?

【问题讨论】:

  • 我不确定您是否需要 Windows Server,但这就是我正在使用的 (Server 2003)。恐怕我手边没有 XP。

标签: c# ldap c#-2.0 terminal-services iadstsuserex


【解决方案1】:

我认为您可以在您的DirectoryEntry 上使用InvokeGet 方法,传入您要读取的属性的名称。

2008-12-10 11:50 CET — 已根据评论进行编辑

如果我指定一个垃圾属性名称,我会得到相同的 COM 异常。您确定要检索的属性是 AD 架构的一部分吗?

为了确定,我使用的代码如下:

using (DirectorySearcher searcher = new DirectorySearcher("(cn=Test)"))
{
    SearchResult result = searcher.FindOne();
    if (result != null)
    {
        DirectoryEntry entry = result.GetDirectoryEntry();
        string s = entry.InvokeGet("TerminalServicesHomeDrive") as string;
        MessageBox.Show(s ?? "null");
    }
}

【讨论】:

  • 我试过了,失败了。 System.Runtime.InteropServices.COMException:未知名称。 (来自 HRESULT 的异常:0x80020006 (DISP_E_UNKNOWNNAME))
  • 对于其他具有“未知名称”异常的人——这是因为未安装终端服务器扩展。很容易做到这一点是install远程服务器管理工​​具(RSAT)并在Windows功能中激活它们,或者如果你有适当的DLL,你可以运行其他人提到的“regsvr32 tsuserex.dll”。
  • 这对我来说很好用。您需要检查所需的 tsuserex.dll(x86 或 x64)是否在正确的系统文件夹(c:\windows\system32 或 c:\windows\syswow64)中,然后从系统文件夹运行 resvr32。如果您没有 dll,您可以从另一台机器复制,它们应该可以工作。
【解决方案2】:

我记不太清了,大概是这样的:

//user is a DirectoryEntry
IADsTSUserEx adsiUser = (IADsTSUserEx)user.NativeObject; 

然后您可以通过 adsiUser 获取所需的 TerminalServices 属性。

根据我的经验,由于您使用的库,您最好在可以访问 AD 的 Windows Server 上进行开发。那么你可能也会完成上述工作:)

【讨论】:

  • 我也试过了,但出现 System.InvalidCastException:无法将“System.__ComObject”类型的 COM 对象转换为接口类型“TSUSEREXLib.IADsTSUserEx”。
  • 你确定 TS ADSI 扩展 DLL 是通过 regsvr32 在 COM 系统中注册的吗(我在某处网上从 Joe Kaplan 那里得到的一个提示)。
  • 谢谢,终于搞定了。我必须在我的应用程序启动之前运行 regsvr32。 (我昨天忘记重启我的 nunit)
【解决方案3】:

这对我有用:

            DirectoryEntry user = new DirectoryEntry("LDAP://" + sLDAP_SERVER + "/cn=" + SAMAccount + "," + sLdapFullPath, sUser, sPwd);

            //ActiveDs.IADsUser iADsUser = (ActiveDs.IADsUser)user.NativeObject;
            ActiveDs.IADsUser cont = null;

            cont = user.NativeObject as ActiveDs.IADsUser;

            TSUSEREXLib.IADsTSUserEx m_TsUser = (TSUSEREXLib.IADsTSUserEx)cont;
            int m_TSLogonDisabled = 0;

            m_TsUser.AllowLogon = m_TSLogonDisabled;

【讨论】:

  • 好奇,这个例子中接口的变化如何处理失败。是 m_TsUser 设置为 null,还是引发了异常?
猜你喜欢
  • 2019-07-07
  • 2010-12-08
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多