none
Включение пользователя зависимо от Даты из CSV RRS feed

  • Вопрос

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

    Есть CSV файл с полями Name,DateIN,DateOUT.
    Дата формата ddMMyyyy
    Задача включать и отключать учетную запись, если дата в файле совпадает с настоящей.

    Мои попытки:

    $now = Get-date

    Import-Csv \2.csv  |
        ForEach-Object {
            $Name = $_.Name
            $date1 = $_.datein
            $date2 = $_.dateout
        }

    {if (($date1 -as [DateTime]) -eq $now)
        {
        Disable-ADAccount -Identity $_.Name

        }
    else 
            { if (($date2 -as [DateTime]) -eq $now)
        {
        enable-ADAccount -Identity $_.Name

        }}   
        }

    Результата не дает. Как я понимаю проблема в сопоставлении даты. 

    В чем может быть ошибка?

      
    • Изменено D.Estly 19 февраля 2021 г. 13:14
    19 февраля 2021 г. 12:47

Ответы

  • 1 $now = get-date -hours 0 -minutes 0 -seconds 0 -milliseconds 0

    2 else а внутри if стоит заменить одним elseif...

    elseif (($date2 -as [DateTime]) -eq $now){
        Disable-ADAccount -Identity $Name
    }
    второй вариант это $now привести к формату ddMMyyyy при помощи -format / uFormat, но тогда это будет сравнением строк а не дат, а это слегка костыль

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

    • Помечено в качестве ответа D.Estly 24 февраля 2021 г. 12:04
    20 февраля 2021 г. 6:43
    Модератор
  • Добрый день.

    Я бы сделал вот так:

    $users = Import-csv 'Путь до csv' -Delimiter "разделитель"

    $now = [datetime]::Today.Date

    foreach($user in $users)
    {
        if($user.Name -eq $null)
        {
            Write-Host "SamAccountName пуст"
        }
        else
        {
            if([datetime]::ParseExact(($user.Datein),"dd.MM.yyyy",$null) -eq $now)
            {
                Write-Host "Включаем УЗ" $user.Name
            }
            elseif([datetime]::ParseExact(($user.Dateout),"dd.MM.yyyy",$null) -eq $now)
            {
                Write-Host "Отключаем УЗ" $user.Name
            }
        }
    }

    С помощью методов Today.Date и ParseExact все три даты будут в формате XX.XX.XXXX 0:00:00. Главное, чтобы в csv у вас даты были в одинаковом формате (ХХ.ХХ.ХХХХ).

    Ещё можно добавить проверку, если каким-либо образом в файле обе даты совпадают, то писалось бы письмо, что в файле ошибка. Это можно добавить финальным else'ом после блока elseif, как минимум на время обкатки скрипта.

    • Помечено в качестве ответа D.Estly 24 февраля 2021 г. 12:04
    20 февраля 2021 г. 11:53

