Ответы пользователя по тегу PowerShell
  • PsExec.exe не удается правильно запустить скрипт?

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

    psexec -h

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

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

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

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

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

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

    $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 Куратор тега PowerShell
    Судя по вот этой страничке,
    настройка должна быть просто Utf
    А вообще по дефолту там Auto - само должно понять, если сервер умеет

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

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

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

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

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

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

    @MaxKozlov Куратор тега PowerShell
    жудкий синтаксис. позволил себе отформатировать :)
    проверять каждую папочку отдельно и ставить флажок "отправлять"
    а у вас фактически проверяется только последняя папка
    $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 Куратор тега PowerShell
    $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 Куратор тега PowerShell
    Вторая функция рабочая вполне. надо только названия поправить и бОльшую вложенность использовать. у вас там микс из 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
    Это проблема не powershell, а c#(.net). Классическая. Отсутствие в формате времени TimeSpan обозначений для Total*

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

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

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

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

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

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

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

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

    $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'
    Ответ написан
  • Чем осуществить парсинг текста в powershell?

    @MaxKozlov Куратор тега PowerShell
    пока отвечу а второй вопрос
    Get-Eventlog -logname Security -After Get-Date -Format "dd mm yyyy" -InstanceId 4624 | Format-List

    Парсер вас просто не понимает. Возьмите в скобки.

    Get-Eventlog -logname Security -After (Get-Date -Format "dd mm yyyy" ) -InstanceId 4624 | Format-List

    И формат лишний-там тип datetime, а не строка
    Get-Eventlog -logname Security -After (Get-Date).Date -InstanceId 4624 | Format-List


    Если вы хотите дальше как-то выбирать или сортировать - уберите format-list. Это уже вывод на консоль, с которым дальше делать что-то сложно

    Теперь первый вопрос.

    Имя логина содержится в ReplacementStrings[5]
    Поиск и фильтрация осуществляется примерно так

    Get-Eventlog -logname Security -After (Get-Date).Date -InstanceId 4624 | Where-Object { $_.ReplacementStrings[5] -match 'pupkin' -and $_.TimeGenerated -lt '2022-05-05 11:00'}


    можно группировать по логину
    Get-Eventlog -logname Security -After (Get-Date).Date -InstanceId 4624 | Group-Object { $_.ReplacementStrings[5] }


    Пример выборки полей
    Get-Eventlog -logname Security -After (Get-Date).Date -InstanceId 4624 | Select-Object @{n='Username'; e={$_.ReplacementStrings[5]}}, TimeGenerated
    Ответ написан
  • Как узнать стоит ли софт для просмотра целостности рейда или нет в Windows Core?

    @MaxKozlov Куратор тега PowerShell
    гугль по "megaraid cmd" показывает ссылки на некую утилиту megacli
    поищите её саму и инфу по ней
    Ответ написан
    Комментировать
  • Как правильно сохранить переменную после нажатия кнопки?

    @MaxKozlov Куратор тега PowerShell
    Вот этот вот кусок вообще не имеет смысла
    $but_imei.Add_Click(
        {
        IMEI
        dateusers 
        $phone = $itembox.SelectedItem
        write-host = $phone
        }
        )

    Если IMEI и dateusers это не функции без параметров
    а "write-host = $phone" конечно не синтаксическая ошибка благодаря функционалу write-host, но очень на неё похожа

    В целом же, если разберётесь с ошибками, код рабочий
    Вот в таком виде выдаёт на консоль содержимое комбобокса
    add-type -AssemblyName System.Windows.Forms
    $Form = New-Object System.Windows.Forms.Form
    $Form.Size = New-Object System.Drawing.Size(500,400)
    $Form.StartPosition = "CenterParent"
    $itembox = New-Object System.Windows.Forms.ComboBox
        $itembox.AutoSize = 1
        $itembox.Location = New-Object System.Drawing.Point(40,40)
    $itembox.DataSource = @("Samsung A12", "Redmi Note A6", "Другое:", "4")
    $but_imei = New-Object System.Windows.Forms.Button
        $but_imei.text = "Записать"
        $but_imei.Location = "400,100"
        $but_imei.AutoSize = 1
        $but_imei.Add_Click(
        {
          write-host $itembox.SelectedItem -fore green
        }
        )  
    $Form.Controls.Add($itembox)
    $Form.Controls.Add($but_imei)
    $Form.ShowDialog()
    Ответ написан
    7 комментариев