Создание экземпляра COM-объекта удаленно выдает ошибку 80040154, но работает локально - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь создать экземпляр Shell.Application.1 удаленно, но выдает ошибку при получении фабрики COM-класса. DLL регистрируется, и если я вхожу в удаленную машину и создаю ее экземпляр локально (без IP-адреса), она работает. Po C код:

$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, все равно я получаю ту же ошибку.

Ответы [ 2 ]

0 голосов
/ 30 января 2020

COM-объекты нельзя использовать в сети, но Распределенные COM (DCOM) объекты служат этой цели. Я не верю, что объект Shell зарегистрирован как объект DCOM, поэтому вы не можете напрямую вызывать его удаленно, как вы пытались выше. Однако, как показано в комментариях к вопросу, вы можете использовать удаленное взаимодействие PowerShell для создания экземпляра объекта на удаленном сервере в локальном контексте.


Invoke-Command

Invoke-Command -ComputerName LAB01 {
  $com = [activator]::CreateInstance([type]::GetTypeFromProgID("Shell.Application.1"))
}

Enter-PSSession

$session = New-PSSession -ComputerName LAB01
Enter-PSSession $session
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("Shell.Application.1"))
Exit-PSSession

Вы можете указать -ComputerName непосредственно в Enter-PSSession, однако мне нравится создавать $session переменная, чтобы я мог выйти и повторно войти в тот же сеанс, как необходимо.

0 голосов
/ 29 января 2020

Ответ. Объект не является зарегистрированным объектом DCOM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...