Ответы пользователя по тегу Active Directory
  • Как грамотно реализовать на PowerShell?

    @MaxKozlov Куратор тега PowerShell
    Какой ответ вы ждёте ?

    Я встречал в своей практике и чисто на скриптах и как отдельное приложение на C# (с возможностью запуска всё тех же скриптов для работы с exchange)

    Мой вариант ответа - можно. Но скрипт будет большой и сложный.

    С учётом необходимости создавать учётки там, где они сами не создаются, тот или иной вид скриптов всё равно понадобится.

    Делать это средствами только скриптов, или использовать, например, какие-то прослойки в виде очередей или серверов sso - на ваш вкус и опыт писания/настройки всего промежуточного.

    Только, на мой взгляд, БД здесь лишний элемент. Точнее, БД имеет смысл, только если запросы в AD для вас окажутся слишком дорогими (при большом количестве сотрудников)
    Ответ написан
    Комментировать
  • Kак сделать многопоточный PS-скрипт?

    @MaxKozlov Куратор тега PowerShell
    Самое простое - Start-Job, оно есть везде, начиная с 3.0
    но оно памяти жрёт и использует процессы, а не потоки. по быстрому, на десяток-другой компов - сойдёт.

    Многопоточное:
    • PoshRSJob (причём лучше мой форк ;)
    • ThreadJob
    • Invoke-Parallel


    Всё это (модули/скрипты) требует установки на админский комп для запуска задач в стиле
    $computers | Start-RSJob { Invoke-MyCommand -Computer $_ }

    Потом можно посмотреть результаты работы
    Get-RSJob | Receive-RSJob

    а уже внутри Invoke-MyCommand будет выполняться что-то, что лезет удалённо и делает там свои дела
    Но вот это Invoke-MyCommand - если это внешняя функция, а не просто набор действий, требует дополнительного "проталкивания" в поток. Примеры есть

    Другие модули работают аналогично, со своими нюансами, естественно
    Ответ написан
    4 комментария
  • Ошибка определения переменной powershell, в чем причина?

    @MaxKozlov Куратор тега PowerShell
    Ну вы введите прямо в PS
    $csvData = Import-CSV -Path C:\share\FII.csv -Delimiter "," -Encoding UTF8
    $csvData[0]."ФамилияИмя"

    Если там что-то будет, то пойти дальше
    Get-ADUser -Filter { DisplayName -eq $csvData[0]."ФамилияИмя" }


    А если нет - то ванга подсказывает, что может быть проблема с кодировкой файла и стоит посмотреть, что вообще выдаст $csvData[0]

    проблема действительно была в кодировке , при запросе выдавались крокозябры
    Ответ написан
    Комментировать
  • Не выводятся значения пользователей AD через powershell, в чем причина?

    @MaxKozlov Куратор тега PowerShell
    Проблема в том, что
    $user = Get-ADUser -identity "i.tsebrenko"
    Возвращает только стандартные поля
    DistinguishedName
    Enabled
    GivenName
    Name
    ObjectClass
    ObjectGUID
    SamAccountName
    SID
    Surname
    UserPrincipalName


    Если вы хотите посмотреть именно DisplayName, надо его специально просить
    $user = Get-ADUser -identity "i.tsebrenko" -Property DisplayName
    Write-Host $user.DisplayName


    Кстати, если вот такая фильтрация вам внезапно вернёт двоих, скрипт упадёт
    #Фильтруем пользаков по схожему описанию в AD
    $User = Get-ADUser -Filter {Description -eq $userDescription}
    #Изменяем указанные поля полями из csv файлы , присваиваем значения через $row.значение_из_таблицы
    if ($User) {

    Тут надо этот момент отдельно обрабатывать. Мало ли, кто-то руками description поправит
    Ответ написан
    4 комментария
  • Почему переменная перестаёт выводиться в терминал?

    @MaxKozlov Куратор тега PowerShell
    То же самое, что и в прошлый раз.
    У вас в выводе встречаются несколько разных объектов
    Сначала $lol.IdentityReference
    потом $myArray
    Состав полей у объектов разный. Перед выводом, собственно на экран (хост), Powershell буферизует вывод и пытается его подстроить под вас.
    Для этого он берёт состав полей второго объекта (там список с полями)
    PS полагает, что данный объект и должен быть примером, поэтому пытается выводить на экран для первого объекта те же поля, что и для второго. А там их, конечно, нет. В результате не выводится ничего.
    Промежуточный вывод на хост через Format- разбивает буфер и вы видите оба объекта со своими полями

    Ну и, как я писал в прошлый раз, необходимо выводить всё единообразно. Работаете только с экраном ?
    Используйте Out-Host, Write-Host, Format-xxx
    Хотите выводить в потоки, переменные и тп - используете обычные выводы
    Фактически ваш вызов $lol.IdentityReference это для Powershell $lol.IdentityReference | Out-Default, потому что далее этот вывод никуда не попадает, ни в переменную, ни в поток

    А вам явно бы хотелось Out-Host
    Ответ написан
    3 комментария
  • Имя входа пользователя Samaccountname Userprincipalname, как задать одинаковое значение?

    @MaxKozlov Куратор тега PowerShell
    Ну, строго говоря, оно не может быть одинаковым

    Обычно,
    userPrincipalName = samAccountName + '@' + $DomainName


    $DomainName при этом может быть как $env:USERDNSDOMAIN, так и, например, (Get-ADDomain).DNSRoot
    Ещё вариант может быть такой
    $domain = Get-ADDDomain
    $DomainName = $domain.Name + $domain.ParentDomain
    смотря от кого получаешь данные...

    ну а дальше смотри ответ Alexey Dmitriev
    Ответ написан
    2 комментария
  • Как получить список пользователей которые входили на компьютер?

    @MaxKozlov Куратор тега PowerShell
    Парсить Security Event Log на соответствующем компе

    event-4648
    event-4647

    event-4624
    event-4634

    типа
    [DateTime]$StartDate = '2023-05-11'
    [DateTime]$EndDate = '2023-05-12'
    $ComputerName= 'targetcomputer'
    
    $params = @{
      ComputerName=$ComputerName
    	FilterXml = '<QueryList>
    	  <Query Id="0" Path="Security">
            <Select Path="Security">*[System[(EventID=4647 or EventID=4648) and
            TimeCreated[@SystemTime&gt;='''+
            $StartDate.ToUniversalTime().ToString('u').Replace(' ','T') + ''' and 
            @SystemTime&lt;'''+
            $EndDate.ToUniversalTime().ToString('u').Replace(' ','T')+ ''']]]
            </Select>
    	  </Query>
    	</QueryList>'
    }
    $e = Get-WinEvent @params
    
    # Ну и тут потом анализировать $e
    Ответ написан
    3 комментария
  • Как узнать дату последнего использования учётной записи в AD?

    @MaxKozlov Куратор тега PowerShell
    Если посмотреть на доки
    атрибут Last-Logon
    Атрибут Last-Logon-Timestamp
    То там есть
    Значение нуля означает, что время последнего входа неизвестно.

    Фиг знает, почему оно может быть неизвестно, но это может быть ваш случай :)

    ну и эту ссылочку оставлю для тех, кто ещё не разобрался в нюансах
    Understanding the AD Account attributes - LastLogo...
    Ответ написан
  • Как через powershell задать программу во вкладке среда пользователя AD?

    @MaxKozlov Куратор тега PowerShell
    Содержимое этой вкладки зашифровано в атрибуте
    userParameters
    Расшифровывать/Зашифровывать его муторно, поэтому если вам надо просто устанавливать его всем одинаковым, проще один раз его заполнить вручную, потом считать из AD, записать результат в файлик и впоследствии просто из файлика его присваивать. Или из другого юзера, как в примере.
    $referenceUser = Get-ADUser refuser -Property userParameters
    Set-ADUser targetUser -Replace @{
        userParameters = $referenceUser.userParameters
    }


    Для New-ADUser можно использовать -OtherAttributes
    Ответ написан
    2 комментария
  • Как можно определить перечень файлов и директорий с отсутствующий группой безопасности через Powershell?

    @MaxKozlov Куратор тега PowerShell
    $ar = New-Object System.Security.AccessControl.FileSystemAccessRule($group, @('Read', 'ReadAndExecute'), 
          'ContainerInherit,ObjectInherit', 'None', 'Allow')
    # Получаете список папок
    Get-ChildItem -Directory -Recurse $Path | Foreach-Object {
    # Получаете по ним ACL
      $acl = $_.GetAccessControl('Access')
    # Сравниваете с нужным
      if (-not ($acl.Access.IdentityReference -eq $group)) {
    # Добавляете если надо
        $acl.SetAccessRule($ar)
        $_.SetAccessControl($acl)
      }
    }

    upd: Поправил сравнение, так как для массивов на -eq происходит фильтрация, вынес создание $ar из цикла

    А вообще, как у вас могут появляться папки без нужных прав? Может права/наследование надо грамотно настроить ? Или скрипт на мониторинг создания папок повесить
    Ответ написан
    2 комментария
  • Как заставить Powershell прочитать звёздочку в имени Organizational Unit (OU)?

    @MaxKozlov Куратор тега PowerShell
    Потому что у PS (по крайней мере в версии 5.1) проблем с этим нет. Только что проверил

    UPD: Соврамши. именно пароль менять не хочет :) Остальное работает.

    Пока два варианта:
    1. Переместить запись в другой юнит, сменить там пароль и переместить обратно :)
    2. Использовать "старый" вариант с ADSI:
    $u = Get-ADUser iivanov
    $u2 = [ADSI]("LDAP://" + $u.DistinguishedName)
    $u2.SetPassword('PassWord123')


    Завтра на свежую голову ещё подумаю.
    Upd: Пожалуй, других вариантов нет.
    Powershell ActiveDirectory использует ActiveDirectoryWebServices, а не System.DirectoryServices, Похоже, это бага ADWS.

    Хотя, конечно, ситуация дикая
    Ответ написан
    1 комментарий
  • Почему значение accountexpires не совпадает со значением в gui?

    @MaxKozlov Куратор тега PowerShell
    Судя по всему, то что ставится в GUI AD - это последний день действия учётки.

    А вы используете сомнительный способ перевода числа в дату, мешает поправка на UTC, время вы отрезаете форматом и не видите разницу в временной зоне из-за этого

    Пример: Поставил в GUI дату как 04.10.2022
    Смотрим что в AD:
    Get-ADUser IIvanov -prop AccountExpirationDate, accountExpires
    AccountExpirationDate : 05.10.2022 0:00:00
    accountExpires        : 133093908000000000
    
    # Как делаете вы
    Get-Date 133093908000000000 -UFormat '%Y.%m.%d'
    0422.10.04
    
    # Что там на самом деле вы должны были увидеть
    Get-Date 133093908000000000
    4 октября 0422 г. 21:00:00
    
    # Как делаю я
    [datetime]::FromFileTime(133093908000000000)
    5 октября 2022 г. 0:00:00
    # Что великолепно совпадает с AccountExpirationDate, который я и рекомендую


    btw, установка переменной внутри where-object - лютый трэш :)
    Ответ написан
    Комментировать
  • Как можно сохранять данные определенных событий журнала Windows в файле в режиме реального времени?

    @MaxKozlov Куратор тега PowerShell
    ... а если вам надо вот прям рилтайм, есть .net класс System.Diagnostics.EventLog
    а у него событие EventWritten
    $global:log = New-Object System.Collections.ArrayList
    $testobj = New-Object -TypeName System.Diagnostics.EventLog
    $testobj.Log = "Security"
    Register-ObjectEvent -InputObject $testobj -EventName EntryWritten -Action {
      param($sender, $e)
      [void]$global:log.Add([PSCustomObject]@{Sender = $sender; Args = $e })
    }
    
    # Смотреть потом события в переменной
    $global:log


    Заменил пример на более полезный
    Ответ написан
    6 комментариев
  • Как правильно написать скипт для информирования о дне рождении сотрудника?

    @MaxKozlov Куратор тега PowerShell
    что-то мне подсказывает, что это не вы начинали :)
    Если вы начали писать скрипт, который оповещает, зачем сохранять что-то в файл ?
    тут и обрабатывайте
    $Date1=(Get-Date).Date
    $Date2=(Get-Date).Date.AddDays(7)
    $NextBirthdays = Get-ADUser -filter "Enabled -eq 'True'" -properties birthday -SearchBase 'DC=firma,DC=local'  | 
    Select-Object birthday, Name |
    Where-Object { $_.birthday -ge $Date1 -and  $_.birthday -le $Date2 } 
    
    # Формируем текст письма
    $messagetemplate = " {0}: {1}`r`n"
    $message = ""
    foreaach ($b in $NextBirthdays) {
      $message += $messagetemplate -f $b.Name, $b.birthday
    }
    # Ну и тут их шлём кому попало
    Send-MailMessage ....
    Ответ написан
  • Полное отключение учетной записи Active Directory?

    @MaxKozlov Куратор тега PowerShell
    1. Уже выше сказано. в дополнение могу ещё предложить Set-ADUser -Enabled: $false
    2. Мне кажется вы имели ввиду именно Exchange команды
    Значит вам нужны
    Set-Mailbox --HiddenFromAddressListsEnabled:$true
    Оно же атрибут AD msExchHideFromAddressLists
    и
    New-MoveRequest -TargetDatabase "DbForDisabledUsers"
    Ответ написан
    Комментировать
  • Какие права регулируют доступ к оснастке AD?

    @MaxKozlov
    Кто вам сказал что "Выносить оснастку за контроллер домена не получится" ?
    google rsat
    не надо кому попало давать права на DC заходить
    Ответ написан
  • Почему после создания объекта AD нельзя сразу посмотреть информацию о нём при помощи Get-..?

    @MaxKozlov Куратор тега PowerShell
    Причину вам уже озвучил @vesper-bot

    Если вы хотите именно исправить, то не надо использовать Get-ADGroup,
    вам New-ADGroup уже всё вернул, вы же используете -PassThru

    Если надо использовать - присвойте переменной и из неё выводите
    или используйте | Tee-Object -Variable 'group' чтобы записать инфу в переменную $group и одновременно показать на экране
    Ответ написан
    Комментировать
  • Как заполнить поле Division, опираясь на SAMAccountName из списка?

    @MaxKozlov Куратор тега PowerShell
    Циклы обработки объектов в ps бывают двух основных видов:
    #классический цикл
    foreach ($obj in $list) {
      # сделать что-нибудь с переменной $obj
       Set-something -name $obj.name -value $obj.value
    }
    
    #цикл с использованием  pipeline
    $list | foreach-object {
      # сделать что-нибудь с переменной $_
       Set-something -name $_.name -value $_.value
    }

    Выбирайте что вам нравится и подставляйте свои команды установки
    В сочетании с импортом из csv второй вариант будет короче
    Ответ написан
    Комментировать
  • Скрипт для автоматически создание папок именами доменных пользователей, подразделений, определенными доступами?

    @MaxKozlov Куратор тега PowerShell
    По первому пункту - вы ищете пользователя, подставляя нечто, лежащее в $newuser
    в коммандлет Get-ADUser
    Ознакомьтесь, что там может быть. Скорее всего у вас что-то не то
    Get-Help Get-ADUser -Parameter Identity

    По второму - разберитесь что именно делает этот скрипт, чего не хватает именно вам и переделайте под себя. Когда разберётесь что делает, сможете понять чего не хватает.

    в целом, Вам, похоже, на фриланс.
    Ответ написан