Powershell. Заметки на полях
01 Jan 2016
local_offer
powershell
local_offer
memo
В это посте буду записывать разные мелкие решения для удаленного управления с помощью 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
Список процессов запущеных пользователями
$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