带有0个参数的异常调用.ctor:检索具有CLSID {ID}的组件的COM类工厂失败。 HRESULT:0x80070005(E_ACCESSDENIED)

时间:2017-07-13 15:12:31

标签: c# powershell dll dsofile

在作为其他用户运行的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功能帐户添加到我的本地管理员组,但没有成功。

1 个答案:

答案 0 :(得分:1)

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

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

在此之前我不知道如何正确调试这个问题,也不知道windows究竟是如何解决dll的。我假设在这种情况下dll,dsofile.dll与Interop.DSOFile.dll位于同一目录中,它将解析同一目录中的文件而不是联系到注册表。我现在知道的更好。