Ответы пользователя по тегу PowerShell
  • Как передать переменную с локального компа на удаленный в сеанс powershell при выполнении psexec?

    @MaxKozlov
    тут скорее зависит от того что у вас там в параметрах
    Что-то простое, типа строки, работает

    $x = 'test'
    psexec \\server powershell -NoProfile -Сommand "write-host '$X'"
    psexec \\server powershell -NoProfile -Command "param(`$a) write-host `$a"  $x

    А вот если там объект, его надо предварительно сериализовать в строку, а на той стороне десериализовать

    Вариант сериализации - Convert-ToJson с последующим упаковыванием в base64

    Может быть даже проще окажется использовать -EncodedCommand
    Ответ написан
  • Powershell - экранирование спецсимволов?

    @MaxKozlov
    Честно говоря, живьём не пробовал, но, скорее всего нужно что-то типа того.
    Обратите ещё внимание, что Default в круглых скобках, а вокруг -Command кавычки не нужны

    New-ItemProperty -LiteralPath HKCR:\Microsoft.PowerShellScript.1\Shell\runas\command -Name '(Default)' -Value 'powershell.exe -NoExit -Command "if((Get-ExecutionPolicy ) -ne ''AllSigned'') { Set-ExecutionPolicy -Scope Process Bypass }; & ''%1''"' -PropertyType String -Force | Out-Null;

    Хотя, я не понимаю, зачем это надо :)
    Ответ написан
  • Как удаленно установить программу через powershell?

    @MaxKozlov
    Enter-PSSession нельзя использовать в скриптах. Это интерактивная команда
    Вам нужно использовать
    Invoke-Command -ComputerName $computer { C:\Temp\Install.exe /S }

    Если выполнять несколько команд, можно создать сессию
    $session = New-PSSession -ComputerName $computer
    Invoke-Command -Session $session { C:\Temp\Install.exe /S }
    Invoke-Command -Session $session { C:\Temp\Install2.exe /S }


    Но тут может быть засада. Некоторые инсталляторы требуют интерактивную сессию

    Тогда придётся извращаться с запуском задачи от имени текущего пользователя, которая и будет выполнять вашу C:\Temp\Install.exe /S
    Ответ написан
    Комментировать
  • Powershell. Как правильно подставить значение переменной в URl адресс?

    @MaxKozlov
    Можно просто вместо Select-Object id сделать Select-Object -ExpandProperty id
    Ответ написан
    Комментировать
  • PsExec.exe не удается правильно запустить скрипт?

    @MaxKozlov
    о, добрался я таки до нужного компа.
    Как и говорил res2001 в комментариях в пункте 3, это UAC, надо добавить ключик

    psexec -h

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

    @MaxKozlov
    Так как credentials вам нужны фактически только для Invoke-Command
    а у shutdown есть свой ключик для удалённого выключения и перезагрузки, можно заменить
    Invoke-Command на shutdown -m \\$TMP .....
    права на перезагрузку компов у этих пользователей уже должны быть или вам всё равно придётся их дать.

    Если же нужно мутить что-то более сложное, надо смотреть в сторону Register-PSSessionConfiguration

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

    Если же прав на перезагрузку у них нет, но есть у того, чьи credentials вы им "выдаёте" - то это по сути всё равно что им самим выдать, дополнительные "навороты" вокруг этого факта ничего по сути не меняют, так как нажать на ярлык они могут в любой момент
    Ответ написан
    Комментировать
  • Как в PowerShell найти файл и проверить на совпадение по дате в его имени?

    @MaxKozlov
    Всё что вам было нужно - взять в двойные кавычки - именно в них происходит интерполяция переменных

    $Date = get-date -Format "yyyy-MM-dd"
    Get-ChildItem -Path "I:\BACKUP\File_$Date*.bak"
    # Если непременно надо подчёркивание, то переменную придётся выделить
    # Get-ChildItem -Path "I:\BACKUP\File_$($Date)_*.bak"
    Ответ написан
    Комментировать
  • WinSCP PowerShell, почему меняет названия файла?

    @MaxKozlov
    Судя по вот этой страничке,
    настройка должна быть просто Utf
    А вообще по дефолту там Auto - само должно понять, если сервер умеет

    И у меня всё нормально сработало. Возможно, проблема в настройках вашего сервера

    P.S.
    Хотя, может, я не так понял ваш текст и "При переносе файл меняет название с РУС на "символы\буквы"." касается уже Move-Item, а не PutFiles ?
    Ответ написан
    Комментировать
  • Как сохранить обьект в файл?

    @MaxKozlov
    Export-Clixml / Import-Clixml
    "Живой" объект не воссоздаст, но все свойства будут доступны

    под "живым" я подразумеваю штуки типа WMI
    Ответ написан
    2 комментария
  • Как произвести замену без регулярных выражений?

    @MaxKozlov
    Можно предварительно экранировать символы регулярных выражений перед использоаанием.

    А можно испрользовать метод .replace() для строк
    "Строка в которой будет производится замена".replace("текст, который должен быть заменен", "на что заменен")
    Ответ написан
    Комментировать
  • Неправильно срабатывает условия IF как исправить?

    @MaxKozlov
    жудкий синтаксис. позволил себе отформатировать :)
    проверять каждую папочку отдельно и ставить флажок "отправлять"
    а у вас фактически проверяется только последняя папка
    $folders = 'E:\BASE\enm*\pm*','F:\DATE\enm*\pm*'
    $send_mail = $false
    Get-ChildItem -force $folders -ErrorAction SilentlyContinue | Where-Object { $_ -is [io.directoryinfo] } | ForEach-Object {
        $len = 0
        Get-ChildItem -recurse -force $_.fullname -ErrorAction SilentlyContinue | ForEach-Object { $len += $_.length }
        $colors = @{$False='black'; $True='red'}
        $_.fullname+' - ', '<font color="{1}">{0:N2} Gb</font>' -f ($len / 1Gb), $colors[$len -ge 3Gb]
        if ($len -ge 3Gb) {
            $send_mail = $True
        }
    } | Tee-Object -Variable body 
    if ($send_mail)
    {
        Send-MailMessage-From 'test@test.ru' -To 'test@test.ru', -Subject "enm size" -BodyAsHtml ($Body -join "<br>`r`n")  –SmtpServer '10.10.10.10'
    }
    Ответ написан
    Комментировать
  • Как вытянуть значение из файла?

    @MaxKozlov
    $c = Get-Content d:\your_file.txt
    
    $c | Foreach-Object -Begin { $data = @{} } -Process { $a = $_ -split ':', 2; if ($a.Length -eq 2) { $data[$a[0].Trim()] = $a[1].Trim() } } -End { [PSCustomObject]$data }


    Результат можно присваивать переменной и потом анализировать/преобразовывать по полям

    $info = $c | ......
    [float]($info.Download -replace 'Mbps.*')
    Ответ написан
    Комментировать
  • При конвертации из XML в JSON с помощью PowerShell получаю пустые значения, как исправить?

    @MaxKozlov
    Вторая функция рабочая вполне. надо только названия поправить и бОльшую вложенность использовать. у вас там микс из ConvertFrom-Xml и ConvertFrom-Xml2

    PS D:\> $s = '<?xml version="1.0" encoding="utf-8"?>
    >> <Data>
    >>   <Card>
    >>     <Id>123</Id>
    >>     <CreateDate>2022-06-20T21:01:32.7727011+05:00</CreateDate>
    >>     <CardData>
    >>       <Id>456</Id>
    >>       <Value>789</Value>
    >>       <Ord>0</Ord>
    >>     </CardData>
    >>   </Card>
    >> </Data>'
    PS D:\> $xml = [xml]$s
    PS D:\> function ConvertFrom-Xml2 {
    >>   param([parameter(Mandatory, ValueFromPipeline)] [System.Xml.XmlNode] $node)
    >>   process {
    >>     if ($node.DocumentElement) { $node = $node.DocumentElement }
    >>     $oht = [ordered] @{}
    >>     $name = $node.Name
    >>     if ($node.FirstChild -is [system.xml.xmltext]) {
    >>       $oht.$name = $node.FirstChild.InnerText
    >>     } else {
    >>       $oht.$name = New-Object System.Collections.ArrayList
    >>       foreach ($child in $node.ChildNodes) {
    >>         $null = $oht.$name.Add((ConvertFrom-Xml2 $child))
    >>       }
    >>     }
    >>     $oht
    >>   }
    >> }
    PS D:\> $xml | ConvertFrom-Xml2 | ConvertTo-Json -Depth 10
    {
        "Data":  [
                     {
                         "Card":  [
                                      {
                                          "Id":  "123"
                                      },
                                      {
                                          "CreateDate":  "2022-06-20T21:01:32.7727011+05:00"
                                      },
                                      {
                                          "CardData":  [
                                                           {
                                                               "Id":  "456"
                                                           },
                                                           {
                                                               "Value":  "789"
                                                           },
                                                           {
                                                               "Ord":  "0"
                                                           }
                                                       ]
                                      }
                                  ]
                     }
                 ]
    }


    А вообще это всё потому что $xml - это не чистый PS объект, а XmlDocument
    Ответ написан
    1 комментарий
  • Как вывести время в формате больше 24 часов?

    @MaxKozlov
    Это проблема не powershell, а c#(.net). Классическая. Отсутствие в формате времени TimeSpan обозначений для Total*

    решается, обычно, форматированием типа
    "{0:00}:{1:mm\:ss\,ff}" -f $sum.TotalHours, $sum
    Ответ написан
    Комментировать
  • Как запустить скрипт powershell через планировщик?

    @MaxKozlov
    Если выполнять из планировщика от текущего пользователя - добавьте в параметры запуска -WindowStyle Hidden. Но мигание всё равно иногда проскакивает, так как Powershell - консольная программа...
    Полностью от него избавиться можно через костыли из wsf (vbscript/cscript)

    Если же запускаете от другого пользователя - никто работоспособность офиса не гарантирует без интерактивного сеанса.
    И микрософт прямо об этом пишет везде.
    Ответ написан
    Комментировать
  • Как можно сохранять данные определенных событий журнала Windows в файле в режиме реального времени?

    @MaxKozlov
    ... а если вам надо вот прям рилтайм, есть .net класс System.Diagnostics.EventLog
    а у него событие EventWritten
    $global:log = New-Object System.Collections.ArrayList
    $testobj = New-Object -TypeName System.Diagnostics.EventLog
    $testobj.Log = "Security"
    Register-ObjectEvent -InputObject $testobj -EventName EntryWritten -Action {
      param($sender, $e)
      [void]$global:log.Add([PSCustomObject]@{Sender = $sender; Args = $e })
    }
    
    # Смотреть потом события в переменной
    $global:log


    Заменил пример на более полезный
    Ответ написан
    6 комментариев
  • Как передать пароль exe запускаемому из powershell?

    @MaxKozlov
    Помимо файла pgpass, скорее всего будет работать переменная окружения PGPASSWORD
    в Powershell - $env:PGRASSWORD = 'Pa$$w0rd'
    Только хранить это в коде - такое себе....
    Можно хотя бы хранить их как текстовое представление SecureString - оно хотя б к компу и юзеру привязано

    Update: О, как раз пример Роман Безруков дал :)
    Ответ написан
    Комментировать
  • Как сделать, подсветку строки жирным цветом?

    @MaxKozlov
    Send-MailMessage -BodyAsHtml ....
    И сам body форматируете как хотите

    Для подсвечивания текста можно вместо
    $_.fullname, '{0:N2} Gb' -f ($len / 1Gb)}
    выдумать что-нибудь с if или просто подставляете цвет в тэг
    типа
    $colors = @{$False='green'; $True='red'}
    .........
    $_.fullname, '<font color="{1}">{0:N2} Gb</font>' -f ($len / 1Gb), $colors[$len -le 2Gb]}
    Ответ написан
    3 комментария
  • Как изменить настройки сети через скрипт без запроса подтверждения от пользователя?

    @MaxKozlov
    Можно добавить человека в группу "Операторы настройки сети" (Network Configuration Operators)
    Well-known SID S-1-5-32-556

    Но если под "обойти" вы имеете ввиду "втихаря, без прав админа" - то никак :)
    Ответ написан
    Комментировать
  • Сбор информации и отправки. Как объединить 2 действия?

    @MaxKozlov
    Совсем китайская грамота ?
    Почитайте какую-нибудь вводную статью :)

    $body = gci -force 'E:\BASE\enm*','F:\DATE\enm*' -ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % {$len = 0
    gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length }
    $_.fullname, '{0:N2} Gb' -f ($len / 1Gb)
    }
    
    $Body = $Body -join "`r`n"
    
    Send-MailMessage -From 'test@test.ru' -To 'test@test.ru', -Subject "enm size" -Body $Body –SmtpServer '10.10.10.10'


    Если хочется на экран тоже вывести
    gci -force 'E:\BASE\enm*','F:\DATE\enm*' -ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % {$len = 0
    gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length }
    $_.fullname, '{0:N2} Gb' -f ($len / 1Gb)
    } | Tee-Object -Variable body
    
    $Body = $Body -join "`r`n"
    
    Send-MailMessage -From 'test@test.ru' -To 'test@test.ru', -Subject "enm size" -Body $Body –SmtpServer '10.10.10.10'
    Ответ написан