В это посте буду записывать разные мелкие решения для удаленного управления с помощью powershell.

Пост планирую обновлять/дополнять.

Установка DNS серверов сетевого адаптера удаленного компьютера через WMI

$computer = "C005"
$netadapters = Get-WMIObject Win32_NetworkAdapterConfiguration -computername $computer | where{$_.IPEnabled -eq "TRUE"}

$WINSServers = "192.168.223.202","192.168.223.201"
$DNSServers = "198.198.223.202","193.58.251.251"

Foreach($netadapter in $netadapters ) {
   $netadapter.SetDNSServerSearchOrder($DNSServers)
   $netadapter.SetWINSServer($WINSServers)
   $netadapter.SetDynamicDNSRegistration("TRUE")

   #$netadapter.SetGateways("192.168.223.1", 1) #Установка шлюза и его метрики
   #$netadapter.EnableStatic("192.168.223.58", "255.255.255.0") #Установка статического IP адреса
}


#Посмотреть все настройки сетевого адаптера
Get-WmiObject Win32_NetworkAdapterConfiguration -computername . | where{$_.IPEnabled -eq "TRUE"} | select *

Обновить политики на всех компьютерах в конкретном OU в домене

$ErrorActionPreference = "SilentlyContinue"
$computers = Get-ADComputer -Filter * -SearchBase "OU=Computers,ou=corp,dc=example,dc=com"
#$computers = Get-ADComputer -Filter *

$computers | ForEach-Object {
    if(Test-Connection -ComputerName $_.Name){
        Invoke-GPUpdate -Computer $_.Name -RandomDelayInMinutes 0 -Force
    }
}

Определить версию IE

function Get-InternetExplorerVersionWMI {
    param ($strComputer)

    $hklm = 2147483650
    $key = "SOFTWARE\Microsoft\Internet Explorer\"
    $value = "Version"
    $wmi2 = "\\"+$strComputer+"\root\default:stdRegProv"
    $wmi = [wmiclass]$wmi2
    $rpk = ($wmi.GetStringValue($hklm,$key,$value)).sValue

    $rpk
}

Get-InternetExplorerVersionWMI Computer1

Ищем файлы измененные сегодня

Get-ChildItem t:\obmen -r | ? {!($_.psiscontainer) -AND $_.LastWriteTime.date -eq (get-date).date} | % {Copy-Item -path $_.fullname -destination t:\obmen2}

Проверяем параметр реестра (Включен протокол SMB 1.0) доменных компьютеров

$ErrorActionPreference = "SilentlyContinue"

$computers = Get-ADComputer -Filter *

$computers | ForEach-Object {
    if(Test-Connection -ComputerName $_.Name){
        invoke-command -computername $_ -scriptblock {
            $_;
            get-childitem "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\SMB1"
        }
    }
}

Запуск процессов после выполнения предыдущего

Внутренние команды выполняются по очеердно и не выполняется следующая пока не завершится предыдущая, но внешние команды такие как запуск EXE и Start-Process не ожидаются. Дождатся завершения можно следующим способом:

Notepad.exe | Out-Null

Для Start-Process есть параметр -Wait:

Start-Process <path to exe> -NoNewWindow -Wait

В PowerShell 2.0 is можно использовать background job:

$job = Start-Job { Запускаемый процесс }
Wait-Job $job
Receive-Job $job

Парсинг HTML таблицы (фрагмента страницы)

$av_product_out = "<div class='plsatin-ps-style'><table><tr><td class='IconInfoEncoded'></td><td>Product Name:</td><td>Kaspersky Free Windows Defender</td></tr><tr><td class='IconSuccessEncoded'></td><td>Definition Status:</td><td>UP_TO_DATE</td></tr><tr><td class='IconSuccessEncoded'></td><td>Real-time Protection Status:</td><td>ON</td></tr><tr><td class='IconInfoEncoded'></td><td>Product State:</td><td>266240 401664</td></tr></table></div>"


$obj = @{}

#Здесь .div.table. это точная последоовательность тэгов
$obj.Anti_Virus_Name = $([xml]$av_product_out).div.table.tr[0].td[2]
$obj.Anti_Virus_Definiton_Status = $([xml]$av_product_out).div.table.tr[1].td[2]
$obj.Anti_Virus_Protection_Status = $([xml]$av_product_out).div.table.tr[2].td[2]

Результат:

PS C:\scripts> $obj

Name                           Value
----                           -----
Anti_Virus_Definiton_Status    UP_TO_DATE
Anti_Virus_Name                Kaspersky Free Windows Defender
Anti_Virus_Protection_Status   ON

Активация Windows

