.NET Com 互操作帐户

Posted

技术标签:

【中文标题】.NET Com 互操作帐户【英文标题】:.NET Com Interop Account 【发布时间】:2011-06-20 13:36:29 【问题描述】:

我正在用 C# 编写一个 .NET windows 服务。这是在本地系统帐户下运行的。但是,此服务需要调用旧的 COM 组件。这个旧的 COM 组件包含大量使用映射到网络驱动器的驱动器号的文件访问(它不是很好,但我无法重写它)。我假设这个 COM 组件也在本地系统帐户下加载,因此这些驱动器映射将失败,因为它们不存在。

有什么方法可以解决这个问题?我可以在具有这些映射的用户帐户下加载 COM 组件吗?如果有怎么办?或者有没有更好的方法

在一个用户帐户下运行整个 Windows 服务会解决这个问题吗?

【问题讨论】:

可以直接访问 UNC 文件路径而不是驱动器映射吗? 不能在系统账号下运行服务吗? 我假设他不能,但即使这样也无济于事。试试***.com/questions/125341/impersonation-in-net,它可能就是你要找的东西。 @Uwe Keim's 给出了答案。该系统用户具有一些奇怪的仅限本地权限。另一种方法是以您创建的用户身份运行并提供必要的权限。 【参考方案1】:

您可以将组件托管为 COM+ 应用程序,这将允许您指定用户在哪个帐户下运行。然后,您必须做适当的工作才能在 .NET 中正确访问 COM 组件,但它应该可以工作。

另一种选择是让服务可以在您的帐户下运行,然后通过 WCF 进行调用以在服务器中进行调用。

虽然两者的主体是相同的,但您基本上是在另一个应用程序域中进行调用,并在另一个应用程序域和您的应用程序运行的应用程序域之间传递请求/响应。

【讨论】:

【参考方案2】:

重复我的评论作为答案:

代替驱动器映射,你能 直接访问 UNC 文件路径 代替?

添加关于模仿的另一点:

您可以通过(例如)my Impersonator class 模拟您必须在其他用户下运行的代码行,这是我几年前写的。

【讨论】:

正如我所说,我无法重写 com 组件,所以我无法将硬编码驱动器映射更改为 UNC 路径。这是一个垃圾组件 - 我可以这么说,因为我没有写它;)我的手被绑在那个上面。 那么使用部分模拟还应该为您提供要模拟的用户的映射驱动器名称,不是吗?

以上是关于.NET Com 互操作帐户的主要内容,如果未能解决你的问题,请参考以下文章

如何将聚合 .NET COM 互操作添加到 ATL EXE 服务器?

我可以将 .NET 5 COM 互操作对象与 VB6 连接起来吗?

如何指定我的 .NET 互操作应该使用哪个 COM 服务器?

AccessViolationException 在使用 COM 互操作的 .NET 应用程序中随机发生

Visual Studio 2010,TlbImp 在 2.0 项目中生成 .net 4.0 互操作

COM 互操作加载程序集时 AppDomain 的路径