Tag-arkiv: Scripts

Billeder i Active Directory

Jeg har i et stykke tid benyttet CodeTwo´s program “Active Directory Photos” til at opdatere brugernes billeder i Active Directory, det er nemlig et fantastisk produkt, hvis man bare skal have opdateret en sjælden gang. Find det her. Det er dog rimeligt besværligt at benytte hvis man skal opdatere dagligt eller ugentligt fra en base af billeder. Jeg har derfor lavet nedenstående script der kan gøre det helt automatisk..

Billeder i Active Directory lægges i den attribut der hedder ThumbnailPhoto og for at lægge et billede i den skal vi først konvertere billedet til en struktur som powershell forstår. Og da der er mere end 1 billede lægger jeg dem selvfølgelig i en variabel form.

Billedet hentes ind i en variabel

$Photo = [Byte[]] (Get-Content “sti til billeder” -Encoding Byte)

Og dette lægges ind i attributten ThumbnailPhoto ved at gøre følgende:

Set-ADUser -Identity “Username” -Replace @{thumbnailPhoto=$photo}

Ovenstående er grundfunktionerne og for at gøre det for flere billeder skal vi selvfølgelig bruge lidt mere avancerede funktioner. I følgende eksempel kører jeg en 3-trins raket af et script, først hentes brugernavne i AD og dernæst hentes billeder på en sharepoint side (da det typisk er der man vil have et billede af de ansatte) og til sidst uploader vi billederne til AD. Bemærk at jeg ikke har angivet nogle bruger med rettigheder til at hente brugernavne fra AD, jeg forventer at dette er muligt for alle. Men hvis dit Active Directory har enablet ListObjectModeOnly og ikke tillader dette, skal du selvfølgelig også angive en bruger til at hente brugernavne med.

$Cred = Get-credential  – brugernavn og kode der giver rettigheder til at hente billederne

$Cred2 = Get-Credential - Brugernavn og kode der giver rettigheder til at uploade billederne

$A = (Get-ADUser -filter * | where {$_.samaccountname.length -eq 5}).samaccountname - Henter brugernes samaccountname

foreach ($item in $A)

{Invoke-WebRequest -Uri “hjemmeside url/$item.jpg” -Method “get” -OutFile folder\$item.jpg -Credential $cred} - Henter billederne

foreach ($item in $A)

{$photo = [byte[]](Get-Content folder\$item.jpg -Encoding byte) - Konverterer dem til byte

Set-ADUser $item -Credential $Cred2 -Replace @{thumbnailPhoto=$photo} } - Uploader billederne

Ovenstående vil selvfølgelig fejle hvis ikke der er et billede til brugeren på siden og det kræver at billederne er navngivet brugernavn.jpg og er måske ikke brugbart for alle, men det giver et meget godt indblik i hvad der skal til for at uploade billeder automatisk. Det er også muligt at man kan finde en bruger der har adgang til det hele og så er det selvfølgelig kun 1 $cred der skal bruges.

 

Signering af scripts

Jeg har flere scripts der kører automatisk i løbet af natten. For at disse kan køre har jeg signeret dem med et kode signerings certifikat. Processen er egentlig ganske simpel, forudsat at du har adgang til sådan et certifikat. Da jeg kører mine scripts i mit eget domæne, er det nemmeste i verden jo at installere en CA og udstede sit eget. (Installation af CA og udstedelse af certifikat, tager vi lige en anden dag. ;) )

Men når du har certifikatet skal du bruge kommandoen Set-AuthenticodeSignature, pege på dit script og dit cert. Kommandoen ser sådan ud:

Set-AuthenticodeSignature “sti til script” -Certificate “sti til certifikat”

Nemt ikke? Lad os forestille os at jeg har lagt scriptet script.ps1 i temp folderen på mit c-drev og jeg kun har 1 certifikat til kode signering, så ser kommandoen således ud:

Set-AuthenticodeSignature C:\Temp\Script.ps1 -Certificate (Get-Childitem Cert:\CurrentUser\My -CodesigningCert)

Og da -Certificate er en positionsbestemt parameter, så er det ikke engang nødvendigt at angive den. Og kommandoen ovenfor kan forkortes til:

Set-AuthenticodeSignature C:\Temp\Script.ps1 (Get-Childitem Cert:\CurrentUser\My -CodesigningCert)

Positionsbestemte parametre er det Powershell forventer der kommer på den position, altså skal certifikatet angives som parameter nr 2 og man kan undlade at angive dette og bare sætte certifikatet ind her.

Igen tror jeg Voila er ordet. ;)