none
Скрипт проверяется наличие SID у пользователей аккаунта RRS feed

  • Вопрос

  • Здравствуйте! Подскажите, пожалуйста, со скриптом в powershell. Скрипт проверяется наличие SID у пользователей аккаунта, который вводится вручную. В аккаунте может быть разное количество пользователей. Проблема заключается в том, что после того, как не находится нужный пользователь, выдается ошибка, которая чуть ниже и скрипт останавливается только после CTRL+C. Необходимо, чтобы скрипт, после того, как не найдет нужного пользователя останавливался и появлялось сообщение, что "Больше дисков пользователей нет"...

                        

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

    DO {
       $ID = Read-Host "Введи ID клиента"
       $i = 1
       $q = $false
       DO {
           $User = ($ID + "u") + $i
           $e = Get-ADUSer -Identity ($user) | select SID
           IF ($User) {
              $e
           } 
           $i++
       }WHILE ($User)
    } UNTIL ($i -eq 0) 
    Write-Host "Больше дисков нет"

    Вот пример ошибки:

    Get-ADUSer : не удается найти объект с удостоверением: "пользователь" в "домен".
    
    C:\Users\user\Desktop\Безымянный1.ps1:11 знак:26
    
    + $e = Get-ADUSer -Identity ($user) | select SID
    + CategoryInfo              :  ObjectNotFound: (user: ADUser) [Get-ADUser], ADIdentityNotFoundException
    + FullyQuallifiedErrorid :  ActiveDirectoryCmdlet: Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException.Microsoft.ActiveDirectory.Management.Commands.GetADUser
    
    


    29 ноября 2021 г. 10:53

Ответы

  • Спасибо за ответ, но хотелось бы немного объяснить о логике скрипта:  есть аккаунты, которые имеют разные названия. У этих аккаунтов есть пользователи (их может быть несколько). У пользователей название одинаковое, только отличается конечный порядковый номер. Нужно, чтобы при вводе самого ID выводились все ИМЕННО SID (не вся информация по пользователю, а только он) каждого пользователя и когда скрипт не находил бы следующего пользователя по порядку по этому ID - скрипт завершался, оставляя список тех SID, что он уже нашел.
    IF ($User) {
              $e
           } - данный блок выполняет команду Get-ADUSer -Identity ($user) | select SID у каждого последующего по порядку пользователя
    Цикл нужен, так как необходим список SID всех пользователей конкретного ID

    Данный блок делает вывод результата предыдущей команды но саму команду не выполняет
    IF ($User) - конструкция вообще не имеющая смысла так как она всегда (прям всегда-всегда) в вашем коде будет работать одинаково

    Пользователи это люди, аккаунты это учетные записи. У пользователя может быть аккаунт или несколько аккаунтов но не наоборот. Аккаунты не заводят пользователей (если конечно мы говорим не про фетиши)

    $partName = read-host 'Provide partname for finding users'
    get-aduser -filter "SamAccountName -like '$partName`u*'" | where {$_.SamAccountName -match '\d+$'} | select SID

    Мне сложно предположить какое поле у вас является идентификатором поэтому я использовал SamAccountName но вы с легкостью можете поменять на любое свое значение

    Этот кусок вытянет все записи которые будут начинаться с PartName после которого cледует буква u

    get-aduser -filter "SamAccountName -like '$partName`u*'"

    Например: вы вводите ABC и получите записи ABCu, ABCuDCE, ABCu1, ABCu1234...

    Следующая строка из предыдущего результата выберет те записи в которых цифры в конце значения

    where {$_.SamAccountName -match '\d+$'}

    Например: ABCu1, ABCu1234...

    Что делает строка select SID думаю вполне очевидно

    P.S.
    Если этого недостаточно - приведите примеры.
    Пример примера: Есть пользователь Вася, у него есть 3 учетные записи Vasyau1, Vasyau2, Vasyau3. Для всех 3х учетных записей необходимо получить SIDы.

    Описанный пример решается при помощи кода приведенного выше (тот что в этом сообщении)


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

    1 декабря 2021 г. 8:55
    Модератор
  • открываете Powershell пишите путь к файлу жмакаете Ентер при этом ничего не закрывается

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

    • Помечено в качестве ответа www_someone 23 декабря 2021 г. 13:44
    23 декабря 2021 г. 10:35
    Модератор

