Ответы пользователя по тегу PowerShell
  • Как сделать чтобы тема с обычного Power Shell была в терминале VS Code?

    @MaxKozlov Куратор тега PowerShell
    Как именно ставили тему? Вот примерно так же. Через профили терминала
    Ответ написан
  • Как занести в таблицу БД наименование компьютера, наименование ОС сопоставимому IP-адресу компьютера?

    @MaxKozlov Куратор тега PowerShell
    Если у вас рабочий DNS, вам достаточно использовать
    [System.Net.Dns]::Resolve

    PS > [System.Net.Dns]::Resolve('8.8.8.8')
    
    HostName   Aliases AddressList
    --------   ------- -----------
    dns.google {}      {8.8.8.8, 8.8.4.4}


    то есть ваше имя компа будет определяться как
    [System.Net.Dns]::Resolve($ip).HostName
    Ответ написан
    1 комментарий
  • Kак сделать многопоточный PS-скрипт?

    @MaxKozlov Куратор тега PowerShell
    Самое простое - Start-Job, оно есть везде, начиная с 3.0
    но оно памяти жрёт и использует процессы, а не потоки. по быстрому, на десяток-другой компов - сойдёт.

    Многопоточное:
    • PoshRSJob (причём лучше мой форк ;)
    • ThreadJob
    • Invoke-Parallel


    Всё это (модули/скрипты) требует установки на админский комп для запуска задач в стиле
    $computers | Start-RSJob { Invoke-MyCommand -Computer $_ }

    Потом можно посмотреть результаты работы
    Get-RSJob | Receive-RSJob

    а уже внутри Invoke-MyCommand будет выполняться что-то, что лезет удалённо и делает там свои дела
    Но вот это Invoke-MyCommand - если это внешняя функция, а не просто набор действий, требует дополнительного "проталкивания" в поток. Примеры есть

    Другие модули работают аналогично, со своими нюансами, естественно
    Ответ написан
    4 комментария
  • Ошибка определения переменной powershell, в чем причина?

    @MaxKozlov Куратор тега PowerShell
    Ну вы введите прямо в PS
    $csvData = Import-CSV -Path C:\share\FII.csv -Delimiter "," -Encoding UTF8
    $csvData[0]."ФамилияИмя"

    Если там что-то будет, то пойти дальше
    Get-ADUser -Filter { DisplayName -eq $csvData[0]."ФамилияИмя" }


    А если нет - то ванга подсказывает, что может быть проблема с кодировкой файла и стоит посмотреть, что вообще выдаст $csvData[0]

    проблема действительно была в кодировке , при запросе выдавались крокозябры
    Ответ написан
    Комментировать
  • Add-LocalGroupMember где ошибся?

    @MaxKozlov Куратор тега PowerShell
    Попробуйте добавлять не имя, а результат new-localuser или get-localuser, раз уж создан


    MaxKozlov, спасибо помогло добавление еще одной переменной после создания пользака и запихивания туда выхлопа Get-LocalUser -Name $name.

    чертовски странно но оно работает ))

    $name = hostname
    $pass = ConvertTo-SecureString "1234567" -AsPlainText -Force

    #Создаем пользака sysadmin
    New-LocalUser -Name sysadmin -PasswordNeverExpires -Password $pass
    Add-LocalGroupMember -Group Администраторы -Member sysadmin
    Add-LocalGroupMember -Group "Пользователи удаленного рабочего стола" -Member sysadmin

    #echo "$name"

    #Создаем пользака с именем компа
    New-LocalUser -Name $name -PasswordNeverExpires -Password $pass
    $login = Get-LocalUser -Name $name
    #echo "$login"
    Add-LocalGroupMember -Group Администраторы -Member $login
    Add-LocalGroupMember -Group "Пользователи удаленного рабочего стола" -Member $login


    А работает оно так потому что
    >Get-Help Get-LocalUser -Full
    ...
    ВЫХОДНЫЕ ДАННЫЕ
        System.Management.Automation.SecurityAccountsManager.LocalUser[]
            This cmdlet returns local user accounts.
    
    >Get-Help Add-LocalGroupMember  -Full
    ...
    ПАРАМЕТРЫ
        -Member <Microsoft.PowerShell.Commands.LocalPrincipal[]>
            Specifies an array of users or groups that this cmdlet adds to a security group. You can specify users or groups by name, security ID (SID), or LocalPrincipal objects.

    При этом
    >$lu = Get-LocalUser Administrator
    >$lu.GetType()
    Microsoft.PowerShell.Commands.LocalPrincipal
    >$lu.psobject.typenames
    Microsoft.PowerShell.Commands.LocalUser
    Microsoft.PowerShell.Commands.LocalPrincipal

    LocalUser - наследник LocalPrincipal

    То есть, если в качестве Member передавать нативный объект, всё работает как часы
    А если строку, то эта строка неверно преобразуется в объект.
    Вот так легко создаётся LocalPricipal из имени компа.
    [Microsoft.PowerShell.Commands.LocalPrincipal]::new($env:COMPUTERNAME)

    Если залезть в исходники
    AddLocalGroupMemberCommand.cs
    Sam.cs
    То во второй ссылке есть вызов получения сида из имени. видимо, именно он при одинаковых вводных сначала запрашивает компы, а потом юзеров
    Ответ написан
    1 комментарий
  • Не выводятся значения пользователей AD через powershell, в чем причина?

    @MaxKozlov Куратор тега PowerShell
    Проблема в том, что
    $user = Get-ADUser -identity "i.tsebrenko"
    Возвращает только стандартные поля
    DistinguishedName
    Enabled
    GivenName
    Name
    ObjectClass
    ObjectGUID
    SamAccountName
    SID
    Surname
    UserPrincipalName


    Если вы хотите посмотреть именно DisplayName, надо его специально просить
    $user = Get-ADUser -identity "i.tsebrenko" -Property DisplayName
    Write-Host $user.DisplayName


    Кстати, если вот такая фильтрация вам внезапно вернёт двоих, скрипт упадёт
    #Фильтруем пользаков по схожему описанию в AD
    $User = Get-ADUser -Filter {Description -eq $userDescription}
    #Изменяем указанные поля полями из csv файлы , присваиваем значения через $row.значение_из_таблицы
    if ($User) {

    Тут надо этот момент отдельно обрабатывать. Мало ли, кто-то руками description поправит
    Ответ написан
    4 комментария
  • Как занести диапазон ip адресов в таблицу базу данных Postgresql?

    @MaxKozlov Куратор тега PowerShell
    Ошибка вот тут
    Connect-DB($commandDB)
    Во-первых, уберите скобки, в PS они для параметров при вызове функций не нужны

    и Где тут вообще место для команды ?

    function Connect-DB
    {
        [CmdletBinding()]
        param
        (
            [string]$dbServer = 'localhost',
            [string]$dbName = 'postgres',
            [string]$dbUser = 'postgres',
            [string]$dbPass = 'postgres',
            [string]$port = '5432'
        )

    у вас там дальше по коду $commandDB используется, а в параметрах её нет
    Поставьте первым параметром
    function Connect-DB
    {
        [CmdletBinding()]
        param
        (
            [Parameter(Mandatory)]
            [string]$CommandDB,
            [string]$dbServer = 'localhost',

    и используйте как
    Connect-DB $commandDB, а лучше Connect-DB -commandDB $commandDB

    а вообще надо бы разделить connect-db на connect-db и invoke-db
    Ответ написан
    8 комментариев
  • Как запустить скрипт на терминальной ферме в VHDX?

    @MaxKozlov Куратор тега PowerShell
    Если пользователь подключен, его "диск" монтируется в users,
    можно просто по таймеру наличие папки проверять
    ну и событие генерится при подключении диска, на него можно скрипт навесить (Microsoft\Windows\VHDMP)
    Ответ написан
    Комментировать
  • PowerShell как показать папку с наибольшим вложением папок?

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

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

    @MaxKozlov Куратор тега PowerShell
    Эти перекодировки та ещё фигня
    "На коленке" не покажу, а системно вот так,
    function Get-TextEncoding ($Encoding) {
    		switch -regex ($Encoding) {
    			'default' {
    				[System.Text.Encoding]::Default
    			}
    			'utf8' {
    				[System.Text.Encoding]::UTF8
    			}
    			'oem' {
    				[System.Text.Encoding]::GetEncoding(
    					(Get-Culture).TextInfo.OEMCodePage
    				)
    			}
    			'ansi' {
    				[System.Text.Encoding]::GetEncoding(
    					(Get-Culture).TextInfo.ANSICodePage
    				)
    			}
    			'^\d+$' {
    				[System.Text.Encoding]::GetEncoding([int]$Encoding)
    			}
    			default {
    				[System.Text.Encoding]::GetEncoding($Encoding)
    			}
    		}
    }
    function Convert-TextEncoding {
    param (
    	[Parameter(ValueFromPipeline=$true,Position=0)]
    	[String[]]$InputObject,
    	[Parameter(Mandatory=$true,Position=1)]
    	[string]$FromEncoding,
    	[Parameter(Mandatory=$true,Position=2)]
    	[string]$ToEncoding
    )
    BEGIN {
    	try {
    		$FE = Get-TextEncoding $FromEncoding
    		$TE = Get-TextEncoding $ToEncoding
    	}
    	catch {
    		throw
    	}
    }
    PROCESS{
    	foreach ($s in $InputObject) {
    		if ($s) {
    			$TE.GetString($FE.GetBytes($s))
    		}
    		else {
    			$s
    		}
    	}
    }
    }
    
    Invoke-Command -ComputerName $Computer { net user } | 
        Convert-TextEncoding -FromEncoding 1251 -ToEncoding 866
    Ответ написан
    Комментировать
  • Как удалить 10 по давности файл через powershell?

    @MaxKozlov Куратор тега PowerShell
    Вы забыли сказать, как именно берёте эти свои файлы
    Если просто листинг папки, то после Get-ChildItem его можно отсортировать через Sort-Object -Descending -Property LastWriteTime
    А потом, пропустив первые 10 (Select-Object -Skip 10), поудалять остальные

    Собрать это всё в однострочник....
    Ответ написан
    2 комментария
  • Почему переменная перестаёт выводиться в терминал?

    @MaxKozlov Куратор тега PowerShell
    То же самое, что и в прошлый раз.
    У вас в выводе встречаются несколько разных объектов
    Сначала $lol.IdentityReference
    потом $myArray
    Состав полей у объектов разный. Перед выводом, собственно на экран (хост), Powershell буферизует вывод и пытается его подстроить под вас.
    Для этого он берёт состав полей второго объекта (там список с полями)
    PS полагает, что данный объект и должен быть примером, поэтому пытается выводить на экран для первого объекта те же поля, что и для второго. А там их, конечно, нет. В результате не выводится ничего.
    Промежуточный вывод на хост через Format- разбивает буфер и вы видите оба объекта со своими полями

    Ну и, как я писал в прошлый раз, необходимо выводить всё единообразно. Работаете только с экраном ?
    Используйте Out-Host, Write-Host, Format-xxx
    Хотите выводить в потоки, переменные и тп - используете обычные выводы
    Фактически ваш вызов $lol.IdentityReference это для Powershell $lol.IdentityReference | Out-Default, потому что далее этот вывод никуда не попадает, ни в переменную, ни в поток

    А вам явно бы хотелось Out-Host
    Ответ написан
    3 комментария
  • Как массово записать теги из текстовых файлов нужным музыкальным файлам в PowerShell?

    @MaxKozlov Куратор тега PowerShell
    Вы используете параметр -argumentlist, а фактически передаете туда одну строку ограниченную внешними двойными кавычками. Что там из этого наинтерпретирует ffmpeg, извесно только ffmpeg
    Попробуйте аргументы передавать именно списком
    То есть типа
    '-i', "$($file.BaseName).mp3", '-metadata', "title=`"$title`""

    То есть через запятую, каждый параметр в кавычках. Можно всегда двойных, можно одинарных, если интерпретировать внутри нечего, title в дополнительные экранированные кавычки
    А еще лучше будет не использовать start-process, а использовать &
    Ответ написан
    Комментировать
  • Установка Zabbix Agent на большое количество машин Windows без домена?

    @MaxKozlov Куратор тега PowerShell
    Думаю, раз вам от PS ничего особо и не надо, лучше через psexec
    аналог New-NetFirewallRule прекрасно делается через netsh
    К тому же я что-то не уверен, что у вас на Win7 есть, собственно, New-NetFirewallRule
    да и PSv2 внезапно может везде оказаться
    Ответ написан
    Комментировать
  • Как добавить свою команду в PowerShell?

    @MaxKozlov Куратор тега PowerShell
    Powershell здесь вообще ни при чём
    Кладёте программу по любому пути, прописанному в переменной окружения PATH ( PS: $env:PATH )
    и пользуетесь
    Или кладёте в любую папку и прописываете эту папку в PATH
    Ответ написан
    Комментировать
  • Почему переменная перестала выводить ответ?

    @MaxKozlov Куратор тега PowerShell
    У вас так всё намешано...
    Где-то forma-table, где-то просто "вывод", где-то чтение с хоста.
    Get-Srv($param), который в случае двух параметров превратится в массив...
    Не выводится, скорее всего, потому, что PS очень хочет вам угодить, пытаясь подстроить вывод. Но не может :)

    Я бы предложил хорошенько поработать над структурой, убрать рекурсию и правильно разделить ответственность между функциями
    типа
    function Show-SrvFolderList($kat_addr) { # Получаем на вход уже готовый путь к серверу
        Get-Children -Path $kat_addr | Format-Table Name
    }
    function Show-FolderAccess($inp_res) { #  увидеть список групп, с исключениями
        $lol2 = Get-Acl $inp_res
        $lol2 = $lol2.Access | Where-Object {
            $_.IdentityReference -notlike "*blabla1*" -and
            $_.IdentityReference -notlike "*blabla2*" -and 
            $_.IdentityReference -notlike "*blabla3*" -and 
            $_.IdentityReference -notlike "*blabla4*" -and 
            $_.IdentityReference -notlike "*blabla5*"
        }
        $lol2 | Format-Table
    }
    
    $srv_name = Read-Host "Введите сервер"
    $kat_addr = '\\' + $srv_name + '\Folder' # На каждом сервере есть определенная папка \Folder, которая подставляется в Get-Children. 
    do {
        Show-SrvFolderList
        # После того, как увидели все каталоги, можем выбрать один из них
        $inp_res = Read-Host "Введите ресурс или 1"
        if ($inp_res -eq '1') { break }
        Show-FolderAccess ($kat_addr + '\'  + $inp_res)
    } while ($true)


    Функции переименованы, чтобы было понятно что они делают
    Причём они Show, а не Get, потому что на самом деле они ничего не возвращают, а только показывают
    Ответ написан
    1 комментарий
  • Получить вывод команды командной оболочки в переменную makefile?

    @MaxKozlov Куратор тега PowerShell
    1. Вот тут придумали рекурсивный вызов
    https://stackoverflow.com/questions/4883021/how-to...

    2.
    не имею ни малейшего представления насчёт фич nmake, но может быть, у него есть что-то, что проверяет, например, дату создания/редактирования файла ? тогда можно обойтись без запуска самого powershell.

    Кстати, переменная $PSVersionTable появилась именно в v2, поэтому проверка типа IF $(psvr) <= 2 вам вообще недоступна, в принципе :)

    3. Если nmake умеет обрабатывать код возврата, то можно так:
    powershell -nologo -noprofile "exit $psversiontable.psversion.major"

    В коде возврата версию вернёт
    проверял на батнике
    @powershell -nologo -noprofile "exit $psversiontable.psversion.major"
    @echo %ERRORLEVEL%
    Ответ написан
  • Бесовщина в PowerShell?

    @MaxKozlov Куратор тега PowerShell
    Для правильного запуска необходимо указывать рабочий каталог
    например -WorkingDirectory C:\

    параметры можно передавать как
    $argument1 = '-noprofile -command "Start-Process powershell.exe -Verb RunAs -ArgumentList ''-noprofile -file C:\run.ps1''"'
    Start-Process -FilePath "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Credential $credential -ArgumentList $argument1
    Ответ написан
    Комментировать
  • Можно ли в скрипте PowerShell получить права администратора?

    @MaxKozlov Куратор тега PowerShell
    В вашей постановке задачи - даёте пользователю админский логин м пароль, пусть сам запускает :)
    Всё равно в скрипте подсмотрит

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

    Создаёте на нужных компах задачу, запускающуюся с нужными правами и потом себя удаляющую.
    Можно даже из под SYSTEM, там пароль не нужен (это если сеть задаче тоже не нужна)
    Ответ написан
  • Как в Powershell вывести сообщение из логов полностью?

    @MaxKozlov Куратор тега PowerShell
    На экран выводится форматированная надпись. Естественно, целиком она может не влзеть
    Вариантов масса
    Вы можете, например, или вывести только текст
    Get-WinEvent -LogName Application -MaxEvents 10 | Select-Object -ExpandProperty Message

    или, например, перенаправить всё это в csv
    Get-WinEvent -LogName Application -MaxEvents 10 | Select-Object Machinename, TimeCreated, Message | Export-csv -Path d:\111.csv
    и смотреть уже его
    Можно записать вывод в переменную и детально смотреть её содержимое
    $e = Get-WinEvent -LogName Application -MaxEvents 10
    $e[0].Message
    Ответ написан
    1 комментарий