none
Win10 и PowerShell

    Вопрос

  • Коллеги, добрый день!

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

    Есть скрипт PS, который сверяет хэши паролей пользователей на КДомена со словарем

    $DictFile = "C:\DSInternals\password2.txt"
    $DC = "ll.local"
    $Domain = "DC=ll, DC=local"
    $Dict = Get-Content $DictFile | ConvertTo-NTHashDictionary
    Get-ADReplAccount -All -Server $DC -NamingContext $Domain | Test-PasswordQuality -WeakPasswordHashes $Dict -ShowPlainTextPasswords -IncludeDisabledAccounts
    $EWB.Saveas('C:\password.txt') 

    Все работало, пока коллега не обновил пакет 

    DSInternals

    После обновления я не могу получить результаты данного скрипта, т.к. в новом пакете убрали командлет ConvertTo-NTHashDictionary и вместо него рекомендуется использовать командлет Test-PasswordQuality

    Пытался переделать скрипт, но не получилось. Я не очень разбираюсь в PS

    Пробовал 

    $Dict = Get-Content $DictFile
    Get-ADReplAccount -All -Server $DC -NamingContext $Domain |
    Test-PasswordQuality -WeakPasswords $Dict -ShowPlainTextPasswords -IncludeDisabledAccounts

    Ошибка  

    PS C:\Windows\system32> $Dict = Get-Content $DictFile
    Get-ADReplAccount -All -Server $DC -NamingContext $Domain |
    Test-PasswordQuality -WeakPasswords $Dict -ShowPlainTextPasswords -IncludeDisabledAccounts
    Get-Content : Не удается привязать аргумент к параметру "Path", так как он имеет значение NULL.
    строка:1 знак:21
    + $Dict = Get-Content $DictFile
    +                     ~~~~~~~~~
        + CategoryInfo          : InvalidData: (:) [Get-Content], ParameterBindingValidationException
        + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.GetContentCommand
     
    Get-ADReplAccount : Не удается проверить аргумент для параметра "Server". Аргумент пустой или имеет значение NULL. Укажите непустой аргумент, не имеющий значение NULL, п
    осле чего повторите выполнение команды.
    строка:2 знак:32
    + Get-ADReplAccount -All -Server $DC -NamingContext $Domain |
    +                                ~~~
        + CategoryInfo          : InvalidData: (:) [Get-ADReplAccount], ParameterBindingValidationException
        + FullyQualifiedErrorId : ParameterArgumentValidationError,DSInternals.PowerShell.Commands.GetADReplAccountCommand

    и второй вариант

    Get-ADReplAccount -All -Server $DC -NamingContext $Domain |
    Test-PasswordQuality -WeakPasswordsFile "C:\distr\PS\DSInternals\PasswordDict.txt" -ShowPlainTextPasswords -IncludeDisabledAccounts

    Ошибка

    PS C:\Windows\system32> Get-ADReplAccount -All -Server $DC -NamingContext $Domain |
    Test-PasswordQuality -WeakPasswordsFile "C:\distr\PS\DSInternals\PasswordDict.txt" -ShowPlainTextPasswords -IncludeDisabledAccounts
    Get-ADReplAccount : Имя "Get-ADReplAccount" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность написания имени, 
    а также наличие и правильность пути, после чего повторите попытку.
    строка:1 знак:1
    + Get-ADReplAccount -All -Server $DC -NamingContext $Domain |
    + ~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (Get-ADReplAccount:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException
    Во втором варианте, видимо, опять командлет заменили.

    Можете мне помочь собрать скрипт в соответствии с изменениями пакета 

    DSInternals

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

    Спасибо!


    16 апреля 2019 г. 7:04

Все ответы

  • в первом варианте у вас переменная $dictfile пустая о чем и написано в ошибке

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

    16 апреля 2019 г. 7:10
    Модератор
  • Отредактировал скрипт в таком виде:

    $Dict = Get-Content $DictFile
    $DictFile = C:\DSInternals\PasswordDict1.txt
    Get-ADReplAccount -All -Server $DC -NamingContext $Domain |
    Test-PasswordQuality -WeakPasswords $Dict -ShowPlainTextPasswords -IncludeDisabledAccounts

    Запустил, ошибок  нет. Видимо работает.

    Отпишу по результату

    16 апреля 2019 г. 7:38
  • Отредактировал скрипт в таком виде:

    $Dict = Get-Content $DictFile
    $DictFile = C:\DSInternals\PasswordDict1.txt
    Get-ADReplAccount -All -Server $DC -NamingContext $Domain |
    Test-PasswordQuality -WeakPasswords $Dict -ShowPlainTextPasswords -IncludeDisabledAccounts

    Запустил, ошибок  нет. Видимо работает.

    Отпишу по результату

    вы $dictfile  декларируете во второй строке а используете в первой...

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


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

    16 апреля 2019 г. 8:02
    Модератор
  • $DictFile = C:\DSInternals\PasswordDict1.txt
    $Dict = Get-Content $DictFile
    Get-ADReplAccount -All -Server $DC -NamingContext $Domain |
    Test-PasswordQuality -WeakPasswords $Dict -ShowPlainTextPasswords -IncludeDisabledAccounts

    Поменял строки местами

    Запустил, Ошибок нет.

    Делает сравнение со словарем?

    Раньше,мне кажется, быстрее делалось

    16 апреля 2019 г. 8:53
  • Не работает.

    Больше часа уже висит.

    Раньше это занимало около 15 минут.

    Возможно где то цикл?

    16 апреля 2019 г. 10:06
  • Парни, можете подсказать, где ошибка в скрипте?
    16 апреля 2019 г. 11:50
  • думаю стоит написать в поддержку упомянутого модуля

    вы используете ажурад?


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

    16 апреля 2019 г. 12:01
    Модератор
  • ажурад это что?
    16 апреля 2019 г. 12:03
  • ажурад это что?
    насколько я понял get-adreplaccount вытягивает аккауты которые должны рекплицироваться с azure ad, вот и возникает вопрос используете ли вы его?

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

    16 апреля 2019 г. 12:06
    Модератор
  • Нет, АжурАД нет в домене, есть облачная почта
    16 апреля 2019 г. 12:08
  • Нет, АжурАД нет в домене, есть облачная почта
    посмотрите что вам вернет первая часть команды потом можно пару выходов пустить на вход второй команды и посмотреть результаты, но в любом случае напишите в поддержку модуля например на гитхабе, возможно это известная проблема на вашей версии модуля и ее необходимо обновить или откатить

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

    16 апреля 2019 г. 12:14
    Модератор
  • Получается проблема у разработчика может быть, а не в моем не правильном написании скрипта?
    16 апреля 2019 г. 12:53
  • может конечно :)

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

    16 апреля 2019 г. 12:58
    Модератор
  • На Гитхабе автор предлагает следующий текст скрипта

    Get-ADReplAccount -All -Server LON-DC1 -NamingContext "dc=adatum,dc=com" | Test-PasswordQuality

    -WeakPasswordHashesFile .\pwned-passwords-ntlm-ordered-by-count.txt -IncludeDisabledAccounts

    Мне не ясен параметр -WeakPasswordHashesFile

    Ниже описание параметра с Гитхаба

    -WeakPasswordHashesFile

    {{Fill WeakPasswordHashesFile Description}}

    Type: StringParameter Sets: (All)Aliases:

    Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False

    И это текстовый файл .\pwned-passwords-ntlm-ordered-by-count.txt

    Это список паролей, с которыми проверяются пароли юзеров?

    И .\ это какую директорию по умолчанию означает?

    Спасибо!

    Запустил скрипт
    Get-ADReplAccount -All -Server ll -NamingContext "dc=ll,dc=lal" | Test-PasswordQuality -WeakPasswordHashesFile .\PasswordDict1.txt

    получил ошибку 

    Test-PasswordQuality : Не удается найти параметр, соответствующий имени параметра "WeakPasswordHashesFile".
    строка:1 знак:100
    + ... asswordQuality -WeakPasswordHashesFile .\PasswordDict1.txt
    +                    ~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Test-PasswordQuality], ParameterBindingException
        + FullyQualifiedErrorId : NamedParameterNotFound,DSInternals.PowerShell.Commands.TestPasswordQualityCommand


    • Изменено Pogreb 16 апреля 2019 г. 13:15
    16 апреля 2019 г. 13:14
  • Странно, но командлета -WeakPasswordHashesFile нет

    Есть -WeakPasswordHashes

    PS C:\Windows\system32> Get-ADReplAccount -All -Server ll -NamingContext "dc=ll,dc=local" | Test-PasswordQuality -WeakPasswordHashes .\PasswordDict1.txt -IncludeDisabledAccounts
    Test-PasswordQuality : Не удается привязать параметр "WeakPasswordHashes". Не удается преобразовать значение ".\PasswordDict1.txt" типа "System.String" в тип "System.Collections.Generic.IDic
    tionary`2[System.Byte[],System.String]".
    строка:1 знак:120
    + ... PasswordHashes .\PasswordDict1.txt -IncludeDisabledAccounts
    +                    ~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Test-PasswordQuality], ParameterBindingException
        + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,DSInternals.PowerShell.Commands.TestPasswordQualityCommand

    Что то я не так с текстовым файлом делаю

    Вот это .\ можно заменить как C:\Folder ?
    • Изменено Pogreb 16 апреля 2019 г. 13:42
    16 апреля 2019 г. 13:33
  • .\ это текущая директория в вашем случае равная c:\windows\system32 и вы можете без проблем сменить этот относительный путь на свой предопределенный, например на c:\folder

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


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

    16 апреля 2019 г. 14:45
    Модератор
  • Установил последнюю версию 3.3

    Написал на гитхабе, сегодня получил ответ.

    Оригинал


    Hi  , the -ShowPlainTextPasswords parameter of Test-PasswordQuality cmdlet had been removed in version 3.0 due to some performance optimizations, see the Changelog.
    Does the Get-ADReplAccount cmdlet give you any results?
    Could you please just try running this?

    $Dict = Get-Content 'C:\DSInternals\PasswordDict1.txt'
    Get-ADReplAccount -All -Server $DC -NamingContext $Domain | Test-PasswordQuality -WeakPasswords $Dict


    Не нашел параметра -WeakPasswords но нашел -WeakPasswordsHashes

    Редактирую запрос и запускаю 

    $DC = "ll"
    $Domain = "DC=ll, DC=local"
    $Dict = Get-Content 'C:\DSInternals\PasswordDict1.txt' 
    Get-ADReplAccount -All -Server $DC -NamingContext $Domain | Test-PasswordQuality -WeakPasswordHashes $Dict


    Получаю ответ

    Test-PasswordQuality : Не удается привязать параметр "WeakPasswordHashes". Не удается преобразовать значение "ZZZZZZZZZZZZZZZZZZZZ" типа "System.String" в тип "System.Collections.Generic.IDi
    ctionary`2[System.Byte[],System.String]".
    строка:4 знак:102
    + ... PasswordHashes $Dict
    +                    ~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Test-PasswordQuality], ParameterBindingException
        + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,DSInternals.PowerShell.Commands.TestPasswordQualityCommand

    "ZZZZZZZZZZZZZZZZZZZZ" это единственный пароль в словаре C:\DSInternals\PasswordDict1.txt

    Что именно запрос не может преобразовать?


    • Изменено Pogreb 17 апреля 2019 г. 5:46
    17 апреля 2019 г. 5:30
  • Заметил странную вещь.

    Не обновился у меня модуль DSInternals

    ModuleType Version    Name                                ExportedCommands                                                                                                                    
    ---------- -------    ----                                ----------------                                                                                                                    
    Script     2.22       DSInternals                         {ConvertTo-NTHash, ConvertTo-LMHash, Set-SamAccountPasswordHash, ConvertFrom-UnicodePassword...} 


    Делаю удаление модуля и получаю ошибку

    Пробовал удалить двумя командами, без результатно

    PS C:\Windows\system32> Uninstall-Module -Name DSInternals -AllVersions -Force
    PackageManagement\Uninstall-Package : Для указанных условий поиска и имен модулей "DSInternals" не найдено никаких совпадений.
    C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:2157 знак:21
    + ...        $null = PackageManagement\Uninstall-Package @PSBoundParameters
    +                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (Microsoft.Power...ninstallPackage:UninstallPackage) [Uninstall-Package], Exception
        + FullyQualifiedErrorId : NoMatchFound,Microsoft.PowerShell.PackageManagement.Cmdlets.UninstallPackage
     
    
    PS C:\Windows\system32> Remove-Module -Name DSInternals
    
    PS C:\Windows\system32> 

    Пытался принудительно обновить модуль 

    PS C:\Windows\system32> Install-Module C:\DSInternals\DSInternals_v3.3\DSInternals\DSInternals.psd1 -Force
    PackageManagement\Install-Package : Совпадения для указанных условий поиска и имени пакета "C:\DSInternals\DSInternals_v3.3\DSInternals\DSInternals.psd1" не найдены. Чтобы просмотреть все до
    ступные зарегистрированные источники пакетов, используйте командлет Get-PSRepository.
    C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1772 знак:21
    + ...          $null = PackageManagement\Install-Package @PSBoundParameters
    +                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package], Exception
        + FullyQualifiedErrorId : NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage


    Хотел версию модуля посмотреть, не вышло

    PS C:\Windows\system32> Get-InstalledModule -Name DSInternals
    PackageManagement\Get-Package : Для указанных условий поиска и имен модулей "DSInternals" не найдено никаких совпадений.
    C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:2216 знак:9
    +         PackageManagement\Get-Package @PSBoundParameters | Microsoft. ...
    +         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (Microsoft.Power...lets.GetPackage:GetPackage) [Get-Package], Exception
        + FullyQualifiedErrorId : NoMatchFound,Microsoft.PowerShell.PackageManagement.Cmdlets.GetPackage

    Как мне корректно удалить/переустановить модуль?

    PS: удалил банально с сервера c:\Windows\System32\WindowsPowerShell\v1.0\Modules\ через Delete

    Ночью так же установил обновления на PS до 5.1 может мне список команд обновить надо?

    Так как ни install-module ни import-module не дают результатов об установке модуля

    • Изменено Pogreb 18 апреля 2019 г. 6:01
    18 апреля 2019 г. 5:47
  • Можете подсказать как запрос

    $DC = "ll"

    $Domain = "DC=ll,DC=local"

    $Dict = Get-Content 'C:\DSInternals\PasswordDict1.txt' Get-ADReplAccount -All -Server $DC -NamingContext $Domain | Test-PasswordQuality -WeakPasswordsHashes $Dict

    В одну строку записать?


    • Изменено Pogreb 18 апреля 2019 г. 13:39
    18 апреля 2019 г. 13:39
  • Для версии 3.3 скрипт выглядит следующим образом

    
    $DC = "ll"
    $Domain = "DC=ll, DC=local"
    $Dict = 'C:\DSInternals\PasswordDict1.txt'
    Get-ADReplAccount -All -Server $DC -NamingContext $Domain |
           Test-PasswordQuality -WeakPasswordsFile $Dict

    Можете подсказать, как правильно результат скрипта отправить в облачную почту Майкрософт?

    22 апреля 2019 г. 7:31