• Как сделать массовую рассылку пользователям на удаленные компьютеры?

    @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 из запроса
    Ответ написан
    Комментировать
  • Ошибка Get-WmiObject: Не поддерживается, как исправить?

    @MaxKozlov Куратор тега PowerShell
    Работа WMI в общем случае не зависит от версии Powershell
    Скорее всего у вас сама база WMI поломана
    Можно попробовать "открыть" этот класс через wbemtest
    Если откроется с проблемами, попробовать починить базу wmi
    Примерно как здесь описано

    А может быть дрова не поддерживают, но это маловероятно
    Ответ написан
  • Как грамотно реализовать на PowerShell?

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

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

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

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

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

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