在作为其他用户运行的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 +配置
我还将AD功能帐户添加到我的本地管理员组,但没有成功。
答案 0 :(得分:1)
感谢Lieven Keersmaeker's procmon调试建议,我能够解决问题。
正在解析的已注册dll位于我的旧AD帐户文件夹下的加密文件夹中(最近更改了我的AD sAMAccount)。我在注册表中找到了dll,将路径更改为此dll的更易访问的副本,并且它完美运行!
在此之前我不知道如何正确调试这个问题,也不知道windows究竟是如何解决dll的。我假设在这种情况下dll,dsofile.dll与Interop.DSOFile.dll位于同一目录中,它将解析同一目录中的文件而不是联系到注册表。我现在知道的更好。