EVERYTHING YOU ALWAYS WANTED TO KNOW ABOUT POWERSHELL * ©2016 LINKEDIN.COM/IN/GAETANOCAUSIO * BUT WERE AFRAID TO ASK
WORKING WITH STRINGS
WORKING WITH STRINGS # Some operations on strings $line = "Hallo, this is a test string" $line = $line.Replace("test", "123") $idx = $line.IndexOf("this") If ( [string]::Compare($stra, $strb, $True) ) { } # case sensitive compare If ($line.StartsWith("Script")) { } $line.Substring(2,3) $line[2] $line[2..4] # not a substring, this is an array ! $items = [Array]($line -split " ") $lineArray = $line.ToCharArray() "Hello $($MyName), today is $(get-date -format 'dd-MM')“ # string concatenation # Formatting "Today is {0:dddd}" -f (Get-Date) # Show day of the week "{0:N2}" -f 1554.22272 # Two decimal positions "{0:P}" -f (5/10) # Percentage "{0:C}" -f 5 # Currency "0x{0:x}" -f 55 # Convert to Hex
WORKING WITH STRINGS # Be careful… if ($abc -eq "") { Write-Host "is null" } # may not work as you expected! if ([string]::IsNullOrEmpty($abc)) { Write-Host "is null" } # this is better... -contains # is designed to work on arrays, not strings -match # looks for a match inside a string and supports regexes –like # looks for a match inside a string and supports wildcards # Regular Expressions If ("192.168.15.20" -match "d{1,3}.d{1,3}.d{1,3}.d{1,3}“) { } If (([regex]::Matches($email, "[0-9]" )).count -gt 0) { } $var = $var -replace '[{]?[0-9a-fA-F]{8}[-]?([0-9a-fA-F]{4}[-]?){3}[0-9a-fA-F]{12}[}]?', '[GUID]‘ $var = $var -replace '(19|20)dd(-)(0[1-9]|1[012])2(0[1-9]|[12][0-9]|3[01]) dd(:)dd(:)dd', '[DATETIME]‘
DATA STRUCTURES
DATA STRUCTURES # Array [Array]$ErrorMessages = @("File does not exist.") $ErrorMessages += "Unable to open file.“ # add item to an array $ErrorMessages[1] = "Unable to open file for writing.“ # change item in an array Write-Host $ErrorMessages[0] # access item from an array # ! you cannot remove items from an array, use a .NET System.Collections.ArrayList instead # reading items in an array: foreach ($message in $ErrorMessages) { Write-Host $message }
 $mixArray = @(12,"David",1.2,$(Get-Date)) $mixArray.length # items in de array # Array of Array [Array]$SkipFiles = @() $SkipFiles +=, @("test.dat", 123) $SkipFiles +=, @("file.dat", 7) Write-Host $SkipFiles[1][0]
