Powershell远程删除MSMQ

时间:2015-08-26 15:59:01

标签: powershell msmq

我想知道是否可以通过PowerShell远程删除队列?我有以下脚本:

cls

[Reflection.Assembly]::LoadWithPartialName("System.Messaging")

$computers = @("comp1","comp2","comp3");

foreach($computer in $computers) {

    $messageQueues = [System.Messaging.MessageQueue]::GetPrivateQueuesByMachine($computer);

    foreach ($queue in $messageQueues) {
        $endpoint = [string]::Format("FormatName:DIRECT=OS:{0}\{1}", $computer, $queue.QueueName);

        Write-Host $endpoint
        [System.Messaging.MessageQueue]::Delete($endpoint);        
    }
}

这很好用,如果我在我要删除队列的机器上运行它,但是当我远程运行时我得到错误:

The specified format name does not support the requested operation. For example, a direct queue format name cannot be deleted.

如果可以做到这一点有什么想法吗?

修改

奇怪的是,我想我可以通过PowerShell远程登录机器并执行脚本块。但是,我不明白这样做的区别:

此:

$endpoint = [string]::Format("FormatName:DIRECT=OS:{0}\{1}", $computer, $queue.QueueName);
Invoke-Command -ComputerName $computer -ScriptBlock { [Reflection.Assembly]::LoadWithPartialName("System.Messaging"); [System.Messaging.MessageQueue]::Delete($endpoint) };

AND THIS:

Invoke-Command -ComputerName $computer -ScriptBlock { [Reflection.Assembly]::LoadWithPartialName("System.Messaging"); [System.Messaging.MessageQueue]::Delete("FormatName:DIRECT=OS:MY_SERVER\some.endpoint") };

$endpoint的值是相同的,但由于某些奇怪的原因,尽管两个值都相同,但它并不喜欢变量方法。我通过设置$endpoint然后调用delete来测试它。我收到错误:

Exception calling "Delete" with "1" argument(s): "Invalid value  for parameter path."

我想说的是,如果我将该值硬编码为其工作的参数的一部分,但将其分配给变量然后调用我得到错误的方法

3 个答案:

答案 0 :(得分:2)

出于历史目的,如果其他人遇到此问题或想知道如何远程删除队列,请参阅下文。

  1. 如何删除远程计算机上的专用队列?可以远程删除队列。这可以使用命令Enable-PSRemoting -Force来实现。如果没有这个,你会遇到@JohnBreakWell指出的问题(见他的MSDN链接)。

  2. 使用Invoke-Command时变量的范围?我发现的问题是我声明的变量超出了范围(脚本块无法看到它)。为了纠正这个问题,我只做了以下几点:

  3. 重要的是argument list和使用param

     $computers = @("comp1","comp2");
    
        foreach($computer in $computers) {
            [Reflection.Assembly]::LoadWithPartialName("System.Messaging"); 
    
            $messageQueues = [System.Messaging.MessageQueue]::GetPrivateQueuesByMachine($computer);
    
            foreach ($queue in $messageQueues) {
                $endpoint = [string]::Format("FormatName:DIRECT=OS:{0}\{1}", $computer, $queue.QueueName);
    
                Enable-PSRemoting -Force
                Invoke-Command -ComputerName $computer -ScriptBlock {
                    param ($computer, $endpoint)
                    [Reflection.Assembly]::LoadWithPartialName("System.Messaging"); 
                    [System.Messaging.MessageQueue]::Delete($endpoint) 
                }
    
            } -ArgumentList $computer, $endpoint
    
        }
    

答案 1 :(得分:0)

您无法删除远程专用队列。 您需要在本地对队列执行操作。

来自MQDeleteQueue

<强>说明
(第2段)
&#34;在远程计算机上注册的专用队列...无法删除。&#34;

答案 2 :(得分:0)

正如Schizo博士所说,你需要执行

Enable-PSRemoting -Force

在远程计算机上,但是,假设您使用的是Server 2012 r2,它就像以下一样简单:

Invoke-Command -ComputerName COMPUTERNAME { Get-MsmqQueue -Name QUEUENAME | Remove-MsmqQueue }