2010-01-15 35 views
1

我试图通过编程方式更改终端服务设置。 I learned that you must use tsuserex.dll。作为c#我通过tlbimp运行tsuserex并创建了TSUSEREXLib.dll然后用regasm注册它。我得到它的工作,并写了一个框架程序,它作为一个概念教授。但是,今天当我在运行我的程序时进行了一些更改后,出现错误无法引用先前工作的Dll

无法将类型为'System .__ ComObject'的COM对象转换为接口类型'TSUSEREXLib.IADsTSUserEx'。此操作失败,因为IIC'{C4930E79-2989-4462-8A60-2FCF2F2955EF}'接口的COM组件上的QueryInterface调用因以下错误而失败:没有此类接口支持(异常来自HRESULT:0x80004002(E_NOINTERFACE)) 。

它thows上线

IADsTSUserEx iad = (IADsTSUserEx)((DirectoryEntry)user.GetUnderlyingObject()).NativeObject; 

这个确切的行测试项目工作的罚款除外。我知道用户是一个有效的UserPrincipal,谷歌我发现这通常只是需要重新注册的DLL,但即使卸载和重新加载它仍然无法正常工作。我错过了什么导致我的dll停止工作。

回答

3

我知道这是一个古老的线程,但因为我有麻烦找最近所有必要步骤,以获得终端服务组件在Windows 7上的工作,我想分享我发现了什么。我认为以下步骤比从服务器复制tsuserex.dll并尝试注册它更可靠。

据我了解,在任何操作系统上需要的用户帐户的安装才能修改终端服务远程服务器管理工​​具(RSAT)属性编程。在某些版本的Windows上,这需要下载。但在Windows 7上,RSAT已经安装。

但是你可能需要使用控制面板(APPWIZ.CPL)在配置选项来启用它。在“打开或关闭Windows功能”下,转到“远程服务器管理工​​具”,然后确保选中“远程桌面服务工具”。

当我这样做(并重新启动)后,我能够通过PowerShell使用tsuserex.dll中的组件(例如,Set-QADUser -Identity testUser -TsHomeDirectory“c:\ tshome”),并通过添加引用Visual Studio 2010(“tsexusrm 1.0类型库”)。

+0

这救了我。谢谢! – ErnieL 2012-10-23 20:58:19

0

你几乎可以肯定需要在目标机器上重新注册你的TLB。可能发生的情况是,您的程序集中的接口或类型GUID没有在应用程序中进行硬编码,因此每次重建都会对其进行更改。因此,重建和部署您的类型后,不再与以前注册的TLB相匹配。

+0

我在运行它本地并获取此错误消息。而且我已经重新注册了TLB并仍然收到了该消息。 我在哪里可以在TLB创建过程中硬编码GUID? – 2010-01-15 21:16:01

+0

@Scott,尝试在注册表中查找对您的DLL名称的引用并手动删除它们,然后重新注册。 – JaredPar 2010-01-15 21:18:13

+0

@JaredPar,我删除了regrestry中所有DLL的名称和GUID参考条目,但我仍然得到相同的错误。 – 2010-01-15 22:11:24

0

正确的答案是,我不reliseing我的构建环境的确改变了一个白痴。当我开始执行这个项目时,我转移到了一个新的工作环境,那就是windows 7 corprate而不是server 2003。 Win7 corp在其系统中没有tsuserex.dll。

+1

请注意32位和64位版本的DLL。我将win 2008服务器的错误版本复制到了我的64位Win7工作站,并且获得了ComExceptions的“很多乐趣”,尽管每个编译都很好。 – hoetz 2011-05-06 14:29:49

0

Visual Studio中生成设置“平台目标”禁用=>“不想32位”解决问题。