$computer = gc env:computername

$key = "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX"

$service = get-wmiObject -query "select * from SoftwareLicensingService" -computername $computer

$service.InstallProductKey($key)

$service.RefreshLicenseStatus()

Создание символической ссылки (Powershell -ge 5.0)

New-Item -Path C:\LinkDir -ItemType SymbolicLink -Value F:\RealDir

Удаление программ

#
$app = Get-WmiObject -Class Win32_Product -Filter "Name = 'Puppet'"
$app.Uninstall()

$app = Get-WmiObject -Class Win32_Product -Filter "Name = 'Puppet (64-bit)'"
$app.Uninstall()

#
$computerlist = "FS1", "HV1", "DC1"

foreach ($comp in $computerlist) {
    $app = Get-WmiObject -Computername $comp -Class Win32_Product -Filter "Name = 'Puppet (64-bit)'"
    $app.Uninstall()
}

#
Invoke-Command -ComputerName C016 -ScriptBlock {
    $app = Get-WmiObject -Class Win32_Product -Filter "Name = 'Puppet'"
    $app.Uninstall()
}

Wake On LAN

function Send-WOL {
    [CmdletBinding()]
        param(
            [Parameter(Mandatory=$True,Position=1)]
            [string]$mac,
            [string]$ip="255.255.255.255",
            [int]$port=9
        )

    $broadcast = [Net.IPAddress]::Parse($ip)
    $mac=(($mac.replace(":","")).replace("-","")).replace(".","")
    $target=0,2,4,6,8,10 | % {[convert]::ToByte($mac.substring($_,2),16)}
    $packet = (,[byte]255 * 6) + ($target * 16)
    $UDPclient = new-Object System.Net.Sockets.UdpClient
    $UDPclient.Connect($broadcast,$port)
    [void]$UDPclient.Send($packet, 102)

}

Send-WOL -mac E0:B9:A5:44:4B:ED

Загрузка процессора

$ComputerName = "."

$cpu_proccess = Get-WmiObject -computer $ComputerName Win32_PerfFormattedData_PerfProc_Process| Sort-Object PercentProcessorTime -desc | Select-Object Name,PercentProcessorTime,IODataBytesPersec,IODataOperationsPersec | Select-Object -First 10

$cpu_proccess

Отключить службу

Set-Service wuauserv -StartupType Disabled

Просмотр размера папок на дисках

$source= "C:\", "E:\"

foreach($d in $source)
{
    Get-ChildItem $d | where {$_.psIscontainer} | Foreach {
        $r = robocopy $_.FullName c:\dummy /l /xj /e /nfl /ndl /njh /bytes /r:0
        $data = $r -match "(Файлов|Байт)" -replace "\s+(Файлов|Байт)\s+:\s+" | Foreach {$_.split(" ")[0]}
        New-Object PSObject -Property @{Folder=$_.FullName;Files=$data[0];"Size(mb)"=$data[1]/1mb;"Size(Gb)"=$data[1]/1gb}
    }
}

Производительность диска

Get-WmiObject -Class Win32_perfformatteddata_perfdisk_LogicalDisk | Select-Object Name,DiskReadsPersec,DiskWritesPersec,CurrentDiskQueueLength

Сбор статистики в течении минуты в файл:

$timeout = new-timespan -Minutes 1
$sw = [diagnostics.stopwatch]::StartNew()
$path = "c:\temp\counters.csv"

while ($sw.elapsed -lt $timeout)
{
$disks = Get-WmiObject -Query "Select * from Win32_perfformatteddata_perfdisk_LogicalDisk"
"Disk Name,Date,Disk Reads per Second, Disk Writes per Second, Current Disk Queue Length" >> $path
foreach($disk in $disks)
    {
    $date = Get-Date -format s
    $disk.Name + "," + $date + "," + $disk.DiskReadsPerSec + "," + $disk.DiskWritesPerSec + "," + $disk.CurrentDiskQueueLength >> $path

    }
start-sleep -seconds 5
}

Нагрузка на процессор для стресс тестирования

Запустить в нескольких консолях в зависимости от количества ядер в процессоре:

$result = 1; foreach ($number in 1..2147483647) {$result = $result * $number}

Тоже самое, с измерением выполнения:

Measure-Command {$result = 1; foreach ($number in 1..2147483647) {$result = $result * $number}}

Выставление приоритета для процесса

