none
PowerShell.Поиск учетных записей пользователей по описанию (Description)

    Вопрос

  • Здравствуйте.

    Есть задача, при увольнении сотрудника блокировать его учетную запись сроком на пол года и хранить ее в течении 6 месяцев. Решением было принято указывать дату блокировки в описании (description) учетной записи в формате dd.mm.yyyy (25.05.2018). По истечению срока хранения, учетная запись удаляется.

    Каким образом можно оформить скрипт, что бы он выдирал дату из описания учетной записи, сверял ее с текущей датой, и если срок истек, то бишь, больше или равно 6 месяцам, то учетная запись удаляется. 

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

    8 ноября 2018 г. 14:01

Ответы

  • На выходе:

    Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."
    At line:1 char:67
    + ... iption | ? {[datetime]::ParseExact($_.description.trim(),'dd.MM.yyyy' ...
    +                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : FormatException

    а если вставляю параметр "-SearchBase" так вывод вообще пустой.

    1. Значит данные предоставляете неверные. 

    2. -SearchBase - в этом OU нет пользователей, у которых правильно заполнено description.

    Вывод:

    Get-ADUser -Fi "description -like '*.*.20*'" -Pr description | Select description,@{n="L";e={$_.description.length}}

    • Помечено в качестве ответа ReMCatcheR 9 ноября 2018 г. 12:28
    9 ноября 2018 г. 11:48

Все ответы

  • get-aduser -filter * -properties description, enabled | where {($_.deskription -match '(\d{1,2}\.){2}\d{4}') -and ($_.enabled -eq $false)} | foreach { if ($_.description -match '(?''d''\d{1,2})\.(?''m''\d{1,2})\.(?''y''\d{4})'){ 
       $d = $matches['d']
       $m = $matches['m']
       $y = $matches['y']
       if (($d in 1..31) -and ($m in 1..12) and ((get-date "$y.$m.$d") -lt (get-date).addmonth(-6))){
           remove-aduser $_ -whatif
       }
    }


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

    8 ноября 2018 г. 15:05
  • get-aduser -filter * -properties description -SearchBase "OU=__Уволенные,OU=Users (domain.local),DC=domain,DC=local" |`
     where {($_.deskription -match '(\d{1,2}\.){2}\d{4}')} |`
     foreach { if ($_.description -match '(?''d''\d{1,2})\.(?''m''\d{1,2})\.(?''y''\d{4})'){
       $d = $matches['d']
       $m = $matches['m']
       $y = $matches['y']
       if (($d -in 1..31) -and ($m -in 1..12) -and ((get-date "$y.$m.$d") -lt (get-date).addmonth(-6))) {
           remove-aduser $_ -whatif
       }
    }
    }
    Проверил в изначальном виде, было много синтаксических ошибок, чуть подправил, изменил поиск пользователей, как нужно нам... Получился вот такой вариант, но ничего не происходит. -whatif ничего не выводит, скрипт прогоняется, но результата никакого, ошибок нет... что не так?
    9 ноября 2018 г. 8:23
  • {($_.deskription -match '(\d{1,2}\.){2}\d{4}')}

    а вы точно уверены что вы хорошо все ошибки поправили?


    • Изменено Svolotch 9 ноября 2018 г. 8:26
    9 ноября 2018 г. 8:26
  • Если бы я был в этом точно уверен, то, думаю все сработало бы.

    {($_.deskription -match '(\d{1,2}\.){2}\d{4}')} Изменил на 
    {($_.desсription -match '(\d{1,2}\.){2}\d{4}')}

    Результат тот же. Можете пояснить, что означают эти выражения?

    (?''d''\d{1,2})\.(?''m''\d{1,2})\.(?''y''\d{4}) и 
    {($_.deskription -match '(\d{1,2}\.){2}\d{4}')}

    И что за переменная $matches?

    9 ноября 2018 г. 8:50
  • \d - цифра

    {1,2} - количество таких символов (допустимые варианты от 1 до 2)

    (?''Name'' ...) - сохранит часть совпадения в переменной 'Name', получить которую можете чезер автоматически создаваеммый массив $Matches

    Простите за синтаксис - небыло ноута под руками, поэтому написал с телефона в котором нет поша

    Проверяйте по частям


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

    9 ноября 2018 г. 8:58
  • PS C:\Windows\system32> $matches
    PS C:\Windows\system32> "hello" -match "hello"
    True
    PS C:\Windows\system32> $matches

    Name                           Value
    ----                           -----
    0                              hello

    =============

    у ваас есть на выходе что нить вот в этом:

    get-aduser -filter * -properties description -SearchBase "OU=__Уволенные,OU=Users (domain.local),DC=domain,DC=local" | where {($_.desсription -match '(\d{1,2}\.){2}\d{4}')}

    https://xaegr.wordpress.com/2010/04/09/regexp-8-regex/
    • Изменено Svolotch 9 ноября 2018 г. 9:01
    9 ноября 2018 г. 8:59
  • поиск не происходит даже на первом этапе, то бишь тут

    get-aduser -filter * -properties description -SearchBase "OU=__Уволенные,OU=Users (domain.local),DC=domain,DC=local" | where {($_.desсription -match '(\d{1,2}\.){2}\d{4}')}

    вывод пустой. Хотя есть одна учетная запись у которой указана дата 31.08.2018

    9 ноября 2018 г. 9:04
  • что написано в дескрипшене?
    9 ноября 2018 г. 9:13
  • get-aduser -filter * -properties description -SearchBase ... | ft samaccountname, description

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

    9 ноября 2018 г. 9:15
  • Хотя есть одна учетная запись у которой указана дата в description 31.08.2018
    9 ноября 2018 г. 9:47
  • get-aduser -filter * -properties description -SearchBase ... | ft samaccountname, description

    Вот так вывод есть. Но если добавить:

    get-aduser -filter * -properties description -SearchBase ... | ft samaccountname, description | where {($_.Description -match '(\d{1,2}\.){2}\d{4}')}

    То вывод пустой.

    9 ноября 2018 г. 9:51
  • покажите вывод первой команды (секретную ифу можно размыть/замазать)

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

    9 ноября 2018 г. 10:13
  • может дата не точками разделена?

    PS C:\Windows\system32> "Хотя есть одна учетная запись у которой указана дата в description 31.08.2018"  | where {($_ -match '(\d{1,2}\.){2}\d{4}')}
    Хотя есть одна учетная запись у которой указана дата в description 31.08.2018
    
    кстати Вектор, может вопрос таки в скриптинг перекинуть?


    9 ноября 2018 г. 10:21
  • Вывод первой команды:

    PS C:\WINDOWS\system32> get-aduser -filter * -properties description -SearchBase "OU=2018-08,OU=__Уволенные,OU=Users (domain.local),DC=domain,DC=local"  | ft samaccountname, description 
    
    samaccountname description
    -------------- -----------
    ####                      
    ****                      
    ....                      
    !!!!                      
    %%%%                      
    ))))                      
    @@@@           31.08.2018 
    ((((                      
    &&&&                                          

    Вывод второй команды

    PS C:\WINDOWS\system32> get-aduser -filter * -properties description -SearchBase "OU=2018-08,OU=__Уволенные,OU=Users (domain.local),DC=domain,DC=local"  | ft samaccountname, description  | where {($_.desсription -match '(\d{1,2}\.){2}\d{4}')}
    
    PS C:\WINDOWS\system32> 

    9 ноября 2018 г. 10:22
  • get-aduser -filter * -properties description -SearchBase "OU=__Уволенные,OU=Users (domain.local),DC=domain,DC=local" | where {$_.desсription -match '\d{2}\.\d{2}\.\d{4}'}

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

    9 ноября 2018 г. 10:29
  • Тоже самое, делал так, вывод пустой.
    9 ноября 2018 г. 10:47
  • Get-ADUser -Fi "description -like '*.*.20*'" -Pr description | ? {[datetime]::ParseExact($_.description.trim(),'dd.MM.yyyy',$null) -le (Get-Date).AddMonths(-6)} | Remove-ADUser -Confirm:$false -Verbose


    • Изменено Kazun 9 ноября 2018 г. 11:22
    9 ноября 2018 г. 11:11
  • На выходе:

    Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."
    At line:1 char:67
    + ... iption | ? {[datetime]::ParseExact($_.description.trim(),'dd.MM.yyyy' ...
    +                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : FormatException

    а если вставляю параметр "-SearchBase" так вывод вообще пустой.

    9 ноября 2018 г. 11:40
  • На выходе:

    Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."
    At line:1 char:67
    + ... iption | ? {[datetime]::ParseExact($_.description.trim(),'dd.MM.yyyy' ...
    +                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : FormatException

    а если вставляю параметр "-SearchBase" так вывод вообще пустой.

    1. Значит данные предоставляете неверные. 

    2. -SearchBase - в этом OU нет пользователей, у которых правильно заполнено description.

    Вывод:

    Get-ADUser -Fi "description -like '*.*.20*'" -Pr description | Select description,@{n="L";e={$_.description.length}}

    • Помечено в качестве ответа ReMCatcheR 9 ноября 2018 г. 12:28
    9 ноября 2018 г. 11:48
  • Вот так отработало, результат получен верный, с добавлением "-SearchBase"

    Get-ADUser -Fi "description -like '*.*.20*'" -Pr description | Select description,@{n="L";e={$_.description.length}}

    9 ноября 2018 г. 12:27
  • Каким образом теперь оформить что бы происходило сравнение дат, в описании и даты на сегодняшний день, и если разница в 6 месяцев, удалять?
    9 ноября 2018 г. 12:29
  • Каким образом теперь оформить что бы происходило сравнение дат, в описании и даты на сегодняшний день, и если разница в 6 месяцев, удалять?
    Привести вывод команды с Select, чтобы можно было понять, почему проблема с форматом даты.
    9 ноября 2018 г. 12:38
  • как нибудь... тут все равно никто не в курсе как у вас там дата прописана и почему она у вас нормально не парсится
    9 ноября 2018 г. 12:39
  • Дата прописана вот так, в одном из выводов она указана, чуть выше. Но продублирую тут:

    31.08.2018 - с точностью как тут дата указана в дескрипшене учетной записи пользователя

    9 ноября 2018 г. 14:03
  • PS C:\WINDOWS\system32> Get-ADUser -Fi "description -like '*.*.20*'" -Pr description -SearchBase "OU=2018-08,OU=__Уволенные,OU=Users (domain.local),DC=domain,DC=local" | Select description,@{n="L";e={$_.description.length}}
    
    description  L
    -----------  -
    31.08.2018  10

    Вот вывод команды с select

    9 ноября 2018 г. 14:05
  • Дата прописана вот так, в одном из выводов она указана, чуть выше. Но продублирую тут:

    31.08.2018 - с точностью как тут дата указана в дескрипшене учетной записи пользователя

    Дата меньше,чем 6 месяцев, поэтому будет пустой вывод при удалении.

    Get-ADUser -Fi "description -like '*.*.20*'" -Pr description -SearchBase "OU=2018-08,OU=__Уволенные,OU=Users (domain.local),DC=domain,DC=local" | ? {[datetime]::ParseExact($_.description.trim(),'dd.MM.yyyy',$null) -le (Get-Date).AddMonths(-6)} | Remove-ADUser -Confirm:$false -Verbose

    10 ноября 2018 г. 8:12