Все ответы

  • да, найти не удается, потому что действительно такого пользователя нет
    30 ноября 2021 г. 6:21
  • необходимо, чтобы когда он не находил пользователя, скрипт завершался, а предыдущие SID оставались списком
    30 ноября 2021 г. 8:26
  • Опишите логику которая должна быть покрыта скриптом
    Из текста скрипта логика не очевидна

    Так же не забывайте о использовании скриптблоков

    Что делает этот блок?

           IF ($User) {
              $e
           } 

    Переменная $User у вас всегда существует поэтому вы полюбому попадете внутрь If`a
    Чтоб ошибка не появлялась у вас есть 2 метода решения проблемы

    # 1 использование Where 
    Get-AdUser -filter * | where {$_.SamAccountName -eq $User}
    # 2 использование -filter 
    Get-AdUser -filter "SamAccountName -eq '$User'"
    У пользователя не может не быть SIDa

    $i у вас всегда или 1 или 2 но никогда не 0 поэтому никогда внешний цикл не остановится

    По хорошему вам не нужен ни один ни второй цикл и скрипт решается в 2 строки.


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

    30 ноября 2021 г. 12:32
    Модератор
  • Спасибо за ответ, но хотелось бы немного объяснить о логике скрипта:  есть аккаунты, которые имеют разные названия. У этих аккаунтов есть пользователи (их может быть несколько). У пользователей название одинаковое, только отличается конечный порядковый номер. Нужно, чтобы при вводе самого ID выводились все ИМЕННО SID (не вся информация по пользователю, а только он) каждого пользователя и когда скрипт не находил бы следующего пользователя по порядку по этому ID - скрипт завершался, оставляя список тех SID, что он уже нашел.
    IF ($User) {
              $e
           } - данный блок выполняет команду Get-ADUSer -Identity ($user) | select SID у каждого последующего по порядку пользователя
    Цикл нужен, так как необходим список SID всех пользователей конкретного ID
    1 декабря 2021 г. 8:23
  • Спасибо за ответ, но хотелось бы немного объяснить о логике скрипта:  есть аккаунты, которые имеют разные названия. У этих аккаунтов есть пользователи (их может быть несколько). У пользователей название одинаковое, только отличается конечный порядковый номер. Нужно, чтобы при вводе самого ID выводились все ИМЕННО SID (не вся информация по пользователю, а только он) каждого пользователя и когда скрипт не находил бы следующего пользователя по порядку по этому ID - скрипт завершался, оставляя список тех SID, что он уже нашел.
    IF ($User) {
              $e
           } - данный блок выполняет команду Get-ADUSer -Identity ($user) | select SID у каждого последующего по порядку пользователя
    Цикл нужен, так как необходим список SID всех пользователей конкретного ID

    Данный блок делает вывод результата предыдущей команды но саму команду не выполняет
    IF ($User) - конструкция вообще не имеющая смысла так как она всегда (прям всегда-всегда) в вашем коде будет работать одинаково

    Пользователи это люди, аккаунты это учетные записи. У пользователя может быть аккаунт или несколько аккаунтов но не наоборот. Аккаунты не заводят пользователей (если конечно мы говорим не про фетиши)

    $partName = read-host 'Provide partname for finding users'
    get-aduser -filter "SamAccountName -like '$partName`u*'" | where {$_.SamAccountName -match '\d+$'} | select SID

    Мне сложно предположить какое поле у вас является идентификатором поэтому я использовал SamAccountName но вы с легкостью можете поменять на любое свое значение

    Этот кусок вытянет все записи которые будут начинаться с PartName после которого cледует буква u

    get-aduser -filter "SamAccountName -like '$partName`u*'"

    Например: вы вводите ABC и получите записи ABCu, ABCuDCE, ABCu1, ABCu1234...

    Следующая строка из предыдущего результата выберет те записи в которых цифры в конце значения

    where {$_.SamAccountName -match '\d+$'}

    Например: ABCu1, ABCu1234...

    Что делает строка select SID думаю вполне очевидно

    P.S.
    Если этого недостаточно - приведите примеры.
    Пример примера: Есть пользователь Вася, у него есть 3 учетные записи Vasyau1, Vasyau2, Vasyau3. Для всех 3х учетных записей необходимо получить SIDы.

    Описанный пример решается при помощи кода приведенного выше (тот что в этом сообщении)


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

    1 декабря 2021 г. 8:55
    Модератор
  • В таком варианте скрипт отработал один раз и больше не показывал сиды.... но вот зато ошибок больше нет )
    $partName = Read-Host "Введи ID клиента"
    get-aduser -filter "SamAccountName -like '$partName`u*'" | where {$User -match '\d+$'} | select SID

    1 декабря 2021 г. 13:29
  • Опишите полностью техническое задание если вам требуется что-то другое. Выше я написал пример.

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

    1 декабря 2021 г. 14:03
    Модератор
  • Есть пользователь user, у него есть 3 учетные записи user1, user2, user3. Для всех 3х учетных записей необходимо получить SIDы

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

    • Изменено www_someone 1 декабря 2021 г. 14:24
    1 декабря 2021 г. 14:22
  • Есть пользователь user, у него есть 3 учетные записи user1, user2, user3. Для всех 3х учетных записей необходимо получить SIDы

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

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

    запускать скрипт можно хоть тысячу раз в день но держать процесс запущенным постоянно это плохая практика

    запустить скрипт можно в любой момент вызвав его в консоли powershell просто указав путь перед которым поставив точку

    Пример:

    . c:\scripts\get-sidsbyusername.ps1


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

    • Предложено в качестве ответа Vector BCOModerator 1 декабря 2021 г. 22:07
    1 декабря 2021 г. 22:07
    Модератор
  • Спасибо за ваш пример, но к сожалению, задача все еще не решена... Скрипт не планируется держать постоянно запущенным. Пробовали скрипт и через батник запускать - результат тот же - не отрабатывает. Он успешно выполнился только один раз, после чего вместе SID выдает пустое поле и все. Никакой информации
    2 декабря 2021 г. 9:54
  • Спасибо за ваш пример, но к сожалению, задача все еще не решена... Скрипт не планируется держать постоянно запущенным. Пробовали скрипт и через батник запускать - результат тот же - не отрабатывает. Он успешно выполнился только один раз, после чего вместе SID выдает пустое поле и все. Никакой информации

    "Не выполняется" это не та информация которую можно обработать и получить требуемый результат

    Давайте говорить предметно:
    - в Read-Host подаю такое значение ...
    - в домене есть такие пользователи: <скрин>
    - скрипт возвращает: <скрин>
    - Get-AdUser <пользователь с первого скрина> -Properties *
    ...

    Учтите что батник запускает внешний процесс и вывод результата остается во внешнем процессе


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


    2 декабря 2021 г. 10:14
    Модератор
  • предметно: единственный раз, когда скрипт отработал как нужно и больше не запускался, а выводил просто пустое поле вместо SID:
    - Ввели Read-Host
    -<SID пользователя u1>
    -<SID пользователя u2>
    -<SID пользователя u3>
    Скрипт завершается. Данные должны остаться для прочтения.
    При попытке повторного запуска этого же скрипта (причем на разных машинах) ничего не происходит. После ввода Read-Host просто пустое поле
    2 декабря 2021 г. 12:47
  • предметно: единственный раз, когда скрипт отработал как нужно и больше не запускался, а выводил просто пустое поле вместо SID:
    - Ввели Read-Host
    -<SID пользователя u1>
    -<SID пользователя u2>
    -<SID пользователя u3>
    Скрипт завершается. Данные должны остаться для прочтения.
    При попытке повторного запуска этого же скрипта (причем на разных машинах) ничего не происходит. После ввода Read-Host просто пустое поле
    Что вы ввели конкретно? Что вы получили конкретно? Где скрины? Где код? Где примеры? Мы говорим ниочем.


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

    3 декабря 2021 г. 12:13
    Модератор
  • cls
    $partName = Read-Host "Введи ID клиента"
    get-aduser -filter "SamAccountName -like '$partName`u*'" | where {$_.SamAccountName -match '\d+$'} | select SID
    powershell
    Вот код. Что получили, мы описали выше. Прислать скриншот результата не можем, так как больше одного раза скрипт не отработал. Пример также выше в описании.
    7 декабря 2021 г. 8:18
  • 1что вы вводите с клавиатуры (дословно)

    2 покажите в aduc что пользователь подпадающий под маску существует  (интересует samAccountName)

    3 окно со скриптом где видно как вы запустили скрипт ввели то что показали в п1 и получили ничего


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

    7 декабря 2021 г. 8:24
    Модератор
  • 1) a01030
    2) В скриншоте 
    3) В скриншоте (и больше ничего не происходит)

    8 декабря 2021 г. 13:32
  • нет скриншота :)

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

    8 декабря 2021 г. 13:37
    Модератор

  • 
    • Изменено www_someone 8 декабря 2021 г. 15:04
    8 декабря 2021 г. 15:00

  • 

    супер, а теперь если вам не сложно скрин с powershell ise где виден скрипт что вы в него вводите и что получаете и страничку этого пользователя где видно его samAccountName

    русскоязычных серверов мне не попадалось, но с гарантией могу сказать что name (имя) и display name (выводимое имя) могут отличаться от samAccountName


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

    8 декабря 2021 г. 15:16
    Модератор
  • я не знаю шутка это или нет но тут по прежнему нет samAccountName

    samAccountName можно посмотреть в Редакторе атрибутов и в Учетная запись


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

    9 декабря 2021 г. 12:32
    Модератор
  • когда запускаешь скрипт, то это выглядит вот так

    вы ищите a01030u1u<цифры> а хотите по идее искать a01030u<цифры>

    мой пример решает ровно ту задачу которую вы описали, и для получения своего a01030u1 вам нужно ввести a01030

    у себя в вопросе вы тоже этого пользователя не найдете ведь маска для поиска используется такая же как у меня  ($ID + "u") + $i, где $ID это текст который вы вводите а $i какая-то цифра


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


    9 декабря 2021 г. 12:35
    Модератор
  • 1) a01030
    2) В скриншоте 
    3) В скриншоте (и больше ничего не происходит)

    на скрине вы вводите не это ;)

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

    10 декабря 2021 г. 15:12
    Модератор
    • Помечено в качестве ответа Vector BCOModerator 14 декабря 2021 г. 13:37
    • Снята пометка об ответе Vector BCOModerator 14 декабря 2021 г. 13:37
    14 декабря 2021 г. 11:50
  • да, прошу прощения, вот верный запрос, но результат тот же
    14 декабря 2021 г. 11:50
  • а теперь проблема в блоке where который не похож на то что я писал 🤔

    переменная $user не существует, нигде не создается и соответвенно ничего после блока where не возвращается. Почему там вообще появилась эта переменная я не понял.

    Про samaccountname мы так и не выяснили...


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

    14 декабря 2021 г. 13:38
    Модератор
  • вот так тоже ничего не происходит...
    14 декабря 2021 г. 14:03
  • зачем строка 4?

    где samaccountname?

    про samaccountname я спрашиваю 7й раз


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

    14 декабря 2021 г. 14:24
    Модератор
  • Строка 4 для того, чтобы скрипт после обрабатывания не закрывался, а  samaccountname поправили, в последнем скрине это видно...
    16 декабря 2021 г. 7:39
  • Строка 4 для того, чтобы скрипт после обрабатывания не закрывался, а  samaccountname поправили, в последнем скрине это видно...

    строка 4 запустит другой процес powershell и никак не повлияет на первый. В PowerShell ISE ничего не закрывается поэтому мы тестируем в нем.

    SamAccountName в ADUC я так и не увидел хоть просил показать его 8 раз. Вы настойчиво игнорируете мои вопросы в связи с чем складывается впечатление что вы издеваетесь. Если так будет продолжаться, то я закрою это обсуждение ;)

    Найдите кого-то кто поможет вам перечитать этот тред и предоставить всю необходимую информацию.


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

    16 декабря 2021 г. 8:13
    Модератор
  • покажите теперь пожалуйста 

    get-aduser -filter "samAccountName -eq 'a01030u1'"

    и 

    get-aduser -filter "samAccountName -like '*01030u*'"


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

    16 декабря 2021 г. 15:26
    Модератор
  • у меня не получается восспроизвести проблему у себя, поэтому давайте попробуем добавить диагностики:

    $partName = read-host 'Provide partname for finding users' 
    $filter = $partname.trim() + 'u*'
    write-host "Looking for a user with a mask: '$filter'"
    get-aduser -filter "SamAccountName -like '$filter'" | where {$_.SamAccountName -match '\d+$'} | select SID

    Есть варианты что при ведении a01030 или после 0 есть пробел или а кирилическая

    .trim() удалит пробелы и другие нечитаемые символы, что делать с кирилицей пока хз, но пойдем по порядку

    Еще было бы круто чтоб вы проверили версию PowerShell у себя и модуля AD

    $PSVersionTable
    get-module activedirectory -ListAvailable
    Возможно проблема в моем примере в `u (хотя у меня даже это не воспроизводится)

    Если так, то можно попробовать еще так:

    $partName = read-host 'Provide partname for finding users' write-host "Looking for a user with a mask: '${partname}u*'" get-aduser -filter "SamAccountName -like '${partname}u*'" | where {$_.SamAccountName -match '\d+$'} | select SID


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

    21 декабря 2021 г. 6:55
    Модератор
  • При повторном вводе ничего не происходит. Скриншот версии AD прикрепил
    22 декабря 2021 г. 7:58
  • Чтоб не быть голословным вот скрин который подтверждает что код работает (все его вариации работают идентично). Модуль AD у меня такой же версии, но сам PowerShell новее.
    Мое предложение обновить ОС или попробовать потестировать эти 2 команды на другом компьютере\сервере. Если на другом компьютере заработает - проблема в конкретном ПК (версии поша, антивирусе, итд). Если не заработает - попробуйте создать пользователя без кирилических знаков. Например w1234u1 и скриптом попробуйте получить SID для w1234

    PowerShell вконце не делает ничего, я об этом уже писал


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

    22 декабря 2021 г. 9:04
    Модератор
  • коллега восспроизвел проблему и у него вывод ломает powershell вконце скрипта о котором я уже 2 раза писал

    хотя при этом у меня все работает ок, даже с powershell 


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

    22 декабря 2021 г. 11:46
    Модератор
  • Вы правы, дело было в powershell. В ISE он теперь отрабатывает, но при запуске в обычно PowerShell он не показывает список SID, а сразу его закрывает, после ввода данных
    23 декабря 2021 г. 8:13
  • открываете Powershell пишите путь к файлу жмакаете Ентер при этом ничего не закрывается

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

    • Помечено в качестве ответа www_someone 23 декабря 2021 г. 13:44
    23 декабря 2021 г. 10:35
    Модератор
  • Спасибо! Вы очень помогли!!!
    23 декабря 2021 г. 13:44