Function Set-PSPriority {
<#
  .SYNOPSIS
   Set the process priority of the current Powershell session
  .PARAMETER priority
   The priority as an integer value from -2 to 3.  -2 is the lowest, 0 is the default (normal) and 3 is the highest (which may require Administrator privilege)
  .PARAMETER processID
   The process ID that ill be change.  Omit to set the current powershell session.
  .PARAMETER silent
   Suppress the message at the end
  .EXAMPLE
   Set-PSPriority 2  
#>  
param (
[ValidateRange(-2,3)]
[Parameter(Mandatory=$true)]
[int]$priority,
[int]$processID = $pid,
[switch]$silent
)


    $priorityhash = @{-2="Idle";-1="BelowNormal";0="Normal";1="AboveNormal";2="High";3="RealTime"}


    (Get-Process -Id $processID).priorityclass = $priorityhash[$priority]

    if (!$silent) {
        Write-Host "Process ID [$processID] is now set to " + (Get-Process -Id $pid).priorityclass
    }

}

Установка описания компьютера

$OSValues = Get-WmiObject -class Win32_OperatingSystem -computername "C021"
$OSValues.Description = "Фамилия Имя Отчество"
$OSValues.put()

Удаленное выполнение консольной программы с параметрами

$result = Invoke-Command -ComputerName HV4 -ScriptBlock {
    "controller slot=0b physicaldrive all show detail" | & "C:\Program Files\HP\hpssacli\bin\hpssacli.exe"
}

$result

Утвержденные глаголы для команд Windows PowerShell (ссылка)

Утвержденные глаголы для команд Windows PowerShell

Approved Verbs for PowerShell Commands

Контрольная сумма файла

Get-FileHash C:\VM\Win10_1607_Russian_x64.iso -Algorithm MD5 | Format-List

Копирование файла из сессии powershell (Powershell -ge 5.0)

PS C:\Scripts> Get-PSSession

 Id Name            ComputerName    ComputerType    State         ConfigurationName     Availability
 -- ----            ------------    ------------    -----         -----------------     ------------
  5 Session5        localhost       RemoteMachine   Disconnected  Microsoft.PowerShell          None
  6 Session6        localhost       RemoteMachine   Disconnected  Microsoft.PowerShell          None
  7 Session7        localhost       RemoteMachine   Disconnected  Microsoft.PowerShell          None
  9 Session9        localhost       RemoteMachine   Opened        Microsoft.PowerShell     Available


PS C:\Scripts> $session0 = Get-PSSession -Name Session9
PS C:\Scripts> Copy-Item -FromSession $session0 C:\temp\shot.bmp -Destination C:\temp\shot.bmp

Список процессов запущеных пользователями

https://social.technet.microsoft.com/Forums/lync/en-US/45c541e0-fb49-4ac7-bcaf-738315a70863/getprocess-and-username?forum=winserverpowershell

$owners = @{}
gwmi win32_process |% {$owners[$_.handle] = $_.getowner().user}

get-process | select processname,Id,@{l="Owner";e={$owners[$_.id.tostring()]}}

Подключение ISO образа

Mount-DiskImage -ImagePath "C:\Hyper-V\ISO\WIN2012R2.iso"

Извлечение USB флеш-диска

$vol = get-wmiobject -Class Win32_Volume | where{$_.Name -eq 'F:\'}  
$vol.DriveLetter = $null  
$vol.Put()  
$vol.Dismount($false, $false)

Внешний публичный IP-адрес

$ipinfo = Invoke-RestMethod 'http://ipinfo.io/json'
$ipinfo.ip
$ipinfo.hostname
$ipinfo.city
$ipinfo.region
$ipinfo.country
$ipinfo.loc
$ipinfo.org

Проверка хэша

<#


Содержиоме файла ATM_Nautilus_all_02092018.md5:

95e4df02810a48d95b21996639e3b124 *ATM_Nautilus_all_02092018.7z
#>

$localFilePath = '\\l204\d$\Downloads\SBS\COMMERCIAL_OPERATION\IMAGES\NAUTILUS\ATM_Nautilus_all_02092018.7z'
$hashFilePath = '\\l204\d$\Downloads\SBS\COMMERCIAL_OPERATION\IMAGES\NAUTILUS\ATM_Nautilus_all_02092018.md5'

$remoteHash = (gc $hashFilePath).Split(" ")[0]
$localHashObj = Get-FileHash $localFilePath -Algorithm MD5
$localHash = ($localHashObj.Hash).ToLower()

if ($remoteHash -eq $localHash) {
    Write-Host "Совпал"
} else {
    Write-Host "Не совпал!"
}

Запуск не стартовавших автоматический запускаемых служб

(Get-Service | Select-Object -Property Name,Status,StartType | Where-Object {$_.Status -eq "Stopped" -and $_.StartType -eq "Automatic"}) | Start-Service