Задать вопрос
Ответы пользователя по тегу PowerShell
  • SSH + PowerShell, как запустить команду с повышенными привилегиями?

    @MaxKozlov Куратор тега PowerShell
    Проверить и сравнить права можно через whoami /all
    скорее всего там будет очень похоже

    Если комп не в домене, то можно посмотреть на
    LocalAccountTokenFilterPolicy

    https://winintro.ru/windowspowershell2corehelp.en/...
    Set the value of the LocalAccountTokenFilterPolicy registry entry to 1.

    For example, the following command uses the New-ItemProperty cmdlet and the Windows PowerShell Registry Provider to create the LocalAccountTokenFilterPolicy registry entry on the local computer and set its value to 1.

    new-itemproperty -name LocalAccountTokenFilterPolicy -path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -propertyType DWord -value 1

    winrm quickconfig его ставит. если комп не в домене. Таким образом, ремотная сессия получает права админа без uac.

    А сервис ssh установленный по дефолту вполне достаточен для выполнения с админскими правами.

    Разве что некоторые вещи можно ставить только в интерактивной сессии. Тот же ssh-server ставится только интерактивно. Или локаль
    Ответ написан
    Комментировать
  • Как скомбинировать параметры powershell скрипта?

    @MaxKozlov Куратор тега PowerShell
    Вам по-хорошему надо один раз получить список компов и в csv его сохранить, добавив поле-флаг "установлено"
    И потом пробегаться по файлу в поисках "не установлено" + "доступно"
    Для реультата ставить
    Типа
    1 скрипт - get-adcomputer ... | select name, installed | export-csv -path xxx
    2 скрипт
    #читаем список всех компов
    $all=Import-csv xxx
    #проходим по списку в поисках живых где неустановлено
    foreach ($comp in $all) {
      # проверяем всякие условия
      if (-not $comp.installed -and
         (test-connection $comp.name) -and
         (-not (test-path ....)) { #можно еще условий добавить
         #install
         Invoke-command -computername $comp.name { 
              #тут команды установки
              # никаких повторных invoke-command и powershell НЕ надо
         }
         .....
         #ставим флаг что установлено
         $comp.installed=$true
      }
    }
    #экспортируем обратно в csv с установленными флагами
    $all | export-csv xxx

    И запускать периодически пока не будет установлено на всех
    Ответ написан
    7 комментариев
  • Можно ли написать аналог моей команды с линукс на Powershell?

    @MaxKozlov Куратор тега PowerShell
    Что-то типа
    Adb devices | select-object -skip 1 | foreach-object -parallel {
      $id=$_ -replace '\s+device'
      Adb -s $id install some.apk
    }

    Нужен Psv7 для свича -parallel
    Если ест только 5.1 нужно использовать внешние модули
    Posh-rsjob, threadJob, invoke-parallel. Ну и код под них поправить
    P.s. про параллельное выполнение в вопросе не совсем внятно
    Ответ написан
    3 комментария
  • Что добавить в скрипт чтобы он удаленно скопировал exe на множество хостов?

    @MaxKozlov Куратор тега PowerShell
    Безотносительно того что там в скрипте наворочено.
    Если у вас идет копирование с сети внутри invoke-command - вы получаете классический double-hop == access denied

    Копировать надо со своей машины или по шаре типа c$ или открывать ремотную сессию и копировать в сессию (-tosession)
    Ответ написан
    Комментировать
  • Из объектов получить таблицу с привязкой к значениям?

    @MaxKozlov Куратор тега PowerShell
    $fields = 'object1','object2','object3','object4','object5','object6'
    $data = 'name object quantity
     name1 object1 1
     name1 object5 10
     name1 object2 5
     name2 object2 1
     name2 object3 4' -split "`r`n" | ConvertFrom-Csv -Delimiter ' '


    foreach($d in ($data | Group-Object -Property name)) {
        $o = [ordered]@{ name = $d.name }
        $name_data = $d.Group | Group-Object -Property object -AsHashTable
        foreach ($field in $fields) {
            if ($name_data.ContainsKey($field)) {
                $o[$field] = $name_data[$field].quantity
            }
            else {
                $o[$field] = 0
            }
        }
        [PSCustomObject]$o
    }


    name    : name1
    object1 : 1
    object2 : 5
    object3 : 0
    object4 : 0
    object5 : 10
    object6 : 0
    
    name    : name2
    object1 : 0
    object2 : 1
    object3 : 4
    object4 : 0
    object5 : 0
    object6 : 0


    а складывать сазу в кучку было бы примерно так же. создать $o
    в цикле заполнить поля, преобразовать в объект

    p.s. интересно, подсветка powershell когда-нибудь появится ?
    Ответ написан
  • Как экспорттировать 20 пользователей в файл, чтобы затем импортировать на новый сервер?

    @MaxKozlov Куратор тега PowerShell
    как-то приблизительно так
    get-localuser | export-csv -delimiter ';' -encoding utf8 -notypeinformation -path d:\путь_к_файлу.csv

    редактируем руками файл, дописываем колонку password
    import-csv -delimiter ';' -encoding utf8 -path d:\путь_к_файлу.csv |
    foreach-object {
      $pass =  New-Object System.Management.Automation.PSCredential 'a', ($_.password | ConvertTo-SecureString - AsPlainText -Force)
      new-localuser -Name $_.Name -Password $pass.password ..... # тут другие нужные параметры
    }
    Ответ написан
    2 комментария
  • Как вывести в командной строке имя запущенного batch-файла, содержащего PowerShell-скрипт?

    @MaxKozlov Куратор тега PowerShell
    Ваша ошибка в том, что код "echo %~nx0 completed!" выполняет powershell, который не знает что такое %~nx0 (echo - алиас для write-output)
    Так что или как предложил сергей кузьмин
    или такая правка
    @echo off
    @powershell.exe -ExecutionPolicy Bypass -Command "$fn = \"%~f0\"; $_=((Get-Content $fn) -join \"`n\");iex $_.Substring($_.IndexOf(\"goto :\"+\"EOF\")+9)"
    @goto :EOF
    Start-Process microsoft-edge:https://yoomoney.ru/moneylandia/lootboxes
    Start-Sleep 5
    Get-Process -Name "*msedge*" | Stop-Process
    echo "$fn completed!"
    pause
    Ответ написан
    2 комментария
  • Как допилить ps скрипт?

    @MaxKozlov Куратор тега PowerShell
    Думаю, вам прежде всего надо разбить свой скрипт на шаги помельче.

    и каждый шаг выполнить отдельно, контролируя его выполнение. То есть выполнять не из файла, а самостоятельно из консоли.
    1. получить список компов: $computers = ...
    2. проконтролировать что получили то что надо: $computers.Count; $computers[0]
    3. Выполнить первую часть установки на одном из компов: Invoke-Command -ComputerName $computers[0] { тут команда установки chocolatey }
    4. убедиться что всё встало: залезть на комп и посмотреть
    5. Поставить софт на этот комп: Invoke-Command -ComputerName $computers[0] { тут команды choco install }
    6. убедиться что всё встало: залезть на комп и посмотреть
    7. прочистить список компов от тех кто выключен: самостоятельное упражнение
    8. повторить пункты 3 и 5 на прочищенном списке: самостоятельное упражнение

    В результате из шагов 1, 7 и 8 сможете скомбинировать рабочий скрипт

    И скрипты свои пишите так же - по команде на строке, не экономьте переводы строк, читать невозможно.
    И не злоупотребляйте пайпами пока не понимаете что получаете на каждом их этапе, пишите всё в переменные
    Ответ написан
    4 комментария
  • Получаю ошибку при добавлении IP в TrustedHosts, почему?

    @MaxKozlov Куратор тега PowerShell
    winrm - это такая штука, которая хочет работать как сервис с обоих концов.

    Самое простое что вы можете сделать - запустить от админа winrm quickconfig у себя на клиенте
    и, если вас это напрягает, запретить к нему подключаться, например через firewall или те же настройки winrm listener

    на эту тему уже давно жаловались
    https://github.com/PowerShell/PowerShell/issues/3468
    Ответ написан
    1 комментарий
  • Скрипт для автоматически создание папок именами доменных пользователей, подразделений, определенными доступами?

    @MaxKozlov Куратор тега PowerShell
    По первому пункту - вы ищете пользователя, подставляя нечто, лежащее в $newuser
    в коммандлет Get-ADUser
    Ознакомьтесь, что там может быть. Скорее всего у вас что-то не то
    Get-Help Get-ADUser -Parameter Identity

    По второму - разберитесь что именно делает этот скрипт, чего не хватает именно вам и переделайте под себя. Когда разберётесь что делает, сможете понять чего не хватает.

    в целом, Вам, похоже, на фриланс.
    Ответ написан
  • Как изменить значение ключа реестра с командной строки?

    @MaxKozlov Куратор тега PowerShell
    По вопросу - с кавычками разберитесь.
    По жизни - не делайте так!
    Цель у вас какая-то мутная.
    Вместо того чтобы установить политики один раз как вам надо, вы городите какую-то дичь
    Ответ написан
    5 комментариев
  • Почему PS неполностью отрабатывает скрипт?

    @MaxKozlov Куратор тега PowerShell
    Запишите ошибку в файл и изучайте
    Может у вашего система прав нет, например. Или инстанс, действительно, нужен в другом формате
    Start-transcript в начале
    Ответ написан
  • Как цикл ForEach преобразовать в ForEach-​Object для распаралеливания выполнения?

    @MaxKozlov Куратор тега PowerShell
    Это ну совсем базовый синтаксис PS

    Здесь вы увидите разницу в синтаксисе
    https://stackoverflow.com/questions/29148462/diffe...
    а уж куда добавить параметр -Parallel, думаю уже догадаетесь
    Ответ написан
    Комментировать
  • Удалить определенные строки Powershell?

    @MaxKozlov Куратор тега PowerShell
    Надо при получении ID сразу его и выбирать и записывать, а не парсить кривой текстовый вывод.

    Хотя и его можно - сначала убрать перевод строки между [ и следующей строкой, потом оставить только такие строки, а потом убрать "["

    но лучше собирать сразу так
    Get-PnpDevice |
     Where {$_.HardwareID -notmatch 'PRINTENUM*|ROOT*|SW*|ACPIAPIC*|MONITOR*'} |
     Foreach { $_.HardwareID | Select -first 1 }
    Ответ написан
    1 комментарий
  • Запуск Ethernet адаптера программно (с помощью Bath или PowerShell)?

    @MaxKozlov Куратор тега PowerShell
    Есои рескан в Device manager в контрольной панели ничего не находит, значит софт врятли поможет.
    можно поискать что-нибудь в devcon, типа
    devcon rescan
    devcon reset
    devcon find(all)
    Скорее всего ресет железяка хочет.
    отключить quick-boot?
    Ответ написан
    Комментировать
  • Почему не работает вызов C:\Program Files\Git\bin\sh.exe через PowerShell с передачей ему команды?

    @MaxKozlov Куратор тега PowerShell
    А почему бы просто не запускать
    "C:\Program Files\Git\bin\git.exe" ? зачем ещё прослойка из sh ?
    cd e:/Git/Project
    & "C:\Program Files\Git\bin\git.exe" pull
    Ответ написан
    Комментировать
  • Как решить проблему с выводом значений из реестра через Invoke-Command?

    @MaxKozlov Куратор тега PowerShell
    Проще один раз всё загнать в один вызов.
    Так и работать будет в разы быстрее и запустить можно одновременно на несколько компов, только в вывод надо имя компа включить

    invoke-command -comp $comp {
      # а здесь все красоты
      # причём циклом
      $source @(
        @{ key name= '''; valuename=''},
        @{ key name= '''; valuename=''}
      )
      foreach ($src in $source) {
        get-itemproperty -path $src.keyname | select -expandproperty $src.valuename
      }
    }

    test опустил...
    Проблема у вас в select-object

    стандартный вызов, если он со свойствами, пытается подстроить последующий вывод под предыдущие возвращённые свойства. если вы вначале просите свойство "ProductID", то и в последующем вызове PS ждёт свойство ProductID, которого нет, вы подсовываете ему "SerialNumber"

    Для этого в моём варианте используется параметр ExpandProperty, который превращает объект в строку
    Ответ написан
    1 комментарий
  • Скрипт PS скачивания и установки BGInfo, упростить if(Если)?

    @MaxKozlov Куратор тега PowerShell
    Так вы хотите таки чтобы не скачивался по новой или вам всё равно ?

    Скачивать можно в $env:temp, тогда проверять не придётся.

    Папку для распаковки создавать с ключом -Force тогда не будет ругаться на её наличие

    Если качать не хочется, сразу проверять существование файла, а не папки

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

    $bits = (Get-WmiObject win32_operatingsystem).OSArchitecture -replace '\D+'

    и потом прямо в имя подставлять через if или из хеша, например, как нравится
    $filename = "C:\Admins\Add\BGInfo\Bginfo" + (if ($bits -eq '64) { '64' } else { '' } ) + ".exe"
    $filename = "C:\Admins\Add\BGInfo\Bginfo" + @{'64'=64; '32'=32 }[$bits] + ".exe"
    
    if (test-path $filename) .....


    А можно ещё качать со своей сети, где держать сразу два архива для разных битностей с соответствующим файлом внутри и с названием bginfo32/bginfo64 чтобы ещё проще было
    Ещё можно битность определять по наличию переменных окружения, а не через wmi-так быстрее будет
    Ответ написан
    Комментировать
  • Как безопасно подключаться с контроллера домена к рабочим станциям через Powershell?

    @MaxKozlov Куратор тега PowerShell
    Если под локальным админом вы имеете ввиду локального юзера, который создан именно а компе, а не в домене, попробуйте использовать имя пользователя без домена - "admin" и авторизацию negotiate, а не kerberos, по умолчанию
    Ответ написан
    Комментировать
  • Как в PowerShell удалить ПО пользователя?

    @MaxKozlov Куратор тега PowerShell
    Ну найдите в том что вы получили содержимое ключа UninstallString для каждой программы и запустите
    Естественно, это ключ надо включить в Select-Object
    Ответ написан
    Комментировать