Задать вопрос
  • Использование пайплайнов в PowerShell?

    @MaxKozlov Куратор тега PowerShell
    Антон Анонимов ответил по существу, а я напишу в общем. но на вашем примере
    PS> Get-Help New-Item -Parameter Name
    
    -Name <System.String[]>
    ....
        Принимать входные данные конвейера? True (ByPropertyName)

    Вот пункт Принимать входные данные конвейера - ответ на ваш вопрос
    Вот тут, например
    PS> Get-Help Set-Location -Parameter Path
        Принимать входные данные конвейера? True (ByPropertyName, ByValue)

    ByValue - значит принимает напрямую
    Вы могли бы написать echo "hello" | Set-Location и попасть в папочку

    А ByPropertyName означает, что вы можете получить это значение только из свойства входящего объекта. то есть, например, вот так
    [PSCustomObject]@{ Name = 'hello' } | New-Item

    А можно, например вот так
    # попытка 1 как выше
    mkdir d:\test1
    cd d:\test1
    'z','x','c' | ForEach-Object { New-Item -ItemType Directory -Name $_ }
    
    # попытка 2, сдублируем те же папочки в другом месте
    mkdir d:\test2
    cd d:\test2
    Get-ChildItem d:\test1 | New-Item -ItemType Directory


    btw, для New-Item можно использовать как -Path, так и -Name
    You can specify the name of the new item in the Name or Path parameter value, and you can specify the path of the new item in Name or Path value. Items names passed using the Name parameter are created relative to the value of the Path parameter.
    Ответ написан
    Комментировать
  • Как сделать динамический список PowerShell для объектов AD?

    @MaxKozlov Куратор тега PowerShell
    Вы неверно понимаете foreach

    foreach ($User in $NameList) {
        [void] $listBox.Items.Add($User)
    }

    Если вам только имена, то лучше использовать $User.Name

    ну и вот это масло масляное
    $NameList = @(Get-ADUser -Filter {Name -like $SearchName} -Properties Name | Select-Object -Property Name)

    Достаточно
    $NameList = @(Get-ADUser -Filter {Name -like $SearchName} -Properties Name)

    Либо, если без Name
    $NameList = @(Get-ADUser -Filter {Name -like $SearchName} -Properties Name | Select-Object -ExpandProperty Name)


    При этом @() тоже необязательно, если вам вот прям не нужен массив. foreach будет работать и так
    Ответ написан
    2 комментария
  • Как сделать массовую рассылку пользователям на удаленные компьютеры?

    @MaxKozlov Куратор тега PowerShell
    Используйте msg правильно :)

    Ограничение в 256 символов существует только для отправки сообщения из командной строки.

    А сообщение можно отправлять и из файла

    пример: send.cmd
    type d:\long_message.txt | msg username

    при этом long_message.txt должен быть в 1251 кодировке для русских буковок
    Ответ написан
  • Как в powershell закрыть другое окно powershell?

    @MaxKozlov Куратор тега PowerShell
    На ваших скринах видно, что питон (11104) всё ещё работает. Консолька, видимо, ждёт когда дочерний процесс закроется. При этом в процессах консоль уже не отображается, встречал подобное.

    Но зачем так сложно ? почему не запускать сразу питон и уже с ним работать ?
    И ещё видно, что питон запускает хром с селениумом, так что тут целое дерево убивать надо.

    Гораздо логичнее выставлять флажок скрипту (файлик писать куда-нибудь, например, kill-pid-11104), видя который, питон сам себя корректно завершит, безо всяких убийств
    Ответ написан
  • Почему ansible не может перезагрузить хост?

    @MaxKozlov
    Просто remote shutdown может быть недостаточно
    The connection user must have the SeRemoteShutdown...

    Особенно сервер

    с become: true пробовали ?
    Ответ написан
    3 комментария
  • Как создать задачу в планировщике задач windows, чтобы она выполнялась на всех пользователях?

    @MaxKozlov Куратор тега PowerShell
    Так вы же сами попросили от своего юзера да ещё и с максимальными привилегиями
    "$principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -LogonType Interactive -RunLevel Highest;" ^

    Попросите для пользователей
    $principal = New-ScheduledTaskPrincipal -GroupId 'S-1-5-32-545'

    SID чтобы не заморачиваться с локализацией

    Но конкретно для вашей задачи, мне кажется, лучше линк в стартап прописать

    "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\StartUp\Site.url"
    [InternetShortcut]
    URL=http://portal/
    HotKey=0
    Ответ написан
  • Как в Powershell быстро определить заблокирован ли .exe с помощью Windows Firewall?

    @MaxKozlov Куратор тега PowerShell
    медленно, ну потому что медленно :)

    Для доступа к правилам оно использует всякие DCOM интерфейсы, что небыстро по определению
    Вон как там всё непросто

    Для ускорения можно попробовать в обратную сторону

    Get-NetFirewallApplicationFilter | Where-Object { $_.Program -eq $exePath } | Get-NetFirewallRule


    Причём мой вариант будет правильнее. потому что он на выходе получает не ApplicationFilter, а правило, которое можно проверить. Может оно вообще разрешающее, а не запрещающее и его надо менять/удалять.

    А проверка нескольких exe должна делаться не через цикл, как может показаться на первый взгляд, а через массив

    $progs = 'exe1.exe', 'exe2.exe'
    Get-NetFirewallApplicationFilter | Where-Object { $_.Program -in $progs } | Get-NetFirewallRule


    P.S. А вот от такого вообще надо избавляться
    | Where-Object { $_ }
    Это бессмысленный код в данном контексте
    Ответ написан
    Комментировать
  • Почему в Powershell ошибки прав доступа при выполнении New-Item и Remove-Item не попадают в блок catch?

    @MaxKozlov Куратор тега PowerShell
    Drovosek01, в catch{} не попадает потому что ошибка не блокирующая
    Remove-Item [-Path] <System.String[]> ....
    За раз можно удалять несколько объектов. и при ошибке удаления одного процесс не прерывается, а продолжается, если об этом не попросить

    -ErrorAction Stop правильный ответ
    Ответ написан
    Комментировать
  • Почему скрипт Powershell работает в 3 раза дольше если переменную вынести за пределы функции?

    @MaxKozlov Куратор тега PowerShell
    Видимо связано с особенностями использования глобальных переменных

    Я б от них избавился

    function SearchAndReplace-HexPatternInBinaryFile {
        [OutputType([int[]])]
        param (
            [Parameter(Mandatory)]
            [string]$filePath,
            [string[]]$patterns,
            [byte[]]$newFileBytes
        )
    ......
    .....
        $replacedPatternsIndexes = SearchAndReplace-HexPatternInBinaryFile -filePath $filePathArg -patterns $patterns -newFileBytes $newFileBytes


    Сразу получается то же самое время

    Но вообще странно считать время через Stopwatch без учёта чтения файла, который почему-то читается не после MAIN, а до. хотя по сравнению с поиском оно и маленькое :)
    Ответ написан
    Комментировать
  • Как из скрипта ps1 запустить другой powershell скрипт ps1 и передать ему массив аргументом?

    @MaxKozlov Куратор тега PowerShell
    Вы слишком много хотите от Start-Process :)
    Это просто winapi, которое не знает о том, что в качестве аргумента может быть не строка.
    Поэтому всё упирается в интерпретатор параметров, который в вызываемом скрипте.

    Я в своём примере в том самом вопросе не зря в called добавил ещё и вывод $args
    Если в первом скрипте аргументы формировать как
    $argumentList = '-noprofile', '-noexit', '-File', 'd:\called.ps1', "-FilePath `"$filepath`""
    $argumentList += $patterns

    А второй сделать как
    param(
      [string]$FilePath #,
    #  [array]$Patterns
    )

    То во втором именно в $args попадёт содержимое массива
    Но по любому второй скрипт должен знать, что ему куда передают

    Поэтому я такую проблему решал бы вообще с другой стороны :)

    Достаточно добавить в запускающий скрипт #requires -RunAsAdministrator
    и тогда запускаемому можно передавать всё что угодно, ведь его не надо будет запускать через
    Start-Process, а можно будет просто вызывать из первого
    Ответ написан
    2 комментария
  • Как из скрипта ps1 запустить от имени администратора другой powershell скрипт ps1 и передать ему параметры если в путях есть пробелы?

    @MaxKozlov Куратор тега PowerShell
    Варианты бывают разные, По сути то же, что и в комментариях, но выглядит чуть более аккуратно :)
    Особенно хорош вариант с -EncodedCommand, потому что там можно хоть целый скрипт написать

    call.ps1
    $filepath = "D:\test folder\with test file\myfile.exe"
    $patterns = "11223344/55667788"
    
    $argumentList = '-noprofile', '-noexit', '-File', 'd:\called.ps1', "-FilePath `"$filepath`"", "-patterns `"$patterns`""
    
    Start-Process powershell -Verb RunAs -ArgumentList $argumentList
    
    # Специально многострочный пример
    $command = @"
    d:\called.ps1 -FilePath `"$filepath`" -patterns `"$patterns`"
    "@
    $encodedCommand = [convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($command))
    
    Start-Process powershell -Verb RunAs -ArgumentList '-noprofile -noexit -EncodedCommand', $encodedCommand


    called.ps1
    #requires -RunAsAdministrator
    
    param(
      $FilePath,
      $Patterns
    )
    Write-Host "FilePath: >$FilePath<"
    Write-Host "Patterns: >$Patterns<"
    
    foreach ($a in $args) {
       Write-Host "Argument: >$a<"
    }
    Write-Host "---"
    Ответ написан
  • Какой метод лучше для задания по расписанию скрипта PowerShell?

    @MaxKozlov Куратор тега PowerShell
    Какой правильный способ для того, чтобы каждые 5 минут этот скрипт перезапускался, создавая новый файл, оставляя старые файлы?

    Вам именно надо чтобы скрипт перезапускался с самого начала или просто каждые 5 минут начинал писать в другой файл ?

    Потому что "перезапускался" несовместимо с "Запускать задачу при входе пользователя в систему"
    Ну или можно просто запускать с текущим пользователем каждые 5 минут. понятно, что пока пользователь не залогинился, запускать и не получится. Чтобы задача не плодилась, есть настройки "прибивать текущую" в шедулере

    *-Job - вообще не для этого
    А вот Add-Content, как раз, хорошо подойдёт для дописывания логов
    Ответ написан
    6 комментариев
  • Почему не удается экспортировать ящик в PST на другой сервер?

    @MaxKozlov
    Вы, видимо смотрите права Full на учётку ? а нужны не они

    https://learn.microsoft.com/en-us/powershell/modul...

    You need to grant the following permission to the group Exchange Trusted Subsystem to the network share where you want to export or import PST files:

    To import PST files from the share: Read permission
    To save exported PST files to the share: Read/Write permission.


    Локально, очевидно они есть
    Ответ написан
  • Как правильно удалить определенные учетные записи windows 10 через powershell?

    @MaxKozlov Куратор тега PowerShell
    в цикле
    Удалить папку и соответствующую папке запись в реестре в
    "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"

    Естественно, включая всякие проверки на системные папки типа Default/AllUsers, RefCount, соответствие guid и т.д.
    Те папки, которые в реестре не числятся и не являются системными - можно просто удалять

    А простого способа, насколько я знаю, нет

    Ну или можно поискать соответствующие модули
    Ответ написан
    Комментировать
  • Powershell не хочет распарсивать Json. Как правильно его распарсить или же добавить кавычки перед распарсиванием?

    @MaxKozlov Куратор тега PowerShell
    Вы можете предварительно через -replace заменить все эти сомнительные места на то, что вам надо, но в целом я согласен с Everything_is_bad, если вы собрались читать json, он должен быть валидным
    Ответ написан
    Комментировать
  • Как отправить письмо в Powershell без шифрования логина и пароля?

    @MaxKozlov Куратор тега PowerShell
    У вас и так пароль уходит на сервер в нешифрованном виде.

    То, что вы предварительно credential типа "шифруете" всё равно до сервера в таком виде не уходит. Оно только в памяти так хранится.
    в SMTP сессии там всё равно Plain/Login

    Можно отправлять через System.Net.Mail.SmtpClient

    пример

    Там с SSL всё гибче
    Ответ написан
    Комментировать
  • Почему powershell выдаёт разные результаты на команду из консольного ввода и из ScriptProperty?

    @MaxKozlov Куратор тега PowerShell
    Самое простое, если вас не устраивает Get-IniContent - поправить его, чтобы не путал :)
    ...
    $ini = [ordered]@{}
    ...
    $ini[$section] = [ordered]@{}
    ...


    Или взять класс на c# Отсюда
    и вкрячить его в свой powershell скрипт
    Ответ написан
    Комментировать
  • Как указать явно куда устанавливать pip пакеты?

    @MaxKozlov
    если вы в оригинальной команде писали
    sudo pip
    это по сути установка из под рута
    поэтому, просто
    become: true
    или (если есть необходимость)
    become: true
    become_user: root

    p.s. Если посмотреть старые доки - там было даже sudo: yes, а не become
    Ответ написан
    Комментировать
  • Как исправить ошибку кодировки Powershell, при выводе InvokeRequest?

    @MaxKozlov Куратор тега PowerShell
    Короче, полез таки я повторить ваш запрос
    На заголовки посмотрел до того не очень внимательно

    Тут на самом деле проблема не кодировки в смысле клиента (charset), а encoding для протокола - в смысле алгоритма компрессии. По короткому кусочку вывода это было не очень понятно, а выполнили ли вы рекомендацию записать в файл и там посмотреть - не ответили.

    Проблема в том, что PSv5.1 не умеет декодировать контент в том виде как вы его просите, а именно
    "accept-encoding"="gzip, deflate, br, zstd"
    PSv5.1 умеет в gzip, deflate, zstd. а вот в br не умеет

    Варианты:
    1. Используйте PSv7, он умеет
    2. Уберите 'br' из заголовка accept-encoding запроса
    3. Уберите вообще заголовок accept-encoding из запроса
    Ответ написан
    Комментировать