1. Introduktion #
Powershell er et scripting sprog, med et væld af funktionaliteter, der kan benyttes til alverdens formål. Typisk i RPA-sammenhænge, vil det være i forbindelse med Active Directory det bruges. Det kan eksempelvis være til udtræk eller generel brugeradministration. Nedenstående afsnit, kræver at man som udgangspunkt er lidt bekendt med Powershell eller programmering, for at kunne bruge det. Modsat andre afsnit, er det så bredt et emne, at det er svært at finde sandkasser eller tutorials til hvordan lære at bruge det. Sidstnævnte afhænger typisk af hvad man skal bruge det til.
Navn | Note | Link |
Generelt | Microsofts hovedside til Powershell | https://learn.microsoft.com/en-us/powershell/ |
Kursus | Et gratis kursus med overordnet gennemgang af Powershell | https://www.codecademy.com/learn/learn-powershell |
AD Commands | Stor liste med kommandoer man kan bruge til AD | https://activedirectorypro.com/powershell-commands/#ad |
AD User Mapping | Hvad ligger hvor på et User-Object i AD, bliver også repræsenteret visuelt i afsnit 3.2. | https://learn.microsoft.com/da-dk/windows/win32/ad/user-object-user-interface-mapping?redirectedfrom=MSDN |
Exchange/Online | Jeg har ikke kunnet finde nogle test cases i mit arbejde endnu, så der er kun lavet et eksempel under 1.1.. Genbrugelige scripts. Se eventuelt reference for at lære mere. | https://learn.microsoft.com/en-us/training/modules/manage-exchange-online-use-windows-powershell/?source=recommendations |
1.1 Genbrugelige scripts #
Herunder liste af Scripts der kan være nyttige til RPA formål
Beskrivelse | Script |
Nulstil Powershell ISE session, fjerner gemte variabler og moduler fra sessionen (bruges i stedet for at lukke og åbne programmet) | Remove-Variable * -ErrorAction SilentlyContinue; Remove-Module *; $error.Clear(); |
Exporter output til CSV som tabel med ÆØÅ Alternativt, hvis man skal have expanded properties (disse bliver noget underligt data når det kommer ud som fil ellers) | | export-csv -Path “C:\Users\<username>\Documents\Test.csv” -NoTypeInfo -Delim “;” -encoding utf8 | out-file “C:\Users\<username>\Documents\Test.csv” -encoding utf8 -append |
Ændr kolonnenavne til output | get-aduser * | select @{Name=”Navn”;Expression={$_.Name}}, @{Name=”Brugernavn”;Expression={$_.SamAccountName}} |
Søg efter navn og træk brugernavn ud | get-aduser -Filter {Name -like “Jens J”*} | Select-Object SamAccountName |
Hent alle medlemmer ud af AD-gruppe, brugernavn og fulde navn | Get-ADGroupMember -Identity app-kmd | select samaccountname, name |
Til at tjekke hvilke tlf numre der kan genbruges, hvis brugeren eksempelvis ligger til sletning, alternativt til at trække en liste ud med hvem har hvilket nummer | Get-ADUser -Filter * -SearchBase ‘OU=Delete_Ready,OU=Users,DC=TEST’ -properties telephoneNumber | where {$_.telephoneNumber -ne $null} | Select SamAccountName, telephoneNumber |
Liste af hvem er tilknyttet til dette kontor | Get-ADUser -LDAPFilter “(PhysicalDeliveryOfficeName=Økonomi Afdelingen)” | select Name, SamAccountName | Format-list Name, SamAccountName |
Hent medlemmer ud fra delte postkasser i Exchange, og gem udtrækket som .txt fil | #Opret forbindelse til Exchange Connect-ExchangeOnline #Hent postkasser ud fra txt-fil som liste/array $mailboxArray = Get-Content -Path “C:\temp\Mailboxes.txt” foreach ($mailbox in $mailboxArray) { #Append i slutfilen, så mailboksens navn står øverst, og herefter udtrækket Add-Content C:\temp\test.txt “`n$mailbox” # Hent medlemmer af postkassen ud Get-Mailbox -Identity “$mailbox” -ResultSize:Unlimited | Get-MailboxPermission | Select-Object User | out-file “C:\temp\test.txt” -encoding utf8 -append } #Luk forbindelse til Exchange Disconnect-ExchangeOnline –Confirm:$false |
Til at søge efter en tekst i Word og erstatte med et billede | # Tilføj assembly Add-Type -AssemblyName Microsoft.Office.Interop.Word $imageFilePath = “<FilePathImage>” # Find den eksisterende Word proces $word = [Runtime.Interopservices.Marshal]::GetActiveObject(‘Word.Application’) $word.Visible = $true # Attach på det åbne dokument $document = $word.ActiveDocument # Find teksten “[Indsæt billede]” og er erstat med billedet $findText = “[Indsæt billede]” $range = $document.Content $range.Find.Execute($findText) if ($range.Find.Found) { $range.Select() $selection = $word.Selection $selection.InlineShapes.AddPicture($imageFilePath) } # Release COM objects [System.Runtime.Interopservices.Marshal]::ReleaseComObject($selection) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($document) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null |
Til et søge efter en tekst i Word bagved et link, og erstatte med tekst, og efterfølgende omdanne til hyperlink | # Tilføj assemblies Add-Type -AssemblyName Microsoft.Office.Interop.Word Add-Type -AssemblyName System.Windows.Forms # Find den eksisterende Word proces $word = [Runtime.Interopservices.Marshal]::GetActiveObject(‘Word.Application’) $word.Visible = $true # Attach på det åbne dokument $document = $word.ActiveDocument # Søg og erstat $findText = “=eDocsagsnummer” $replaceText = “=<EdocSagsnummer>” $selection = $word.Selection $selection.Find.Text = $findText $selection.Find.Replacement.Text = $replaceText $selection.Find.Execute([ref]$findText, [ref]$false, [ref]$true, [ref]$false, [ref]$false, [ref]$false, [ref]$true, [ref]$false, [ref]$false, [ref]$replaceText, [ref]2) # Søg efter teksten i <EdocSagsnummer> $searchText = “=<EdocSagsnummer>” $selection.Find.Text = $searchText $selection.Find.Execute([ref]$searchText) # Send et “End” for at gå til slutningen af linket, og et “Space” afsted for at tvinge Word til at omdanne teksten til et hyperlink [System.Windows.Forms.SendKeys]::SendWait(“{END}”) Start-Sleep -Seconds 1 [System.Windows.Forms.SendKeys]::SendWait(” “) # Oprydning [System.Runtime.Interopservices.Marshal]::ReleaseComObject($selection) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($document) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null |
Nogle RPA programmer, eksempelvis Power Automate Desktop har deres egen måde at escape specialtegn på. Det kan skabe problemer, når variablerne bruges i PowerShell. Den nemmeste løsning er at bruge here-strings (@’…’@) i PoweShell i stedet for at forsøge at escape specialtegn inden det bruges i Powershell. Dette får PowerShell automatisk at beholde tegn nøjagtigt som de er. Yderligere kan det være nemmere at lave et PSCustomObject, og omdanne til JSON efterfølgende, da der er syntax problemer ved at bruge here-strings i JSON strings. | $body = [PSCustomObject]@{ startdate = “2024-12-24” enddate = “2025-01-01” title = @’ %JSONTitle% ‘@ content = @’ %JSONContent% ‘@ } $body = ConvertTo-Json $body -Depth 100 |
2. Installation af diverse #
2.1 AD Integration – Windows RSAT #
RPA-software kan typisk ikke arbejde direkte i AD UI’et, da disse kun kan se selve vinduet, og ikke indholdet af denne. I stedet kan man bruge PowerShell Script til dette, som kræver at man installerer Windows RSAT (Remote Server Administration Tools) på den pågældende PC. Se installationsguide her – https://activedirectorypro.com/install-rsat-remote-server-administration-tools-windows-10/#rsat-powershell
Et Output fra et script er normalt i en lang tekst, man kan dog fjerne white-space, og lave det om til en liste med delimiter af ny linje, og så slette de to øverste items på listen, da disse oftest er en overskrift før selve outputtet.
2.2 Exchange Online Powershell Module #
Hvis man bruger Office365, og har Exchange Online, kan man bruge nedenstående, til at kunne tilgå via Powershell. Bruger man multifaktor, kan der være flere ting der skal opsættes, se eventuelt installationsguiden fra Microsoft nedenfor.
Installationsguide her – https://learn.microsoft.com/en-us/powershell/exchange/exchange-online-powershell-v2?view=exchange-ps#install-and-maintain-the-exchange-online-powershell-module
Start Powershell som administrator og kør nedenstående.
Install-Module –Name ExchangeOnlineManagement
Import-Module ExchangeOnlineManagement
Kommando til at tjekke versionen af hentede modul – Get-Module -Name ExchangeOnlineManagement -ListAvailable
3. Active Directory #
Det er at teste scripts igennem Windows PowerShell ISE. Her kan man også slå et panel til, så man kan skrive koden og rette i det, nemmere end hvis man skulle skrive direkte i konsollen. Dette kan gøres som vist herunder.
3.1 Anatomi af et AD udtræk i PowerShell #
Generelt kan man dele et PowerShell AD udtræk op i seks potentielle dele, hvor rækkefølgen altid er fast, del 1 og del 3 vil altid som minimum være tilstede. Efter hver tal del afsluttes der med en | som agerer som en slags stopklods til næste del
- get-aduser eller get-adgroupmember er de mest brugte udtræk man vil støde på
- -filter / -ldapfilter /-identity er næsten altid påkrævet, herunder ses hvordan dette kan sættes
- -filter * – Trækker alle data ud om fremsøgte bruger(ere)
- -filter {surname -like ‘Nielsen’} – Trækker alt data ud omkring brugere med efternavn Nielsen
- -filter {telephonenumber -like ‘*’} – Trækker alt data ud omkring brugere med et telefonnummer (altså så længe dette felt ikke er blankt / null i AD)
- -LDAPFilter “(Department=IT)” – Trækker alt data ud med brugere der arbejder i afdelingen IT
- -identity brugernavn – bruges til at slå en bruger op på SamAccountName
- Valgfrie parametre
- -searchbase ‘OU=Users,DC=Main’ – hvis man skal søge i en specifik OU i AD’en, frem for i hele AD’en
- Obs man skal have hele stien med til OU’et
- -properties – bruges hvis man skal have mere data ud end standard navn, brugernavn, og diverse.
- Se visuel guide længere nede i denne vejledning, separeres med , eller * for alle data
- -searchbase ‘OU=Users,DC=Main’ – hvis man skal søge i en specifik OU i AD’en, frem for i hele AD’en
- -filter / -ldapfilter /-identity er næsten altid påkrævet, herunder ses hvordan dette kan sættes
- where eller where-object til yderligere filtrering af sit udtræk, hvis man skal specificere yderligere, valgfri parameter
- select her specificerer vi nøjagtigt den data vi vil trække ud
- Komma separeret ved flere udtræk
- -unique kan sættes på, hvis man kun ønsker at se unikke hits
- @{Name=”Kolonnenavn”;Expression{$_Parameternavn}} kan bruges hvis man ønsker at udtrækket skal have andre kolonnenavne, obs skal gøres på hver parameter i udtrækket
- sort eller sort-object hvis udtrækket skal sorteres A-Z efter en af parametrene
- Komma separeret, første parameter har prioritet hvis man ønsker at sortere på mere end en kolonne
- format-table eller format-list hvis man ønsker at ændre visningen / rækkefølgen af sit udtræk
- Begge bruger -property til at sortere
- export-csv og out-file kan bruges til gemme udtrækket som en fil, csv eller tekstdokument
- export-csv -Path “C:\Users\dwithnn\Documents\test.csv” -NoTypeInfo -Delim “;” -encoding utf8
- -encoding utf8 bruges til at få ÆØÅ med i udtrækket
- out-file “C:\Users\dwithnn\Documents\test.txt” -encoding utf8
- Kan også laves som .csv det bliver dog ikke lavet som semikolon separeret csv-fil, hvilket kan give lidt bøvl
- export-csv -Path “C:\Users\dwithnn\Documents\test.csv” -NoTypeInfo -Delim “;” -encoding utf8