När man kör Office365 men har ett eget on-premise Active Directory, så använder man Azure AD Sync (AADSync) för att automatiskt synkronisera kontoinformationen till Azure AD så att kontona kan användas i Office365. Vad som dock inte sker automatiskt med något av de verktyg vi får från Microsoft, är tilldelning av licenser till dessa konton. Detta måste man manuellt gå in i Office365-portalen och göra i efterhand.
Men nu är Azure och Office365 så fantastiskt att vi även kan hantera allting med Powershell. Vilket betyder att automatisering plötsligt blir både möjligt och enkelt.
Det vi behöver göra är följande:
- Förbereda konton och lösenord som ska användas till scriptet
- Skapa ett Powershell-script
- Skapa en schemalagd aktivitet som kör scriptet
Förbered konton och lösenord
Vi behöver två konton:
- Ett admin-konto med tillräckliga behörigheter att ändra licensinformationen i Office365
- Ett konto som ska köra den schemalagda aktivitet som vi använder för att schemalägga scriptet
Vi kan naturligtvis använda samma konto för båda dessa syften, det är valfritt. Eftersom vi redan använder AADSync så har vi redan ett konto där som vi lämpligtvis kan använda som admin-konto även för det här ändamålet. Men om detta konto t.ex. bara ligger i molnet och inte finns i vårt lokala AD, då blir det svårt att använda för vår schemalagda aktivitet, varpå vi behöver ett separat konto för detta.
Jag gillar att köra mina aktiviteter med datorns egna konto, alltså Local System, för att slippa ha ett dedikerat användarkonto, och kommer göra så i det här exemplet.
Nästa steg är att spara ned lösenordet för detta admin-konto på ett säkert sätt så att vi kan använda oss av det i scriptet. Här är nu det viktiga att se till att det konto vi använder för att köra den schemalagda aktiviteten kan läsa detta lösenord. Eftersom vi kommer spara lösenordet i krypterad form så kommer enbart detta utvalda konto att kunna läsa det.
Eftersom jag vill köra med kontot Local System måste jag därmed skapa det krypterade lösenordet med System-kontot. Ett enkelt sätt att göra detta är att ladda ned PsExec och sen köra:
psexec.exe -i -s powershell.exe
På så vis startar jag Powershell med System-kontot. Detta gör vi på den maskin där den schemalagda aktiviteten ska köras (lämpligtvis samma server som kör AADSync). Lösenordet kommer nämligen bara att kunna läsas av detta konto, på just denna dator, och ingen annanstans.
I Powershell kör vi nu följande:
1 |
Read-Host "Enter Password" -AsSecureString | ConvertFrom-SecureString | Out-File C:\scripts\DirSyncCreds.txt |
I prompten skriver vi nu in lösenordet för det admin-konto vi kommer använda oss av i scriptet. Detta kommer sparas i krypterad form i filen C:\Scripts\DirSyncCreds.txt och bara vara läsbart för System-kontot på just den här datorn.
Skapa scriptet
För att tilldela en licens till en användare i Office365 behöver vi göra två saker:
- Välja en licens och tilldela denna. Detta görs med cmdleten Set-MsolUserLicense
- Välja en location, dvs förmodligen Sverige för oss, som användaren tillhör. För detta används cmdleten Set-MsolUser
Så i grund och botten är det bara två enkla cmdlets vi behöver köra. För att göra en lite mer komplett lösning kan det vara en bra idé att lägga till lite logging och liknande i scriptet. Eftersom hela det här exemplet förmodligen är mest intressant för små och mellanstora organisationer, där man kanske inte har så mycket bra övervakningsverktyg, och där konton inte skapas så ofta, så har jag i mitt script-exempel lagt med att scriptet helt enkelt mailar någon administratör varje gång en licens tilldelats någon användare, eller om någonting har misslyckats. För att detta ska fungera måste det finnas en SMTP-server någonstans på nätverket som vi kan skicka mailet genom. Har du ingen sådan kan du enkelt lägga till en, då det finns en färdig sådan roll i Windows Server. Detta är dock utanför den här guiden.
Vi behöver också ett sätt att urskilja vilka användare som faktiskt ska få en licens, och det lättaste sättet här är att använda en vanlig AD-grupp. Har vi flera olika licenser som vi vill använda så skapar vi helt enkelt flera grupper. I det här script-exemplet utgår vi dock från bara en enda licens, men det är väldigt enkelt att lägga till fler om man så vill.
Scriptet ser ut så här:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
[CmdLetBinding()] Param( $AdminUser = "O365Admin@MyCompanyDomain.se", $PasswordFile = "C:\Scripts\DirSyncCreds.txt", $O365ADGroup = "CN=Office 365 Users,OU=Groups,DC=MyCompanyDomain,DC=local", $O365License = "MyCompany:ENTERPRISEPACK", $O365UsageLocation = "SE", $SMTPServer = "smtp.mycompanydomain.local", $EmailRecipient = "MyEmailAddress@MyCompanyDomain.se", $EmailSender = "SomeEmailAddress@MyCompanyDomain.se" ) # Connect to Office 365 try { if (Test-Path $PasswordFile) { $Password = Get-Content $PasswordFile | ConvertTo-SecureString -ErrorAction Stop $Credentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $AdminUser,$Password -ErrorAction Stop Connect-MsolService -Credential $Credentials -ErrorAction Stop Write-Verbose "Connected to Office 365 with user $AdminUser" } else { throw "Failed to open password file, cannot connect to Office 365" } } catch { $Date = Get-Date $ErrorMessage = $_.Exception.Message $Subject = "Connection to Office 365 failed" $Body = "Connection to Office 365 failed for the scheduled task that assigns licenses." $Body += "`n" $Body += "`nTime: $Date" $Body += "`nError message: $ErrorMessage" Send-MailMessage -From $EmailSender -To $EmailRecipient -Subject $Subject -SmtpServer $SMTPServer -Body $Body -Encoding UTF8 Write-Verbose "Failed to connect to Office 365" } $O365Users = Get-ADUser -Filter "memberof -RecursiveMatch '$O365ADGroup'" foreach($User in $O365Users) { $UPN = $User.UserPrincipalName $Name = $User.Name if (Get-MsolUser -UserPrincipalName $UPN -ErrorAction Stop) { if (Get-MsolUser -UserPrincipalName $UPN | Where-Object {$_.isLicensed -eq $false}) { Write-Verbose "User $Name not licensed, attempting to assign license" Write-Verbose "Setting UsageLocation" Set-MsolUser -UserPrincipalName $UPN -UsageLocation $O365UsageLocation -Erroraction Stop Write-Verbose "Assigning license" Set-MsolUserLicense -UserPrincipalName $UPN -AddLicenses $O365License -Erroraction Stop Write-Verbose "Verifying that license is assigned" if (Get-MsolUser -UserPrincipalName $UPN | Where-Object {$_.isLicensed -eq $true}) { $Date = Get-Date $Subject = "A user has been assigned a license in Office 365" $Body = "A user has been assigned a license in Office 365." $Body += "`n" $Body += "`nTime: $Date" $Body += "`nName: $Name" Send-MailMessage -From $EmailSender -To $EmailRecipient -Subject $Subject -SmtpServer $SMTPServer -Body $Body -Encoding UTF8 Write-Verbose "License assigned successfully for user $Name" } else { $Date = Get-Date $Subject = "An attempt to assign a license to a user in Office 365 failed" $Body = "An attempt to assign a license to a user in Office 365 failed." $Body += "`n" $Body += "`nTime: $Date" $Body += "`nName: $Name" Send-MailMessage -From $EmailSender -To $EmailRecipient -Subject $Subject -SmtpServer $SMTPServer -Body $Body -Encoding UTF8 Write-Verbose "Failure: License was not assigned for user $Name" } } else { Write-Verbose "User $Name is already licensed" } } else { Write-Verbose "User $Name was not found in Azure AD, probably not synchronized yet" } } |
Scriptet kräver följande för att fungera:
- Azure AD Module
- Active Directory Module for Windows PowerShell
Spara ned scriptet och ändra variablerna högst upp i scriptet och fyll i korrekt admin-konto, sökväg till lösenordsfilen (som vi skapade tidigare), licens, AD-grupp, mailadresser, osv.
Kontrollera att allting fungerar genom att köra scriptet manuellt. Lägg till flaggan -Verbose så loggas hela förloppet i konsolen.
Skapa schemalagd aktivitet
När scriptet är testat och fungerar så är det bara att schemalägga det med en vanlig Windows schemalagd aktivitet. Hur ofta den ska köras är såklart valfritt, men AADSync körs t.ex. som standard var 3:e timme, så att matcha det schemat kan vara en ide.
Konfigurera följande i aktiviteten:
- Kontot som köra aktiviteten (SYSTEM i det här exemplet)
- Schema
- Action:
Program: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Argument: -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\Set-O365License.ps1
Ändra namn och sökväg till scriptet så att det matchar din miljö. Därefter kan vi luta oss tillbaka och se hur det trillar in ett litet mail i vår inkorg varje gång vi skapar en ny användare, som berättar att denne automatiskt fått sin O365-licens tilldelad.