Все ответы

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

    Есть CSV файл с полями Name,DateIN,DateOUT.
    Дата формата ddMMyyyy
    Задача включать и отключать учетную запись, если дата в файле совпадает с настоящей.

    Мои попытки:

    $now = Get-date

    Import-Csv \2.csv  |
        ForEach-Object { # <<<<< Начало foteach
            $Name = $_.Name
            $date1 = $_.datein
            $date2 = $_.dateout
        } # <<<<< конец foreach

    {if (($date1 -as [DateTime]) -eq $now) # <<<<< начало скриптблока которвй ничего не делает
        {
        Disable-ADAccount -Identity $_.Name # <<<< переменная пустая

        }
    else 
            { if (($date2 -as [DateTime]) -eq $now)
        {
        enable-ADAccount -Identity $_.Name #<<<< переменная пустая

        }}   
        } # <<<<<<< конец скриптблока который ничего не делает

    Результата не дает. Как я понимаю проблема в сопоставлении даты. 

    В чем может быть ошибка?

      

    проблем много

    $date1 -as [datetime] вообще работает? что вы получаете выполнив такой фрагмент? где нашли такую конструкцию?

    из-за путаницы со скобками вы в скриптблоке будете работать исключительно с последней записью из вашего csv


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

    19 февраля 2021 г. 14:54
    Модератор
  • Спасибо, действительно проблем много, поправил часть:

    $now = Get-date

    Import-Csv C:\Users\dagrodetsky\Desktop\2.csv  |
        ForEach-Object {
            $Name = $_.Name
            $date1 = $_.datein
            $date2 = $_.dateout


    if (($date1 -as [DateTime]) -eq $now)
        {
        Disable-ADAccount -Identity $Name

        }
    else 
            { if (($date2 -as [DateTime]) -eq $now)
        {
        Disable-ADAccount -Identity $Name

        }}   
        }

    Теперь скрипт дает данные при -ne , -eq не сопоставляет даты.

    Пример выводов:

    1)  $now

    20 февраля 2021 г. 09:24:37

    2) $date1

    20.02.2021

    3) $date1 -as [DateTime]

    20 февраля 2021 г. 00:00:00

    Соответственно он их сопоставить не может из-за времени похоже... 

    20 февраля 2021 г. 6:29
  • 1 $now = get-date -hours 0 -minutes 0 -seconds 0 -milliseconds 0

    2 else а внутри if стоит заменить одним elseif...

    elseif (($date2 -as [DateTime]) -eq $now){
        Disable-ADAccount -Identity $Name
    }
    второй вариант это $now привести к формату ddMMyyyy при помощи -format / uFormat, но тогда это будет сравнением строк а не дат, а это слегка костыль

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

    • Помечено в качестве ответа D.Estly 24 февраля 2021 г. 12:04
    20 февраля 2021 г. 6:43
    Модератор
  • Добрый день.

    Я бы сделал вот так:

    $users = Import-csv 'Путь до csv' -Delimiter "разделитель"

    $now = [datetime]::Today.Date

    foreach($user in $users)
    {
        if($user.Name -eq $null)
        {
            Write-Host "SamAccountName пуст"
        }
        else
        {
            if([datetime]::ParseExact(($user.Datein),"dd.MM.yyyy",$null) -eq $now)
            {
                Write-Host "Включаем УЗ" $user.Name
            }
            elseif([datetime]::ParseExact(($user.Dateout),"dd.MM.yyyy",$null) -eq $now)
            {
                Write-Host "Отключаем УЗ" $user.Name
            }
        }
    }

    С помощью методов Today.Date и ParseExact все три даты будут в формате XX.XX.XXXX 0:00:00. Главное, чтобы в csv у вас даты были в одинаковом формате (ХХ.ХХ.ХХХХ).

    Ещё можно добавить проверку, если каким-либо образом в файле обе даты совпадают, то писалось бы письмо, что в файле ошибка. Это можно добавить финальным else'ом после блока elseif, как минимум на время обкатки скрипта.

    • Помечено в качестве ответа D.Estly 24 февраля 2021 г. 12:04
    20 февраля 2021 г. 11:53
  • Всем спасибо за помощь, сам бы разбирался долго.

    Рабочий вариант получился благодаря Vector:

    $now = get-date -hour 0 -minute 0 -second 0 -millisecond 0

    Import-Csv -Delimiter "`t" \1.csv |
        ForEach-Object {
            $Name = $_.Name
            $date1 = $_.datein
            $date2 = $_.dateout
        

    if (($date1 -as [DateTime]) -eq $now)
        {
        Disable-ADAccount -Identity $_.Name
     
        }
    elseif (($date2 -as [DateTime]) -eq $now){
        Enable-ADAccount -Identity $_.Name
    }}   

    Так же понравилось решение предложенное Dmitriy Kurylev, буду использовать [datetime]::ParseExact в своем скрипте.

    24 февраля 2021 г. 12:04