none
Сортировка RRS feed

  • Вопрос

  • Доброго дня.

    Сегодня задался скриптом, который вытаскивает данные -пользователей из csv и на их основе, предоставляет необходимую информацию. Но, столкнулся с тем, что если пользователь не найден, например был удалён или не верно указан в файле, то в отчёт выгруженного файла эта информация не попадает. В итоге, из 3000 записей в консоли PS пробегает более сотни, а может и больше ошибок о ненайденном пользователе. Вопрос в том, как сделать так, что бы эта информация писалась в файл или писалась в отдельный файлик с этими ненайденными пользователями?

    8 апреля 2020 г. 12:40

Ответы

  • если бы был скрипт можно было бы говорить детально, а так вариантов традиционно вагон:

    # Вариант 1
    
    $ErrorActionPreferences = "SilentlyContinue"
    $user = Get-AdUser "userThatDoesNotExists"  
    if ($user){
       Write-Host "User exists"
    } else {
       Write-Host "User does not exists"
    }
    
    # Вариант 2
    
    $ErrorActionPreferences = "Stop"
    Try {
       $user = Get-AdUser "userThatDoesNotExists"
       Write-Host "User exists"
    } Catch {
       Write-Host "User does not exists"
    }


    The opinion expressed by me is not an official position of Microsoft


    8 апреля 2020 г. 13:12
    Модератор
  • если бы был скрипт можно было бы говорить детально, а так вариантов традиционно вагон:

    # Вариант 1
    
    $ErrorActionPreferences = "SilentlyContinue"
    $user = Get-AdUser "userThatDoesNotExists"  
    if ($user){
       Write-Host "User exists"
    } else {
       Write-Host "User does not exists"
    }
    
    # Вариант 2
    
    $ErrorActionPreferences = "Stop"
    Try {
       $user = Get-AdUser "userThatDoesNotExists"
       Write-Host "User exists"
    } Catch {
       Write-Host "User does not exists"
    }


    The opinion expressed by me is not an official position of Microsoft


    Вот сам скрипт:

     import-csv C:\BD\UserProp.csv | ForEach-Object {Get-ADUser -Identity $_.SamAccountName -properties *} | Select-Object SamAccountName,name,CannotChangePassword,PasswordNeverExpires | ft > c:\bd\users.csv

    $FUsers = @()
    $NFUsers = @()
    $ErrorActionPreferences = 'Stop'
    Import-CSV C:\BD\UserProp.csv | ForEach-Object {
       try {
          $SamAccountName = $_.SamAccountName
          # Если пользователь существует то он добавится в массив $FUsers в противном случае появится ошибка и скрипт вывалится в Catch
          $FUsers += Get-ADUser -Identity $SamAccountName -properties * | Select-Object SamAccountName,name,CannotChangePassword,PasswordNeverExpires
       } Catch {
          # Тут будут добавляться пользюки которых ненашло
          $NFUsers += $SamAccountName
          # Когда команда вываливается в Catch $_ содержит уже не обьект из foreach, а ошибку с которой скрипт вывалился
          Write-Host "Get-AdUser command failed. Error: $_"
       }
    } 
    # Конструкция FT > file.csv это дикий костыль так как Format-Table (FT) должен быть последним командлетом в пайплайне
    # Если нужен CSV, то используется командлет Export-CSV
    $FUsers | Export-CSV c:\bd\Success_users.csv
    # Если нужно вывести неструктурированные данные в файл, то  можно юзать Out-File
    $NFUsers | Out-File c:\bd\Failed_users.txt

    Это одна из возможных реализаций (описана в первом ответе как вариант 2)

    Практики ради можете переписать тоже самое под вариант 1

    ПС скрипт от команды отличается тем что его просто читать, команды вынесены на разные строки и вложенность обозначается отсупами (3 пробела или таб как правило)


    The opinion expressed by me is not an official position of Microsoft



    8 апреля 2020 г. 22:30
    Модератор
  • Спасибо, скрипт отработал, но в файле Failed, ничего нет. Он пустой :(

    А в файле Success, русский текст стал в виде ??????? 

    1 если вы этого еще не сделали, то одновите PoSh хотябы до 5 версии

    2 посмотрите справку по export-csv, найдите описание параметра -Encoding

    3 FailedUsers - мое упущение. Сейчас поправлю скрипт в предыдущем ответе


    The opinion expressed by me is not an official position of Microsoft

    • Помечено в качестве ответа Cloomger_Tasher 9 апреля 2020 г. 8:00
    9 апреля 2020 г. 6:24
    Модератор

Все ответы

  • если бы был скрипт можно было бы говорить детально, а так вариантов традиционно вагон:

    # Вариант 1
    
    $ErrorActionPreferences = "SilentlyContinue"
    $user = Get-AdUser "userThatDoesNotExists"  
    if ($user){
       Write-Host "User exists"
    } else {
       Write-Host "User does not exists"
    }
    
    # Вариант 2
    
    $ErrorActionPreferences = "Stop"
    Try {
       $user = Get-AdUser "userThatDoesNotExists"
       Write-Host "User exists"
    } Catch {
       Write-Host "User does not exists"
    }


    The opinion expressed by me is not an official position of Microsoft


    8 апреля 2020 г. 13:12
    Модератор
  • если бы был скрипт можно было бы говорить детально, а так вариантов традиционно вагон:

    # Вариант 1
    
    $ErrorActionPreferences = "SilentlyContinue"
    $user = Get-AdUser "userThatDoesNotExists"  
    if ($user){
       Write-Host "User exists"
    } else {
       Write-Host "User does not exists"
    }
    
    # Вариант 2
    
    $ErrorActionPreferences = "Stop"
    Try {
       $user = Get-AdUser "userThatDoesNotExists"
       Write-Host "User exists"
    } Catch {
       Write-Host "User does not exists"
    }


    The opinion expressed by me is not an official position of Microsoft


    Вот сам скрипт:

     import-csv C:\BD\UserProp.csv | ForEach-Object {Get-ADUser -Identity $_.SamAccountName -properties *} | Select-Object SamAccountName,name,CannotChangePassword,PasswordNeverExpires | ft > c:\bd\users.csv

    8 апреля 2020 г. 18:47
  • если бы был скрипт можно было бы говорить детально, а так вариантов традиционно вагон:

    # Вариант 1
    
    $ErrorActionPreferences = "SilentlyContinue"
    $user = Get-AdUser "userThatDoesNotExists"  
    if ($user){
       Write-Host "User exists"
    } else {
       Write-Host "User does not exists"
    }
    
    # Вариант 2
    
    $ErrorActionPreferences = "Stop"
    Try {
       $user = Get-AdUser "userThatDoesNotExists"
       Write-Host "User exists"
    } Catch {
       Write-Host "User does not exists"
    }


    The opinion expressed by me is not an official position of Microsoft


    Вот сам скрипт:

     import-csv C:\BD\UserProp.csv | ForEach-Object {Get-ADUser -Identity $_.SamAccountName -properties *} | Select-Object SamAccountName,name,CannotChangePassword,PasswordNeverExpires | ft > c:\bd\users.csv

    $FUsers = @()
    $NFUsers = @()
    $ErrorActionPreferences = 'Stop'
    Import-CSV C:\BD\UserProp.csv | ForEach-Object {
       try {
          $SamAccountName = $_.SamAccountName
          # Если пользователь существует то он добавится в массив $FUsers в противном случае появится ошибка и скрипт вывалится в Catch
          $FUsers += Get-ADUser -Identity $SamAccountName -properties * | Select-Object SamAccountName,name,CannotChangePassword,PasswordNeverExpires
       } Catch {
          # Тут будут добавляться пользюки которых ненашло
          $NFUsers += $SamAccountName
          # Когда команда вываливается в Catch $_ содержит уже не обьект из foreach, а ошибку с которой скрипт вывалился
          Write-Host "Get-AdUser command failed. Error: $_"
       }
    } 
    # Конструкция FT > file.csv это дикий костыль так как Format-Table (FT) должен быть последним командлетом в пайплайне
    # Если нужен CSV, то используется командлет Export-CSV
    $FUsers | Export-CSV c:\bd\Success_users.csv
    # Если нужно вывести неструктурированные данные в файл, то  можно юзать Out-File
    $NFUsers | Out-File c:\bd\Failed_users.txt

    Это одна из возможных реализаций (описана в первом ответе как вариант 2)

    Практики ради можете переписать тоже самое под вариант 1

    ПС скрипт от команды отличается тем что его просто читать, команды вынесены на разные строки и вложенность обозначается отсупами (3 пробела или таб как правило)


    The opinion expressed by me is not an official position of Microsoft



    8 апреля 2020 г. 22:30
    Модератор
  • Спасибо, скрипт отработал, но в файле Failed, ничего нет. Он пустой :(

    А в файле Success, русский текст стал в виде ??????? 

    9 апреля 2020 г. 5:06
  • Спасибо, скрипт отработал, но в файле Failed, ничего нет. Он пустой :(

    А в файле Success, русский текст стал в виде ??????? 

    1 если вы этого еще не сделали, то одновите PoSh хотябы до 5 версии

    2 посмотрите справку по export-csv, найдите описание параметра -Encoding

    3 FailedUsers - мое упущение. Сейчас поправлю скрипт в предыдущем ответе


    The opinion expressed by me is not an official position of Microsoft

    • Помечено в качестве ответа Cloomger_Tasher 9 апреля 2020 г. 8:00
    9 апреля 2020 г. 6:24
    Модератор
  • Спасибо, скрипт отработал, но в файле Failed, ничего нет. Он пустой :(

    А в файле Success, русский текст стал в виде ??????? 

    1 если вы этого еще не сделали, то одновите PoSh хотябы до 5 версии

    2 посмотрите справку по export-csv, найдите описание параметра -Encoding

    3 FailedUsers - мое упущение. Сейчас поправлю скрипт в предыдущем ответе


    The opinion expressed by me is not an official position of Microsoft

    По 2 пункту, я действительно совсем забыл об этом параметре) -добавил, всё отработало.

    По 3 пункту, тоже всё отработало, но, странная вещь, там появились  пользователи, которые якобы отсутствуют и выходит ошибка, но введя этого пользователя в консоль АД, такой пользователь есть... И я кажется понял почему так. Там после логина пробел стоит...)))


    9 апреля 2020 г. 7:52
  • Большое Вам спасибо)))))
    9 апреля 2020 г. 7:59
  • Большое Вам спасибо)))))
    обращайтесь :)

    The opinion expressed by me is not an official position of Microsoft

    9 апреля 2020 г. 8:12
    Модератор