none
Список пользователей отдельными файлами powershell RRS feed

  • Вопрос

  • Добрый день!

    1) Подскажите, пожалуйста, как можно сделать так, чтобы cmdlet Get-Aduser, выводил каждого пользователя отдельным файлом и называл этот файл именем пользователя. Фрагемент:

    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = "LDAP://dc=test,dc=ru"
    $objSearcher.Filter = "(&(objectCategory=person)(!userAccountControl:1.2.840.113556.1.4.803:=2))"
    $users = $objSearcher.FindAll()
    # Количество учетных записей
    $users.Count
    $users | ForEach-Object {
       $user = $_.Properties
       New-Object PsObject -Property @{
       Должность = [string]$user.description

       ФИО = [string]$user.cn
        }
    } | Export-Csv -NoClobber -Encoding utf8 -Path  С:\Export\AD.csv

    2) Как можно добавить вывод фото пользователя?

     Фото = [string]$user.thumbnailPhoto

    не работает.

    Заранее спасибо



    • Изменено Curious_Harry 30 октября 2016 г. 12:23
    30 октября 2016 г. 11:24

Ответы

  • $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = "LDAP://dc=test,dc=ru"
    $objSearcher.Filter = "(&(objectCategory=person)(!userAccountControl:1.2.840.113556.1.4.803:=2))"
    $users = $objSearcher.FindAll()
    # Количество учетных записей
    $users.Count
    $users | ForEach-Object {
        $user = $_.Properties
    	$photo = $null
    	if($user.samaccountname) {
    		if($user.thumbnailphoto) {
    			$photo = [Convert]::ToBase64String($user.thumbnailphoto[0])
    		}		
    		$obj = New-Object PsObject -Property @{
    			Должность = [string]$user.title
    			ФИО = [string]$user.cn
    		}
    		if($photo) {
    			$obj | ConvertTo-Html -PostContent "<img src=data:image/png;base64,$($photo) alt='User'/>" | Out-File "C:\Export\$($user.samaccountname).html"
    		} else {
    			$obj | ConvertTo-Html | Out-File "C:\Export\$($user.samaccountname).html"
    		}
    	}
    }

    • Помечено в качестве ответа Curious_Harry 30 октября 2016 г. 13:53
    30 октября 2016 г. 13:45
    Отвечающий

Все ответы

  • Свойства должны быть в нижнем регистре и не содержат пробелов.

    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = "LDAP://dc=test,dc=ru"
    $objSearcher.Filter = "(&(objectCategory=person)(!userAccountControl:1.2.840.113556.1.4.803:=2))"
    $users = $objSearcher.FindAll()
    # Количество учетных записей
    $users.Count
    $users | ForEach-Object {
        $user = $_.Properties
    	if($user.thumbnailphoto) {
    		$user.thumbnailphoto | Set-Content "С:\Export\$($user.samaccountname).jpg" -Encoding Byte
    	}
        New-Object PsObject -Property @{
    		Должность = [string]$user.description
    		ФИО = [string]$user.cn
    		Фото = $user.thumbnailphoto[0] -join ";"
         } | Export-Csv -NoClobber -Encoding utf8 -Path "С:\Export\$($user.samaccountname).csv"
     }

    Восстановить фото из csv:

    $user = Import-Csv user.csv
    [byte[]]$user.Фото.split(";") | Set-Content user.jpg -Encoding byte

    30 октября 2016 г. 12:24
    Отвечающий
  • Большое спасибо за ответ.

    Но, к сожалению, что-то не получается.

    Не удается индексировать в массив NULL.
    ps1:12 знак:5
    +     New-Object PsObject -Property @{
    +     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray

    Set-Content : Не удается найти параметр, соответствующий имени параметра "Encoding".
    10 знак:76
    +         $user.thumbnailphoto | Set-Content "С:\Export\$($user.samaccountname).jpg" -Enco ...
    +                                                                                  ~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Set-Content], ParameterBindingException
        + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.SetContentCommand

    30 октября 2016 г. 12:59
  • Для PowerShell 2:

    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = "LDAP://dc=test,dc=ru"
    $objSearcher.Filter = "(&(objectCategory=person)(!userAccountControl:1.2.840.113556.1.4.803:=2))"
    $users = $objSearcher.FindAll()
    # Количество учетных записей
    $users.Count
    $users | ForEach-Object {
        $user = $_.Properties
    	if($user.samaccountname) {
    		$photo = $null
    		if($user.thumbnailphoto) {
    			$photo = $user.thumbnailphoto[0]
    			$photo | Set-Content "C:\Export\$($user.samaccountname).jpg" -Encoding Byte
    		}
    		New-Object PsObject -Property @{
    			Должность = [string]$user.description
    			ФИО = [string]$user.cn
    			Фото = $photo -join ";"
    		 } | Select Должность,ФИО,Фото | Export-Csv -NoClobber -Encoding utf8 -Path "C:\Export\$($user.samaccountname).csv"
    	}
     }

    30 октября 2016 г. 13:09
    Отвечающий
  • Благодарю, за Ваше время.

    Получается примерно следующее:

    #TYPE Selected.System.Management.Automation.PSCustomObject
    "Должность","ФИО","Фото"
    "", ","255;216;255;224;0;16;74;70;73;70;0;

    Выводилось нармально только ФИО, в графе фото - цифры.

    Заменил блок [string]$user.description на [string]$user.title стала корректно отображаться должность. Фотографии выводятся отдельным файлом. Может быть эту информацию можно вывести через Convert-HTML и тогда в html-файле она будет корректно отображаться?

    30 октября 2016 г. 13:29
  • $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = "LDAP://dc=test,dc=ru"
    $objSearcher.Filter = "(&(objectCategory=person)(!userAccountControl:1.2.840.113556.1.4.803:=2))"
    $users = $objSearcher.FindAll()
    # Количество учетных записей
    $users.Count
    $users | ForEach-Object {
        $user = $_.Properties
    	$photo = $null
    	if($user.samaccountname) {
    		if($user.thumbnailphoto) {
    			$photo = [Convert]::ToBase64String($user.thumbnailphoto[0])
    		}		
    		$obj = New-Object PsObject -Property @{
    			Должность = [string]$user.title
    			ФИО = [string]$user.cn
    		}
    		if($photo) {
    			$obj | ConvertTo-Html -PostContent "<img src=data:image/png;base64,$($photo) alt='User'/>" | Out-File "C:\Export\$($user.samaccountname).html"
    		} else {
    			$obj | ConvertTo-Html | Out-File "C:\Export\$($user.samaccountname).html"
    		}
    	}
    }

    • Помечено в качестве ответа Curious_Harry 30 октября 2016 г. 13:53
    30 октября 2016 г. 13:45
    Отвечающий
  • Большое спасибо!

    В html выводится корректно.

    30 октября 2016 г. 13:53