1

Когда РМКО выполнив следующую команду локально на моем Exchange Server,Remote Powershell: Термин 'Where-Object' не распознается в "Invoke-Command"

$username = 'username'; $password = ConvertTo-SecureString 'password' -asplaintext -force; $UserCredential = New-Object -TypeName System.Management.Automation.PSCredential -argumentlist $username,$password; $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri 'http://exchange.myfirm.local/PowerShell' -Authentication Kerberos -Credential $UserCredential; Invoke-Command -Session $Session {Get-Mailbox -RecipientTypeDetails 'SharedMailbox' | Get-MailboxPermission | Where-Object User -like 'anotherusername' | fl identity} 

я получаю сообщение об ошибке:

The term 'Where-Object' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. 
    + CategoryInfo   : ObjectNotFound: (Where-Object:String) [], CommandNotFoundException 
    + FullyQualifiedErrorId : CommandNotFoundException 
    + PSComputerName  : exchange.myfirm.local 

Как я могу добавить это командлет к этой «сессии» или получить эту проблему?

Фон: Iam пытается автоматизировать некоторые вещи удаленно с помощью ruby-скрипта, используя winrm, и havent нашел другую альтернативу для подключения к слою «Powershell» Exchange Powershell.

В «реальной» среде управления Exchange эта команда работает нормально (поэтому я не думаю, что вся установка PowerShell нарушена (модуль Microsoft.PowerShell.Utility)). Я думаю, что это больше похоже на то, как я соединяюсь с этой оболочкой над «New-PSSession» и «Invoke-Command».

Если это помогает, вот код рубин (но я думаю, что это не имеет ничего общего с тем, как я подключиться к PowerShell удаленно - но если есть гораздо лучший способ, дайте мне знать, пожалуйста):

require 'winrm' 

$exch_user = 'username' 
$exch_password = 'password' 

endpoint = 'http://ipaddress:5985/wsman' # this is the connection URI to the Exchange 
connectionuri = 'http://exchange.myfirm.local/PowerShell' # keep in mind that the PowerShell URI MAY have to be a FQDN 
winrm = WinRM::WinRMWebService.new(endpoint, :plaintext, :user => $exch_user, :pass => $exch_password, :basic_auth_only => true) 
executor = winrm.create_executor 

exch_cmd = "Get-Mailbox anotherusername | Select-Object -expand EMailAddresses alias" 

command = "powershell -NonInteractive -WindowStyle Hidden -command \" $username = '#{$exch_user}'; $password = ConvertTo-SecureString '#{$exch_password}' -asplaintext -force; $UserCredential = New-Object -TypeName System.Management.Automation.PSCredential -argumentlist $username,$password; $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri '#{connectionuri}' -Authentication Kerberos -Credential $UserCredential; Invoke-Command -Session $Session {#{exch_cmd}}\"" 

#$i = 0 
$a ||= Array.new 
executor.run_cmd(command) do |stdout, stderr| 
    stdout.each_line do |l| 
     $a << l[21..-1] if l.match(/^AddressString/) 
    end 
    #STDOUT.print "#{stdout}" 
    #STDERR.print stderr 
    #STDOUT.print stdout.class #string 
    #STDOUT.print stdout.scan 'AddressString' 
    #$i += 1 
end 

puts $a.sort 

ответ

1

Where-Object есть а PowerShell команд не команда Обмен ...

При создании новой сессии для обмена, она включает в себя только обмен командлеты, поэтому Where-Object не один из них.

Что вы можете сделать, это Импортируйте сессии, а затем запустить его в текущей сессии, например:

$username = 'username' 
$password = ConvertTo-SecureString 'password' -AsPlainText -Force 
$UserCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username,$password 
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri 'http://exchange.myfirm.local/PowerShell' -Authentication Kerberos -Credential $UserCredential 
Import-PSSession $Session 

Затем запустите его:

Get-Mailbox -RecipientTypeDetails 'SharedMailbox' | Get-MailboxPermission | Where-Object User -like 'anotherusername' | fl identity 

Это, однако, не будет работать:

Invoke-Command -Session $Session -ScriptBlock { 
Get-Mailbox -RecipientTypeDetails 'SharedMailbox' | Get-MailboxPermission | Where-Object User -like 'anotherusername' | fl identity 
}