2013-12-03 3 views
1

Я читал, что в 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

И результат такой же. Любые возможности?

+0

Что вам действительно нужно, это 'Enter-PSSession', я думаю. Затем создайте очередь, которая вам нужна «локально». – abatishchev

+0

Привет, абатищев, я попробовал ваше решение. Странная вещь: при выполнении скрипта есть ошибка, но я не вижу очередь на удаленном сервере. – Samuel

ответ

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 
    

    , который просто может означать, что он не работает с удаленными компьютерными именами.

+0

Привет, Джои, так значит ли это, что NO-WAY создает приватную очередь сообщений на удаленном сервере через Powershell? – Samuel

+0

Я понятия не имею и никогда не работал с этим. Я просто указал несколько вещей из документации, которая могла бы помочь. Опять же, это не имеет ничего общего с PowerShell. Вы можете написать тот же самый код в C#, и это не сработает. В конце концов, вы вызываете только методы объектов framework. – Joey

5

Да, создание удаленной очереди с помощью API System.Messaging не поддерживается, но все не потеряно! Используйте powerhell remoting (как предложил @abatishchev), чтобы создать локальную очередь, и она работает нормально.

Я сохранил ваш скрипт в файле (create-queue.ps1), слегка измененный, чтобы установить $queueName = '.\private$\testqueue'. Тогда я использовал invoke-command для запуска скрипта на удаленном сервере:

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

Это предполагает, что вы получили Powershell Remoting включена на целевом сервере. Вы должны получить вывод с сервера, когда он будет завершен, чтобы вы могли диагностировать любые ошибки.

Конечно, вы можете обернуть все это в хорошей функции 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 
} 
+0

Привет, Майк, это потрясающе! – Samuel

+0

Действительно ли это работает? Я по-прежнему получаю ошибку «Недопустимое имя пути в очереди» при попытке создать удаленную приватную очередь на компьютере с удаленным управлением Windows, запущенным и включенным на https://technet.microsoft.com/en-us/magazine/ff700227.aspx – chad

+0

@ChadLazette AFAIK работает. Я тестировал его, когда писал этот пост. –

Смежные вопросы