Powershell 远程实例化COM对象会出现错误80040154,但在本地有效

Powershell 远程实例化COM对象会出现错误80040154,但在本地有效,powershell,com,dcom,Powershell,Com,Dcom,我试图远程实例化Shell.Application.1,但它在检索COM类工厂时出错。DLL是注册的,如果我登录到远程机器并在本地实例化它(没有IP地址),它就会工作。PoC代码: $com = [activator]::CreateInstance([type]::GetTypeFromProgID("Shell.Application.1","192.168.0.11")) Exception calling "CreateInstance" with "1" argument(s): "R

我试图远程实例化Shell.Application.1,但它在检索COM类工厂时出错。DLL是注册的,如果我登录到远程机器并在本地实例化它(没有IP地址),它就会工作。PoC代码:

$com = [activator]::CreateInstance([type]::GetTypeFromProgID("Shell.Application.1","192.168.0.11"))
Exception calling "CreateInstance" with "1" argument(s): "Retrieving the COM class factory for remote component with CLSID
{13709620-C279-11CE-A49E-444553540000} from machine 192.168.0.11 failed due to the following error: 80040154 192.168.0.11."
At line:1 char:1
+ $com = [activator]::CreateInstance([type]::GetTypeFromProgID("Shell.A ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : COMException
在192.168.0.11上:

PS C:\Windows\system32> $com = [activator]::CreateInstance([type]::GetTypeFromProgID("Shell.Application.1"))
PS C:\Windows\system32> $com | gm


   TypeName: System.__ComObject#{286e6f1b-7113-4355-9562-96b7e9d64c54}

Name                 MemberType Definition
----                 ---------- ----------
AddToRecent          Method     void AddToRecent (Variant, string)
BrowseForFolder      Method     Folder BrowseForFolder (int, string, int,

我已经尝试重新注册DLL,但仍然收到相同的错误

回答:该对象不是已注册的DCOM对象

COM对象不能跨网络使用,但可以用于此目的。我不相信该对象已注册为DCOM对象,因此您无法在上面尝试时直接远程调用它。但是,如问题注释中所示,您可以使用PowerShell远程处理在本地上下文中实例化远程服务器上的对象



实际上,您可以直接在
Enter PSSession
上指定
-ComputerName
,但是,我喜欢创建一个
$session
变量,以便根据需要离开并重新进入同一会话


您能否从远程计算机的
Invoke命令
块中实例化该对象?是的,
Invoke命令-ComputerName LAB01-ScriptBlock{$com=[activator]::CreateInstance([type]::GetTypeFromProgID(“Shell.Application.1”)}
Invoke-Command -ComputerName LAB01 {
  $com = [activator]::CreateInstance([type]::GetTypeFromProgID("Shell.Application.1"))
}
$session = New-PSSession -ComputerName LAB01
Enter-PSSession $session
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("Shell.Application.1"))
Exit-PSSession