Laden Sie mithilfe von PowerShell Benutzerfotos in Active Directory hoch

Wenn Sie Active Directory verwenden, verwenden Sie Exchange, OwnCloud, SharePoint oder ein anderes System mit der Möglichkeit, einen Avatar oder ein Foto anzuzeigen. Nach dem Lesen dieses Artikels können Sie das Foto eines Benutzers in AD hochladen, um es in Outlook, Lync, auf SharePoint-Portalen und anderen Systemen anzuzeigen .

Ich habe einen ähnlichen Artikel gefunden ( „Hinzufügen von Fotos zu Active Directory“ ), aber es verging viel Zeit, und ich habe mich entschlossen, das Thema wiederzubeleben.

Anforderungen:
  • Fotos von Mitarbeitern sind im JPG-Format erwünscht. Dateiname, vorzugsweise standardisiert;
  • PowerShell- und Active Directory für PowerShell-Modul auf dem Computer;
  • Das Active Directory-Schema muss Win 2008 oder neuer sein (dies bedeutet nicht, dass Controller für Windows 2008 vorhanden sind. Es wird nur adprep von der Windows 2008-Festplatte ausgeführt, um das Schema zu erweitern.).
  • Der Benutzer muss über Rechte zum Ändern der Attribute thumbnailphoto und jpegPhoto in Active Directory verfügen (standardmäßig kann der Benutzer sein Foto ändern, Sie können jedoch das Recht delegieren).


Nachteile:
  • Zusätzliche Belastung des Supports bei Anfragen zum Ersetzen des Fotos;
  • Das Wachstum der Active Directory NTDS.DIT-Datenbank, das zu Replikationsproblemen führen kann.


Als referenz:
Das Active Directory-Limit für die Attributgröße von thumbnailPhoto und jpegPhoto beträgt 100 KB. Benutzerfotos in Outlook 2010 werden auch dann angezeigt, wenn Exchange nicht installiert ist. Es reicht aus, ein Active Directory Win 2008-Schema oder ein neueres zu verwenden. Um das Foto des Benutzers in verschiedenen Systemen anzuzeigen, werden verschiedene Attribute in Active Directory verwendet. Beispielsweise für die Anzeige in Outlook thumbnailPhoto und für die Anzeige in SharePoint jpegPhoto.


Der Autor ist nicht verantwortlich für mögliche Schäden, die durch die Materialien in diesem Artikel verursacht werden.

Der Artikel enthält nicht das gesamte Skript. Die Geschmacks- und Farbmarker sind unterschiedlich.
Tatsächlich ist es mit meinem vorgefertigten Skript einfacher, Active Directory bei unüberlegter Verwendung zu beschädigen.



Oder beenden Sie den Snap von Active Directory-Benutzer und -Computer


Es gibt verschiedene Möglichkeiten, um Fotos mit PowerShell in AD hochzuladen:

Verwenden des Microsoft PowerShell for Active Directory-Moduls:

Import-Module ActiveDirectory
$photo = [byte[]](Get-Content C:\Photo\MyPhoto.jpg -Encoding byte)
Set-ADUser  -Replace @{thumbnailPhoto=$photo} 
Set-ADUser  -Replace @{jpegPhoto;=$photo} 

Verwenden des Quest PowerShell für Active Directory-Snap-Ins:

Add-PSSnapin Quest.ActiveRoles.ADManagement
$photo = [byte[]](Get-Content C:\Photo\MyPhoto.jpg -Encoding byte)
Set-QADUser  -ObjectAttributes @{thumbnailPhoto=$photo}
Set-QADUser  -ObjectAttributes @{jpegPhoto=$photo}

Verwenden des PowerShell for Exchange-Snap-Ins:

Add-PSSnapin Microsoft.Exchange.Management.Powershell.E2010
Import-RecipientDataProperty -Identity  -Picture -FileData ([Byte[]]$(Get-Content -Path "C:\Photo\MyPhoto.jpg" -Encoding Byte -ReadCount 0))

Fangbeschränkung für Dateigröße 10 kb. Ersetzt nur das Miniaturbild.

Verwenden des PowerShell for Exchange 2013-Snap-Ins:

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
$photo = ([Byte[]] $(Get-Content -Path "C:\Photo\MyPhoto.jpg" -Encoding Byte -ReadCount 0))
Set-UserPhoto -Identity  -PictureData $photo -Confirm:$False
Set-UserPhoto -Identity  -Save -Confirm:$False

Überprüfen Sie das Foto über den Browser (wenn Sie Exchange 2013 verwenden)
https://mail.domain.local/ews/Exchange.asmx/s/GetUserPhoto? Email=user@domain.com&size=HR648x648


Verwenden von PowerShell und ADSI:

[byte[]]$jpg = Get-Content "C:\Photo\MyPhoto.jpg" -encoding byte
$user = [adsi]"LDAP://cn=user1,cn=users,dc=domain,dc=loc"
$user.Properties["jpegPhoto"].Clear()
$null = $user.Properties["jpegPhoto"].Add($jpg)
$user.Properties["thumbnailPhoto"].Clear()
$null = $user.Properties["thumbnailPhoto"].Add($jpg)
$user.CommitChanges()

In all diesen Beispielen wird das Foto des Benutzers geladen, ohne dass Größe und Qualität des Bildes geändert werden.

Ich habe mich für die Verwendung des Microsoft PowerShell for Active Directory-Moduls entschieden. Beim ersten Versuch, ein Foto hochzuladen, wurde jedoch eine Fehlermeldung angezeigt, dass es nicht möglich ist, ein Foto aus einer Datei mit einer Größe von 5 Megabyte zu laden. Die erste Idee war, die Fotos durch Komprimieren auf eine akzeptable Größe zu konvertieren. Aber der Wunsch, PowerShell zu lernen, gewann.

Daher erschweren wir das Hochladen von Fotos. Fügen Sie eine Funktion hinzu, um die Auflösung des Fotos zu ändern.

Die Funktion akzeptiert den vollständigen Pfad zur Datei, maximale Auflösung und Komprimierungsqualität am Eingang.

Eine fast fertige Funktion wurde im Internet gefunden und für bestimmte Aufgaben erledigt.
Function resizephoto(){
Param ( [Parameter(Mandatory=$True)] [ValidateNotNull()] $imageSource,
[Parameter(Mandatory=$true)][ValidateNotNull()] $canvasSize,
[Parameter(Mandatory=$true)][ValidateNotNull()] $quality )
# функция берет файлик и ужимет его
# проверки
if (!(Test-Path $imageSource)){throw( "Файл не найден")}
if ($canvasSize -lt 10 -or $canvasSize -gt 1000){throw( " Параметр размер должен быть от 10 до 1000")}
if ($quality -lt 0 -or $quality -gt 100){throw( " Параметр качества должен быть от 0 до 100")}
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
$imageBytes = [byte[]](Get-Content $imageSource -Encoding byte)
$ms = New-Object IO.MemoryStream($imageBytes, 0, $imageBytes.Length)
$ms.Write($imageBytes, 0, $imageBytes.Length);
$bmp = [System.Drawing.Image]::FromStream($ms, $true)
# разрешение картинки после конвертации
$canvasWidth = $canvasSize
$canvasHeight = $canvasSize
# Задание качества картинки
$myEncoder = [System.Drawing.Imaging.Encoder]::Quality
$encoderParams = New-Object System.Drawing.Imaging.EncoderParameters(1)
$encoderParams.Param[0] = New-Object System.Drawing.Imaging.EncoderParameter($myEncoder, $quality)
#Получаем тип картинки
$myImageCodecInfo = [System.Drawing.Imaging.ImageCodecInfo]::GetImageEncoders()|where {$_.MimeType -eq 'image/jpeg'}
# Высчитывание кратности
$ratioX = $canvasWidth / $bmp.Width;
$ratioY = $canvasHeight / $bmp.Height;
$ratio = $ratioY
if($ratioX -le $ratioY){
    $ratio = $ratioX
}
# Создание пустой картинки
$newWidth = [int] ($bmp.Width*$ratio)
$newHeight = [int] ($bmp.Height*$ratio)
$bmpResized = New-Object System.Drawing.Bitmap($newWidth, $newHeight)
$graph = [System.Drawing.Graphics]::FromImage($bmpResized)
$graph.Clear([System.Drawing.Color]::White)
$graph.DrawImage($bmp,0,0 , $newWidth, $newHeight)
# Создание пустого потока
$ms = New-Object IO.MemoryStream
$bmpResized.Save($ms,$myImageCodecInfo, $($encoderParams))
# уборка
$bmpResized.Dispose()
$bmp.Dispose()
return $ms.ToArray()
}


Fügen Sie diese Funktion in das Skript ein.