DATA STRUCTURES # Dictionary $dict = New-Object 'system.collections.generic.dictionary[string,int]' $dict["David"] = 36 $dict["Joe"] = 27 # Hash Table [hashtable]$ReturnData = @{} $ReturnData.ErrorCode = 23 $ReturnData.ErrorMessage = "Failed to read database" $ReturnData.ProcessedRecords = 0 $ReturnData.DataTable = new-object system.data.datatable return $ReturnData
OPERATIONS ON FILES
OPERATIONS ON FILES # Search or replace text in files Get-ChildItem -Filter "*.xml" -Path "D:data" -Recurse | Select-String -pattern "123456“ (Get-Content "c:temptest.xml").replace('[ID]', '123456') | Set-Content "c:temptest.xml" # Operations on file system Copy-Item "d:datatest.log" "d:temp" Move-Item -path "d:datatest.log" -destination "d:temp" Rename-Item -path "d:datatest.xml" "test.xml.processed" if ($(Test-Path "d:datalogs") -eq $false) { New-Item -Name "logs" -Path "d:data" -ItemType directory } $data | Out-File -Append "d:datafile.dat“ # this will ask for confirmation, not handy in a script: Remove-Item -Path "C:temp" -Filter "*.log" -Force # this works better on a script: Get-ChildItem -Path "C:temp" -Filter "*.log" | Remove-Item -force
OPERATIONS ON FILES # Reading Files [Array]$InRecords = Import-Csv -Path "d:test.csv" -Delimiter ',‘ -Header ID, Name, Age $Data = Get-Content -Path $InputFile [System.Object[]]$Triggers = Get-ChildItem -Filter "*.test.*.trg" -Path "d:data" ForEach ($Trigger in $Triggers) { $Trigger.BaseName $Trigger.Name $Trigger.FullName } # Handy $HashCode = Get-FileHash -Path "$FileName" -Algorithm MD5 $HashCode.Hash
INTERACTIONS WITH OS
INTERACTIONS WITH OS # Accessing environment variables [Environment]::SetEnvironmentVariable("SYS_LOGS", "D:dataLogs", "Machine") $logs = $([Environment]::GetEnvironmentVariable('SYS_LOGS','Machine')) # Accessing Windows Events if(![System.Diagnostics.EventLog]::SourceExists("CleanUp")) { [System.Diagnostics.EventLog]::CreateEventSource("CleanUp",'Application') } Write-Eventlog -logname 'Application' -source "CleanUp" –eventID 17532 -EntryType Information -message "your event message" # Start a DOS batch command Start-Process "D:batchrun.cmd" "-f -v" -Wait -WindowStyle Hidden-WorkingDirectory "D:batch" # Start a PowerShell script from DOS CALL %SystemRoot%system32WindowsPowerShellv1.0powershell.exe -NoLogo -NonInteractive -File "D:scriptstest.ps1"
INTERACTIONS WITH OS # Start - Stop Services Disable-ScheduledTask -TaskName "Run Batch" -TaskPath "MyServices" Stop-Service -DisplayName "MyWindowService" iisreset /restart Stop-Process -processname doc1gen* -Force Restart-WebAppPool "MyWindowService“ # Get information from OS Get-WmiObject -Query "SELECT TotalPhysicalMemory FROM Win32_ComputerSystem" Get-WmiObject -Query "SELECT * FROM Win32_LogicalDisk" -ComputerName CLSERVER3 Get-WmiObject Win32_Processor -cn CLSERVER3 # list of all possible query options for above commands: Get-WmiObject -List | Where-Object { $_.name -match 'memory' }
ABOUT SECURITY
ABOUT SECURITY # Get user information $userAccount = [System.Security.Principal.WindowsIdentity]::GetCurrent() [System.Security.Principal.WindowsPrincipal]$userAccount).IsInRole("Administrator") Get-ADUser -Filter { SAMAccountName -eq ‘USR01A' } -Properties extensionAttribute6 Get-ADUser -Filter { SAMAccountName -like 'usr*' } -Properties SamAccountName # Encrypt a string (i.e. password) ConvertTo-SecureString 'testtest' -AsPlainText -Force | ConvertFrom-SecureString | Out-File -FilePath “c:temppassword.dat" # Decrypt a string $pswdSec = Get-Content "c:temppassword.dat" | ConvertTo-SecureString $bPswd = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pswdSec) $pswd = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bPswd)
USING XML
USING XML # Example of processing an XML file [XML]$XML = Get-Content -Path "d:datafile.xml" if ($XML.HasChildNodes) { if ( $XML.'header'.'data'.HasChildNodes) { foreach ($XMLData in $XML.'header'.'data') { $XMLData.CustomerName $XMLData.Children.Child[0].Name $XMLData.InnerXml if ($XMLData.SelectSingleNode("Age") -eq $null) { # Node does not exist [System.Xml.XmlElement]$Node = $XMLData.CreateElement("Age") $Node.InnerText = "34" $XMLData.AppendChild($Node) | Out-Null } else { # Update existing node [System.Xml.XmlElement]$Node = $XMLData.SelectSingleNode("Age") $Node.InnerText = "34" } } $XMLData.Save("$OutputFile") } }
WORKING WITH SQL
WORKING WITH SQL # Prepare SQL Connections $SqlConnection = New-Object System.Data.SQLClient.SQLConnection $SqlCommand = New-Object System.Data.SQLClient.SQLCommand $SqlConnection.ConnectionString ="Server=MYSERVER;Database=TestDB;User Id=SA_Account;Password=Passw0rd!;trusted_connection=False;" $SqlCommand.Connection = $SqlConnection # Fetch data via SQL query into a DataTable object $SqlQuery = "SELECT BatchId, Status from [DataTable]“ $adapter = new-object system.data.sqlclient.sqldataadapter ($SqlQuery, $SqlConnection) [system.data.datatable]$Batches = new-object system.data.datatable $adapter.Fill($Batches) | out-null foreach ($Row in $Batches) { "$($Row["BatchId"]) - $($Row["Status"])" }
WORKING WITH SQL # Execute an SQL statement $SqlCommand.CommandText = "UPDATE [Table] SET Status=3 WHERE BatchId=$ID" $SqlConnection.Open() $result = $SqlCommand.ExecuteNonQuery() $SqlConnection.Close() # Working with Transactions $SqlConnection.Open() $SqlTransaction = $SqlConnection.BeginTransaction([System.Data.IsolationLevel]::Serializable) $SqlCommand.Transaction = $SqlTransaction $result = $SqlCommand.ExecuteNonQuery() if ($errors) { $SqlTransaction.Rollback() } else { $SqlTransaction.Commit() } $SqlConnection.Close()
LAST BUT NOT LEAST
LAST BUT NOT LEAST # Test for a valid email address if ([bool]($record["EmailAdres"] -as [Net.Mail.MailAddress])) { } # Report execution progress Write-Progress -activity "Processing files" -status "Files read: " -PercentComplete 40 # Check speed of a command Measure-Command -Expression { get-service | ForEach-Object { Write-Host $PSItem.Name -ForegroundColor "green“ } } # Ask for user input $serverName = Read-Host "Enter server name:" # It’s all about pipes: function test { begin { write-host "start" } process { write-host "$_" } end { write-host "end" } } "a", "b", "c" | test
BONUS WEBSERVICES
BONUS WEBSERVICES # Send simple mail message send-mailmessage -from "no-reply@company.com" -to david.john@domain.com -subject "Test Email" -body "TEST" -smtpServer smtpmail.myserver.com # Send HTML mail message with attachments $smtpServer = "smtpmail.myserver.com" $mailfrom = "no-reply@company.com" $msg = new-object Net.Mail.MailMessage $smtp = new-object Net.Mail.SmtpClient($smtpServer) $msg.To.Add($MailAdres) $msg.CC.Add($MailAdres) $msg.From = $mailfrom $msg.Bcc.Add("david.john@domain.com") $msg.Subject = $MailSubject $msg.Attachments.Add($attFile) $msg.IsBodyHtml = $True $msg.Body = $HTMLBody $smtp.Send($msg)
BONUS WEBSERVICES # Post URL http://service.com/send?op=set&form=report&id=1234 [hashtable]$postParams = @{} $postParams.OP = 'set' $postParams.FORM = 'report' $postParams.ID = '1234' $url = "http://service.com/send" $rc = Invoke-WebRequest -Uri $url -Method GET -Body $postParams # Download file from a URL web service $webClient = New-Object System.Net.WebClient $webClient.UseDefaultCredentials = $true $url = "http://download.aspx?action=get&area=$($area)&id=$($id)" $bron = $webClient.DownloadString($url) # you may need to use a proxy for urls outside your network If (Test-Connection "myserver.com" -Count 1 -Quiet ) { $global:PSDefaultParameterValues = @{ 'Invoke-RestMethod:Proxy'='http://myproxy.com/acc_base.pac' 'Invoke-WebRequest:Proxy'='http://myproxy.com/acc_base.pac' '*:ProxyUseDefaultCredentials'=$true } }
BONUS WEBSERVICES # SOAP request $webService = "http://myserver/myservice/interfaceWcfService.svc" $Action = "http://mycompany.com/interfaceWcfService/Contract/IinterfaceWcfService/Start" [XML]$SOAPRequest = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/ envelope/" xmlns:con="http://mycompany.com/interfaceWcfService/Contract"><soapenv:Header/ ><soapenv:Body><con:StartID><con:appName>APP_ID</con:appName></con:StartID></soapenv:Body></ soapenv:Envelope>‘ $soapWebRequest = [System.Net.WebRequest]::Create( $webService) $soapWebRequest.Headers.Add( "SOAPAction", $Action) $soapWebRequest.ContentType = "text/xml;charset=`"utf-8`"" $soapWebRequest.Accept = "application/xop+xml, application/dime, multipart/related, text/xml"; $soapWebRequest.Method = "POST" $requestStream = $soapWebRequest.GetRequestStream() $SOAPRequest.Save($requestStream) $requestStream.Close() # perform SOAP request $resp = $soapWebRequest.GetResponse() $responseStream = $resp.GetResponseStream() # get response $soapReader = [System.IO.StreamReader]($responseStream) $ReturnXml = $soapReader.ReadToEnd() $responseStream.Close() "Webservice Response = $($resp.StatusDescription)"
THE END ©2016 LINKEDIN.COM/IN/GAETANOCAUSIO

Everything About PowerShell

  • 1.
    EVERYTHING YOU ALWAYS WANTEDTO KNOW ABOUT POWERSHELL * ©2016 LINKEDIN.COM/IN/GAETANOCAUSIO * BUT WERE AFRAID TO ASK
  • 2.
  • 3.
    WORKING WITH STRINGS #Some operations on strings $line = "Hallo, this is a test string" $line = $line.Replace("test", "123") $idx = $line.IndexOf("this") If ( [string]::Compare($stra, $strb, $True) ) { } # case sensitive compare If ($line.StartsWith("Script")) { } $line.Substring(2,3) $line[2] $line[2..4] # not a substring, this is an array ! $items = [Array]($line -split " ") $lineArray = $line.ToCharArray() "Hello $($MyName), today is $(get-date -format 'dd-MM')“ # string concatenation # Formatting "Today is {0:dddd}" -f (Get-Date) # Show day of the week "{0:N2}" -f 1554.22272 # Two decimal positions "{0:P}" -f (5/10) # Percentage "{0:C}" -f 5 # Currency "0x{0:x}" -f 55 # Convert to Hex
  • 4.
    WORKING WITH STRINGS #Be careful… if ($abc -eq "") { Write-Host "is null" } # may not work as you expected! if ([string]::IsNullOrEmpty($abc)) { Write-Host "is null" } # this is better... -contains # is designed to work on arrays, not strings -match # looks for a match inside a string and supports regexes –like # looks for a match inside a string and supports wildcards # Regular Expressions If ("192.168.15.20" -match "d{1,3}.d{1,3}.d{1,3}.d{1,3}“) { } If (([regex]::Matches($email, "[0-9]" )).count -gt 0) { } $var = $var -replace '[{]?[0-9a-fA-F]{8}[-]?([0-9a-fA-F]{4}[-]?){3}[0-9a-fA-F]{12}[}]?', '[GUID]‘ $var = $var -replace '(19|20)dd(-)(0[1-9]|1[012])2(0[1-9]|[12][0-9]|3[01]) dd(:)dd(:)dd', '[DATETIME]‘
  • 5.
  • 6.
    DATA STRUCTURES # Array [Array]$ErrorMessages= @("File does not exist.") $ErrorMessages += "Unable to open file.“ # add item to an array $ErrorMessages[1] = "Unable to open file for writing.“ # change item in an array Write-Host $ErrorMessages[0] # access item from an array # ! you cannot remove items from an array, use a .NET System.Collections.ArrayList instead # reading items in an array: foreach ($message in $ErrorMessages) { Write-Host $message }
 $mixArray = @(12,"David",1.2,$(Get-Date)) $mixArray.length # items in de array # Array of Array [Array]$SkipFiles = @() $SkipFiles +=, @("test.dat", 123) $SkipFiles +=, @("file.dat", 7) Write-Host $SkipFiles[1][0]
  • 7.
    DATA STRUCTURES # Dictionary $dict= New-Object 'system.collections.generic.dictionary[string,int]' $dict["David"] = 36 $dict["Joe"] = 27 # Hash Table [hashtable]$ReturnData = @{} $ReturnData.ErrorCode = 23 $ReturnData.ErrorMessage = "Failed to read database" $ReturnData.ProcessedRecords = 0 $ReturnData.DataTable = new-object system.data.datatable return $ReturnData
  • 8.
  • 9.
    OPERATIONS ON FILES #Search or replace text in files Get-ChildItem -Filter "*.xml" -Path "D:data" -Recurse | Select-String -pattern "123456“ (Get-Content "c:temptest.xml").replace('[ID]', '123456') | Set-Content "c:temptest.xml" # Operations on file system Copy-Item "d:datatest.log" "d:temp" Move-Item -path "d:datatest.log" -destination "d:temp" Rename-Item -path "d:datatest.xml" "test.xml.processed" if ($(Test-Path "d:datalogs") -eq $false) { New-Item -Name "logs" -Path "d:data" -ItemType directory } $data | Out-File -Append "d:datafile.dat“ # this will ask for confirmation, not handy in a script: Remove-Item -Path "C:temp" -Filter "*.log" -Force # this works better on a script: Get-ChildItem -Path "C:temp" -Filter "*.log" | Remove-Item -force
  • 10.
    OPERATIONS ON FILES #Reading Files [Array]$InRecords = Import-Csv -Path "d:test.csv" -Delimiter ',‘ -Header ID, Name, Age $Data = Get-Content -Path $InputFile [System.Object[]]$Triggers = Get-ChildItem -Filter "*.test.*.trg" -Path "d:data" ForEach ($Trigger in $Triggers) { $Trigger.BaseName $Trigger.Name $Trigger.FullName } # Handy $HashCode = Get-FileHash -Path "$FileName" -Algorithm MD5 $HashCode.Hash
  • 11.
  • 12.
    INTERACTIONS WITH OS #Accessing environment variables [Environment]::SetEnvironmentVariable("SYS_LOGS", "D:dataLogs", "Machine") $logs = $([Environment]::GetEnvironmentVariable('SYS_LOGS','Machine')) # Accessing Windows Events if(![System.Diagnostics.EventLog]::SourceExists("CleanUp")) { [System.Diagnostics.EventLog]::CreateEventSource("CleanUp",'Application') } Write-Eventlog -logname 'Application' -source "CleanUp" –eventID 17532 -EntryType Information -message "your event message" # Start a DOS batch command Start-Process "D:batchrun.cmd" "-f -v" -Wait -WindowStyle Hidden-WorkingDirectory "D:batch" # Start a PowerShell script from DOS CALL %SystemRoot%system32WindowsPowerShellv1.0powershell.exe -NoLogo -NonInteractive -File "D:scriptstest.ps1"
  • 13.
    INTERACTIONS WITH OS #Start - Stop Services Disable-ScheduledTask -TaskName "Run Batch" -TaskPath "MyServices" Stop-Service -DisplayName "MyWindowService" iisreset /restart Stop-Process -processname doc1gen* -Force Restart-WebAppPool "MyWindowService“ # Get information from OS Get-WmiObject -Query "SELECT TotalPhysicalMemory FROM Win32_ComputerSystem" Get-WmiObject -Query "SELECT * FROM Win32_LogicalDisk" -ComputerName CLSERVER3 Get-WmiObject Win32_Processor -cn CLSERVER3 # list of all possible query options for above commands: Get-WmiObject -List | Where-Object { $_.name -match 'memory' }
  • 14.
  • 15.
    ABOUT SECURITY # Getuser information $userAccount = [System.Security.Principal.WindowsIdentity]::GetCurrent() [System.Security.Principal.WindowsPrincipal]$userAccount).IsInRole("Administrator") Get-ADUser -Filter { SAMAccountName -eq ‘USR01A' } -Properties extensionAttribute6 Get-ADUser -Filter { SAMAccountName -like 'usr*' } -Properties SamAccountName # Encrypt a string (i.e. password) ConvertTo-SecureString 'testtest' -AsPlainText -Force | ConvertFrom-SecureString | Out-File -FilePath “c:temppassword.dat" # Decrypt a string $pswdSec = Get-Content "c:temppassword.dat" | ConvertTo-SecureString $bPswd = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pswdSec) $pswd = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bPswd)
  • 16.
  • 17.
    USING XML # Exampleof processing an XML file [XML]$XML = Get-Content -Path "d:datafile.xml" if ($XML.HasChildNodes) { if ( $XML.'header'.'data'.HasChildNodes) { foreach ($XMLData in $XML.'header'.'data') { $XMLData.CustomerName $XMLData.Children.Child[0].Name $XMLData.InnerXml if ($XMLData.SelectSingleNode("Age") -eq $null) { # Node does not exist [System.Xml.XmlElement]$Node = $XMLData.CreateElement("Age") $Node.InnerText = "34" $XMLData.AppendChild($Node) | Out-Null } else { # Update existing node [System.Xml.XmlElement]$Node = $XMLData.SelectSingleNode("Age") $Node.InnerText = "34" } } $XMLData.Save("$OutputFile") } }
  • 18.
  • 19.
    WORKING WITH SQL #Prepare SQL Connections $SqlConnection = New-Object System.Data.SQLClient.SQLConnection $SqlCommand = New-Object System.Data.SQLClient.SQLCommand $SqlConnection.ConnectionString ="Server=MYSERVER;Database=TestDB;User Id=SA_Account;Password=Passw0rd!;trusted_connection=False;" $SqlCommand.Connection = $SqlConnection # Fetch data via SQL query into a DataTable object $SqlQuery = "SELECT BatchId, Status from [DataTable]“ $adapter = new-object system.data.sqlclient.sqldataadapter ($SqlQuery, $SqlConnection) [system.data.datatable]$Batches = new-object system.data.datatable $adapter.Fill($Batches) | out-null foreach ($Row in $Batches) { "$($Row["BatchId"]) - $($Row["Status"])" }
  • 20.
    WORKING WITH SQL #Execute an SQL statement $SqlCommand.CommandText = "UPDATE [Table] SET Status=3 WHERE BatchId=$ID" $SqlConnection.Open() $result = $SqlCommand.ExecuteNonQuery() $SqlConnection.Close() # Working with Transactions $SqlConnection.Open() $SqlTransaction = $SqlConnection.BeginTransaction([System.Data.IsolationLevel]::Serializable) $SqlCommand.Transaction = $SqlTransaction $result = $SqlCommand.ExecuteNonQuery() if ($errors) { $SqlTransaction.Rollback() } else { $SqlTransaction.Commit() } $SqlConnection.Close()
  • 21.
  • 22.
    LAST BUT NOTLEAST # Test for a valid email address if ([bool]($record["EmailAdres"] -as [Net.Mail.MailAddress])) { } # Report execution progress Write-Progress -activity "Processing files" -status "Files read: " -PercentComplete 40 # Check speed of a command Measure-Command -Expression { get-service | ForEach-Object { Write-Host $PSItem.Name -ForegroundColor "green“ } } # Ask for user input $serverName = Read-Host "Enter server name:" # It’s all about pipes: function test { begin { write-host "start" } process { write-host "$_" } end { write-host "end" } } "a", "b", "c" | test
  • 23.
  • 24.
    BONUS WEBSERVICES # Sendsimple mail message send-mailmessage -from "no-reply@company.com" -to david.john@domain.com -subject "Test Email" -body "TEST" -smtpServer smtpmail.myserver.com # Send HTML mail message with attachments $smtpServer = "smtpmail.myserver.com" $mailfrom = "no-reply@company.com" $msg = new-object Net.Mail.MailMessage $smtp = new-object Net.Mail.SmtpClient($smtpServer) $msg.To.Add($MailAdres) $msg.CC.Add($MailAdres) $msg.From = $mailfrom $msg.Bcc.Add("david.john@domain.com") $msg.Subject = $MailSubject $msg.Attachments.Add($attFile) $msg.IsBodyHtml = $True $msg.Body = $HTMLBody $smtp.Send($msg)
  • 25.
    BONUS WEBSERVICES # PostURL http://service.com/send?op=set&form=report&id=1234 [hashtable]$postParams = @{} $postParams.OP = 'set' $postParams.FORM = 'report' $postParams.ID = '1234' $url = "http://service.com/send" $rc = Invoke-WebRequest -Uri $url -Method GET -Body $postParams # Download file from a URL web service $webClient = New-Object System.Net.WebClient $webClient.UseDefaultCredentials = $true $url = "http://download.aspx?action=get&area=$($area)&id=$($id)" $bron = $webClient.DownloadString($url) # you may need to use a proxy for urls outside your network If (Test-Connection "myserver.com" -Count 1 -Quiet ) { $global:PSDefaultParameterValues = @{ 'Invoke-RestMethod:Proxy'='http://myproxy.com/acc_base.pac' 'Invoke-WebRequest:Proxy'='http://myproxy.com/acc_base.pac' '*:ProxyUseDefaultCredentials'=$true } }
  • 26.
    BONUS WEBSERVICES # SOAPrequest $webService = "http://myserver/myservice/interfaceWcfService.svc" $Action = "http://mycompany.com/interfaceWcfService/Contract/IinterfaceWcfService/Start" [XML]$SOAPRequest = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/ envelope/" xmlns:con="http://mycompany.com/interfaceWcfService/Contract"><soapenv:Header/ ><soapenv:Body><con:StartID><con:appName>APP_ID</con:appName></con:StartID></soapenv:Body></ soapenv:Envelope>‘ $soapWebRequest = [System.Net.WebRequest]::Create( $webService) $soapWebRequest.Headers.Add( "SOAPAction", $Action) $soapWebRequest.ContentType = "text/xml;charset=`"utf-8`"" $soapWebRequest.Accept = "application/xop+xml, application/dime, multipart/related, text/xml"; $soapWebRequest.Method = "POST" $requestStream = $soapWebRequest.GetRequestStream() $SOAPRequest.Save($requestStream) $requestStream.Close() # perform SOAP request $resp = $soapWebRequest.GetResponse() $responseStream = $resp.GetResponseStream() # get response $soapReader = [System.IO.StreamReader]($responseStream) $ReturnXml = $soapReader.ReadToEnd() $responseStream.Close() "Webservice Response = $($resp.StatusDescription)"
  • 27.