Powershell в UIPath.Бросок: невозможно преобразовать объект типа «Microsoft.Exchange.WebServices.Data.GetItemResponse» в тип «System.String». - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь получить электронную почту от Exchange, используя powershell в UI Path.При попытке вернуть элементы я получаю следующую ошибку:

Бросок: невозможно привести объект типа «Microsoft.Exchange.WebServices.Data.GetItemResponse» к типу «System.String».

Даже когда я изменяю TypeArgument в UI Path.В настоящее время я использую действие Invoke Power Shell, но у меня возникают те же проблемы с использованием действия RunPowershellScript.Ниже приведен снимок экрана с моей последовательностью в UI Path, моими параметрами и сценарием PowerShell. Спасибо!

Ui path Screenshot

UI Path Parameters

Param(
[parameter()]
[string]$mailbox,

[parameter()]
[string]$password
)
try{
#https://forum.uipath.com/t/get-argument-from-an-process-with-exception-in-reframework/22537/4
function test-password(){
                $Creds = new-object System.Net.networkCredential -ArgumentList $mailbox, $password

                $mailFolder = "Inbox"
                $itemView = 3

                #[Reflection.Assembly]::LoadFile("C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll")
                $ExSer = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP1)
                $ExSer.Credentials = ($Creds)
                $ExSer.Url = new-object Uri("https://outlook.office365.com/EWS/Exchange.asmx")
                $ExSer.AutodiscoverUrl($mailbox, {$true})


                $setMailFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($ExSer,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)
                $logs2 += "Successfully Connected to mailbox $mailbox"

                $iv = new-object Microsoft.Exchange.WebServices.Data.ItemView($itemView)

                $CustomFilter = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::And)

                $ifIsRead = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::IsRead,$false)
                $ifFrom = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::From,"filteremail@mycompany.com")

                $CustomFilter.add($ifIsRead)
                $CustomFilter.add($ifFrom)

                $filteredEmails = $ExSer.FindItems($setMailFolder.Id,$CustomFilter, $iv)

                $psPropertySet = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
                $psPropertySet.RequestedBodyType = [Microsoft.Exchange.WebServices.Data.BodyType]::Text;
                #add-type "Microsoft.Exchange.WebServices.Data.GetItemResponse"
                $ExSer.LoadPropertiesForItems($filteredEmails,$psPropertySet)

                $item = $filteredEmails.Items[0]

                return $mailbox, $item
    }               


   test-password
}
catch{
        Throw
}

Я прокомментировал загрузочную dll, которая, казалось, работала без нее, и выдает похожую ошибку, когда она ударила по ней.Код, похоже, выдает ошибку, когда он достигает $ Exser.LoadPropertyItems.Я также пытался переключиться на Exchange 2007 и т. Д. Чтобы уточнить, при запуске чисто powershell вне UI Path этот код работает просто отлично.

1 Ответ

0 голосов
/ 05 декабря 2018

Я понял это ... Я просто был дингусом.Он пытался загрузить объект, который его ломал.Если я сохранил его как переменную, а затем преобразовал его в своем скрипте и вернул то, что мне было нужно в виде строки .... угадайте что?Это может понять строку.Ниже мой обновленный PowerShell.

 Param(
[parameter()]
[string]$mailbox,

[parameter()]
[string]$password
)
try{
#https://forum.uipath.com/t/get-argument-from-an-process-with-exception-in-reframework/22537/4
function test-password(){

                $Creds = new-object System.Net.networkCredential -ArgumentList $mailbox, $password

                $mailFolder = "Inbox"
                $itemView = 50

               # Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
                #[Reflection.Assembly]::LoadFile("C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll")
                $ExSer = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP1)
                $ExSer.Credentials = ($Creds)
                $ExSer.Url = new-object Uri("https://outlook.office365.com/EWS/Exchange.asmx")
                $ExSer.AutodiscoverUrl($mailbox, {$true})


                $setMailFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($ExSer,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)
                $logs2 += "Successfully Connected to mailbox $mailbox"

                $iv = new-object Microsoft.Exchange.WebServices.Data.ItemView($itemView)

                $CustomFilter = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::And)

                $ifIsRead = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::IsRead,$true)
                $ifFrom = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::From,"emailtofilterby@mycompany.com")

                $CustomFilter.add($ifIsRead)
                $CustomFilter.add($ifFrom)

                $filteredEmails = $ExSer.FindItems($setMailFolder.Id,$CustomFilter, $iv)

                $psPropertySet = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
                $psPropertySet.RequestedBodyType = [Microsoft.Exchange.WebServices.Data.BodyType]::Text;
                #add-type "Microsoft.Exchange.WebServices.Data.GetItemResponse"
                $FilteredEmailitems = $ExSer.LoadPropertiesForItems($filteredEmails,$psPropertySet) 


                $EmailBody = $FilteredEmailitems.Item(0) | Select-Object -ExpandProperty Item | Select-Object -ExpandProperty Body | Select-Object -ExpandProperty Text

                return $EmailBody
    }               


   test-password
}
catch{
        Throw
}
...