【问题标题】:Exception calling .ctor with 0 arguments: Retrieving the COM class factory for component with CLSID {ID} failed. HRESULT: 0x80070005 (E_ACCESSDENIED)使用 0 个参数调用 .ctor 的异常:检索具有 CLSID {ID} 的组件的 COM 类工厂失败。 HRESULT: 0x80070005 (E_ACCESSDENIED)
【发布时间】:2017-12-18 11:30:23
【问题描述】:

在以不同用户身份运行的 powershell 5.1 (x86) 中使用 Interop.DSOFile.dll 函数和类时收到此错误。我使用的帐户是一个 AD 功能帐户,它对包含 dll 的文件夹具有完全权限。我需要使用这个帐户,因为它比我自己的 AD 帐户拥有更多的访问权限来完成所需的工作。

我可以在我自己的用户帐户上毫无问题地运行以下代码,但是当我尝试使用功能帐户时,标题中出现错误。

[System.Reflection.Assembly]::LoadFrom('C:\Path\To\Interop.DSOFile.dll')

New-Object DSOFile.OleDocumentPropertiesClass

这会导致错误:

New-Object : Exception calling ".ctor" with "0" argument(s): "Retrieving the COM class factory for component with CLSID {58968145-CF05-4341-995F-2EE093F6ABA3} failed due to the following error: 80070005 Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))." At line:1 char:1 + New-Object DSOFile.OleDocumentPropertiesClass + CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvoca tionException + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.Power Shell.Commands.NewObjectCommand

我检查了 CLSID 是否存在,并且我可以使用功能帐户看到它,并且它在那里:

gci 'HKLM:\SOFTWARE\Classes\CLSID' | ?{$_.PSChildName -match '58968145-CF05-4341-995F-2EE093F6ABA3'}

Property      : {(default)}
PSPath        : 
Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE
            \Classes\CLSID\{58968145-CF05-4341-995F-2EE093F6ABA3}
PSParentPath  : 
Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE
            \Classes\CLSID
PSChildName   : {58968145-CF05-4341-995F-2EE093F6ABA3}
PSDrive       : HKLM
PSProvider    : Microsoft.PowerShell.Core\Registry
PSIsContainer : True
SubKeyCount   : 2
View          : Default
Handle        : Microsoft.Win32.SafeHandles.SafeRegistryHandle
ValueCount    : 1
Name          : HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{58968145-CF05-4341-9
            95F-2EE093F6ABA3}

我尝试使用来自类似 Stackoverflow 问题的解决方案,这些问题引用使用 Dcomcnfg.exe\DCOM Config 来授予帐户访问权限。 Com+ 配置

  • 进入控制面板 -> 管理员 -> 组件服务 -> DCOM 配置
  • 打开 Microsoft Word 97 - 2003 属性
  • 常规 -> 身份验证级别:无
  • 安全 -> 自定义所有 3 个权限以允许所有人

我也将 AD 功能帐户添加到我的本地管理员组,但没有成功。

【问题讨论】:

  • 该帐户是否有足够的权限来读取注册表项?我会从 Microsoft (sysinternals) 下载 procmon,运行它,运行你的代码,停止它并搜索访问冲突(或使用最适合你的过滤或计数出现)
  • 感谢 Lieven,非常感谢您协助寻找答案。

标签: c# powershell dll dsofile


【解决方案1】:

感谢Lieven Keersmaeker'sprocmon 调试建议,我能够解决问题。

正在解析的注册 dll 位于我的旧 AD 帐户文件夹下的加密文件夹中(我的 AD sAMAccount 最近更改了)。我在注册表中找到了该dll,将路径更改为该dll的更易于访问的副本,并且它运行良好!

在此之前,我不知道如何正确调试这个问题,也不知道 Windows 是如何解决 dll 的。我假设如果 dll(在这种情况下为 dsofile.dll)与 Interop.DSOFile.dll 位于同一目录中,那么它将解析同一目录中的文件,而不是访问注册表。我现在知道得更多了。

【讨论】:

  • "如有疑问,请运行 procmon"。很高兴你能够解决它。
猜你喜欢
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 2012-02-17
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多