使用PowerShell脚本安装COM +组件的问题

时间:2015-12-18 01:26:19

标签: windows powershell com powershell-v2.0 com+

我正在尝试使用PowerShell安装COM +组件。但我得到了以下错误。

Unable to find type [some.dll]. Make sure that the assembly that contains this 
type is loaded.

+     $comAdmin.InstallComponent("test", [some.dll]);
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (COMITSServer.dll:TypeName) [], Runtime 
   Exception
    + FullyQualifiedErrorId : TypeNotFound

这是我的powershell脚本:

安装COM +组件

  $comAdmin = New-Object -comobject COMAdmin.COMAdminCatalog;
    $comAdmin.InstallComponent("some", [some.dll]);
    #if an exception occurs in installing COM+  then display the message below
    if (!$?)
    {
        Write-Host "Unable to Install the COM+ Component. Aborting..."
        exit -1
    }

我的powershell版本是4.0 有人可以帮我这个。

谢谢。

2 个答案:

答案 0 :(得分:0)

PowerShell中的方括号表示类型,例如[string][int32][System.Array][System.Math]。错误消息是抱怨,因为您告诉PowerShell COMITSServer.dll是已注册和加载的数据类型。

此外,InstallComponent COMAdminCatalog方法在我看来有四个参数,而不是两个。您应该能够通过查看定义来确认,但我不知道v2.0是否支持这样做:

PS U:\> $comAdmin = New-Object -comobject COMAdmin.COMAdminCatalog
PS U:\> $comAdmin | gm | where { $_.Name -eq 'InstallComponent' }


   TypeName: System.__ComObject#{790c6e0b-9194-4cc9-9426-a48a63185696}

Name             MemberType Definition
----             ---------- ----------
InstallComponent Method     void InstallComponent (string, string, string, string)

因此,我会尝试这个:

$comAdmin.InstallComponent("ITSServerOO2", "COMITSServer.dll", "", "");

这似乎是VB代码here调用相同方法的方式:

'  Open a session with the catalog.
'  Instantiate a COMAdminCatalog object. 
Dim objCatalog As COMAdminCatalog
Set objCatalog = CreateObject("COMAdmin.COMAdminCatalog")

[...]

'  Install components into the application.
'  Use the InstallComponent method on COMAdminCatalog. 
'  In this case, the last two parameters are passed as empty strings.
objCatalog.InstallComponent "MyHomeZoo","MyZoo.DLL","","" 

Here是该函数的类定义,我相信,虽然我对COM +不太熟悉,但不知道COMAdminCatalog和ICOMAdminCatalog是否相同。

答案 1 :(得分:0)

这是关于0x80110401 HRESULT的问题的答案。 (顺便说一下,后续问题应该在关于SO的新帖子中回答,而不是在现有问题的评论中)。这允许其他人在遇到相同问题时找到答案。

ICOMAdminCatalog::InstallComponent的文档。正如文档解释的那样,第一个参数是GUID,第二个参数是要注册的DLL。第三个参数(typelib)和第四个(代理存根DLL)是可选的,可以指定为空字符串。

"测试"不是有效的GUID。请注意,GUID是一种不同的.NET类型(System.Guid)。但是文档要求BSTR转换为System.String。要将新GUID作为字符串使用,请使用:[Guid]::NewGuid().toString()

请注意,COM +组件的GUID是众所周知的"实现接口的COM服务器和使用COM服务器接口的客户端使用的值。因此,通常您不希望在注册COM服务器时生成新的GUID,但使用开发人员在开发COM服务器时创建的GUID。但是,如果您不知道要使用的GUID是什么,那么生成新的GUID至少可以让您在开发脚本方面取得进展。

这可能会或可能不会解决导致0x80110401的问题,但它肯定会解决您迟早会遇到的问题。