Ein Auszug aus dem Hauptteil des Skripts, registrieren Sie den Pfad zum Foto, Login, Personalnummer, Name
  $PhotoPath = '\\server\FOTO\' 
  #создаем PSDrive чтобы избежать проблем с обращениям к сетевым дискам при подключённой оснастке PSSQL 
  New-PSDrive -Name Photo -PSProvider FileSystem -Root $PhotoPath
    $UserLogin = 'login'
    $EmployeeID = '503'
    $FullName = 'Full User Name'
    # закомментировать для уменьшения вывода
    write-host "Обрабатываем: `n Логин: " $UserLogin "`n номер:"   $EmployeeID "`n ФИО: "  $FullName 
    # проверяем  соответствие логина в AD и внешней системе   
    $aduser = get-aduser $UserLogin -ErrorAction SilentlyContinue 
    if ($aduser.name -ne $FullName) {
            # если не совпадает выводим на экран и ничего не делаем 
            write-host "in Office " $FullName "`n in ad  " $aduser.name  "`nLogin " $UserLogin " `n`n" -ForegroundColor Red
    } else {
        # присваиваем EmployeeID в AD из внешней системы
        Set-ADUser $UserLogin -EmployeeID $EmployeeID
        $PhotoFile = 'Photo:\'+$EmployeeID+'.jpg'
        # проверяем что фото есть
        If (Test-Path $PhotoFile )  {
            # Если есть фото сотрудника
            # указываем путь к фото и качество
            $thumbnailPhoto = [byte[]]( $(resizephoto $PhotoFile 64 80))
            $jpegPhoto = [byte[]]( $(resizephoto $PhotoFile 648 80))
            # добавляем фото в thumbnailPhoto
            Set-ADUser $UserLogin -Replace @{thumbnailPhoto=$thumbnailPhoto} -ErrorVariable ErrorthumbnailPhoto  #-WhatIf
            if ($ErrorthumbnailPhoto -ne $null) {
                # в случае ошибки
                write-host "Ошибка добавления thumbnailPhoto на логине "$UserLogin  " ID " $_.autokey
                exit
			} 
            # добавляем фото в jpegPhoto
            Set-ADUser $UserLogin -Replace @{jpegPhoto=($jpegPhoto)} -ErrorVariable ErrorjpegPhoto #-WhatIf
            if ($ErrorjpegPhoto -ne $null) {
                # в случае ошибки
                write-host "Ошибка добавления jpegPhoto на логине "$UserLogin  " ID " $_.autokey
                exit
			} 
            if (!$ErrorthumbnailPhoto -and !$ErrorjpegPhoto) {
                # Если без ошибок
                # закомментировать для уменьшения вывода
                write-host 'Обработали...' -ForegroundColor Green
            }
        } else {
            # Если нет фото
            Write-Host " Фото " $PhotoFile " для " $UserLogin " не найдено"  -foregroundcolor red
        }
    }


Der Pfad zum Foto wurde über PSDrive festgelegt, da nach dem Verbinden des PowerShell PSSQL-Moduls für die Arbeit mit MS SQL der aktuelle Pfad in PS SQLSERVER: \> geändert wird und der Zugriff auf Netzwerkressourcen ohne Änderung des Ordners nicht mehr möglich ist. Das Foto wird in einer Netzwerkressource gespeichert, wobei der Dateiname die Personalnummer ist. Das Beispiel entfernt die Protokollierung und Fehlerbehandlung.


Hochladen von Fotos aus Active Directory:
Einige Beispiele zum Überprüfen der Richtigkeit des Hochladens von Fotos in Active Directory.

Verwenden des Microsoft PowerShell for Active Directory-Moduls:

Import-Module ActiveDirectory
$user = Get-ADUser  -Properties thumbnailphoto , jpegPhoto
$user.thumbnailphoto | Set-Content $env:temp\thumbnailphoto.jpg -Encoding byte 
$user.jpegPhoto | Set-Content $env:temp\jpegPhoto.jpg -Encoding byte 

Verwenden von PowerShell und ADSI:

$username=$env:username
$domain=$env:userdomain
$temp=$env:temp
$thumbnailphoto = ([ADSISEARCHER]"samaccountname=$($username)").findone().properties.thumbnailphoto
if(!($thumbnailphoto -eq $null)) {$thumbnailphoto | set-content $temp\$domain+$username.thumbnailphoto.jpg -Encoding byte}
$jpegphoto = ([ADSISEARCHER]"samaccountname=$($username)").findone().Properties.jpegphoto
if(!($jpegphoto -eq $null)) {$jpegphoto  | set-content $temp\$domain+$username.jpegPhoto.jpg -Encoding byte}

Suche nach Benutzern mit / ohne Foto:

Import-Module ActiveDirectory
Get-ADUser -Filter * -properties thumbnailPhoto | ? {$_.thumbnailPhoto} | select Name
Get-ADUser -Filter * -properties thumbnailPhoto | ? {(-not($_.thumbnailPhoto))} | select Name
Get-ADUser -Filter * -properties jpegPhoto | ? {$_.jpegPhoto} | select Name
Get-ADUser -Filter * -properties jpegPhoto | ? {(-not($_.jpegPhoto))} | select Name

Was kann ich mit Fotos machen, die in Active Directory hochgeladen wurden?

Verwenden von Fotos aus AD im Windows-Menü
„Verwenden von AD-Fotos als Windows 7-Benutzerkacheln“ ;
"Stellen Sie Windows 7 User Tile auf AD Thumbnail pic . "

Oder schreiben Sie Ihr Telefonbuch als titulusdesiderio " Telefonbuch" mit Blackjack und einem Foto.

Jetzt auch beliebt: