【问题标题】:Create private message queue on remote machine在远程机器上创建私人消息队列
【发布时间】:2015-06-07 01:38:00
【问题描述】:

我读到在 C# 中我们不能在远程机器上创建私有队列: Cannot create private message queue on remote server

我的问题是:在 PowerShell 脚本中,我们可以这样做吗?这是我的示例脚本:

echo "Loading System.Messaging..."
[Reflection.Assembly]::LoadWithPartialName( "System.Messaging" )
$msmq = [System.Messaging.MessageQueue]

echo "Create the queue"

$qName = "remoteserver\private$\testqueue"  
if($msmq::Exists($qName))
{
    echo ($qName + " already exists ")           
}
else
{
    echo ($qName + " doesn't exists and now to create ......")      

    $q = $msmq::Create( $qName, $TRUE )     

    echo "Private queues has been created"
}

它说“无效的队列路径名”。我还尝试了一些格式,例如:FormatName:DIRECT=OS:remoteserver\private$\testqueue

结果是一样的。有什么可能吗?

【问题讨论】:

  • 你真正需要的是Enter-PSSession,我想。然后在“本地”创建一个您需要的队列。
  • 您好 abatishchev,我尝试了您的解决方案。奇怪的是:执行脚本时出错,但是在远程服务器上看不到队列。

标签: windows powershell message-queue powershell-remoting


【解决方案1】:

是的,似乎不支持通过 System.Messaging API 创建远程队列,但一切都没有丢失!使用 powershell 远程处理(正如@abatishchev 建议的那样)创建一个本地队列,它工作得很好。

我将您的脚本保存到一个文件 (create-queue.ps1) 中,稍作修改以设置 $queueName = '.\private$\testqueue'。然后我用invoke-command在远程服务器上运行脚本:

Invoke-Command -ComputerName remoteserver -FilePath .\create-queue.ps1

这假设您已在目标服务器上启用了 powershell 远程处理。完成后,您应该会收到来自服务器的输出,以便能够诊断任何错误。

如果您必须经常这样做,您当然可以将这一切包装在一个不错的 powershell 函数中:

function Create-MessageQueue {
    param([string]$QueueName,[string]$ComputerName = ".")

    $script = {
        param($qName)

        [Reflection.Assembly]::LoadWithPartialName('System.Messaging') | out-debug
        $msmq = [System.Messaging.MessageQueue]
        $queuePath = ".\private`$\$qName"  
        if($msmq::Exists($queuePath))
        {
            echo "$queuePath already exists "
        }
        else
        {
            echo "'$queuePath' doesn't exists and now to create ......"
            $msmq::Create($queuePath,$true)     
            echo "Private queue '$queuePath' has been created"
        }
    }

    Invoke-Command -ComputerName $ComputerName -ScriptBlock $script -ArgumentList $QueueName
}

【讨论】:

  • 嗨,mike Z,太棒了!
  • 这真的有效吗?尝试在运行 Windows 远程管理并根据technet.microsoft.com/en-us/magazine/ff700227.aspx 启用的计算机上创建远程专用队列时,我仍然收到“无效的队列路径名”错误
  • @ChadLazette AFAIK 它有效。我在写这篇文章时测试了它。
【解决方案2】:

我从文档中收集到的一些信息:

  1. 这与 PowerShell 无关。你也可以用 C# 编写它,但它不会工作。
  2. Exists() 的文档指出 »Exists(String) 方法不支持 FormatName 前缀。« 因此您声明队列名称的替代方式也不起作用。
  3. 双引号字符串中的$ 在PowerShell 中具有重要意义。它用于内联变量扩展。它在这里没有意义,因为它没有形成有效的变量名(或子表达式),因此保持逐字记录。但是您应该在此处使用单引号字符串。如果有疑问,只需将字符串转储到管道上即可查看其值。
  4. Create() 的文档有以下有趣的表格:

    下表显示了此方法是否适用于各种工作组模式。

    Workgroup mode                                              Available
    =====================================================================
    Local computer                                              Yes
    Local computer and direct format name                       Yes
    Remote computer                                             No
    Remote computer and direct format name                      No 
    

    这可能意味着它不适用于远程计算机名称。

【讨论】:

  • 嗨 Joey,这是否意味着无法通过 Powershell 在远程服务器上创建私人消息队列?
  • 我不知道,也从未使用过这些。我只是从文档中指出了一些可能有帮助的东西。同样,这与 PowerShell 无关。您可以在 C# 中编写完全相同的代码,但它不起作用。毕竟你只是在调用框架对象的方法。
猜你喜欢
  • 2011-07-01
  • 2012-09-24
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 2013-01-19
  • 2011-05-23
相关资源
最近更新 更多