PS-Commands
PS-Commands copied to clipboard
📚 Large base of PowerShell notes in Russian language (Сheat Sheet & Documentation).

ÐолÑÑÐ°Ñ Ð±Ð°Ð·Ð° замеÑок PowerShell на ÑÑÑÑком ÑзÑке.
ð¢ Habr: PowerShell и его возможноÑÑи
- Help
- Object
- npp
- Regex
- DataType
- Module
- Bit
- Cycle
- Files
- Credential
- WinEvent
- Firewall
- Defender
- WindowsUpdate
- DISM
- Scheduled
- Network
- RDP
- Shutdown
- LocalAccounts
- SMB
- ActiveDirectory
- repadmin
- dcdiag
- ntdsutil
- GPO
- ServerManager
- DNS
- DHCP
- DFS
- StorageReplica
- PS2EXE
- NSSM
- Jobs
- SMTP
- Hyper-V
- VMWare/PowerCLI
- Exchange/EMShell
- TrueNAS
- Veeam
- REST API
- Pode
- Selenium
- IE
- COM
- dotNET
- Console API
- Drawing
- ObjectEvent
- Sockets
- Base64
- Excel
- CSV
- XML
- JSON
- YAML
- HTML
- HtmlAgilityPack
- SQLite
- MySQL
- MSSQL
- InfluxDB
- Telegraf
- Elasticsearch
- CData
- ODBC
- PostgreSQL
- WMI
- Regedit
- Performance
- SNMP
- Zabbix
- pki
- OpenSSL
- OpenVPN
- Route
- NAT
- WireGuard
- VpnClient
- Proxy
- netsh
- OpenSSH
- WinRM
- PackageManagement
- NuGet
- Git
- GitHub
- DSC
- Ansible
- Win_Modules
- GigaChat
- YandexGPT
- SuperAGI
- Replicate
- Google-Filter
- Google-API
- RapidAPI
- TMDB
- OMDb
- ivi
- Kinopoisk
- VideoCDN
- Telegram
- Discord
- oh-my-posh
- Pester
- Pandoc
- FFmpeg
- ImageMagick
- Hugo
Help
Get-Verb дейÑÑвиÑ/глаголÑ, ÑÑвеÑжденнÑе Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² командлеÑаÑ
Get-Command *Language* поиÑк ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¿Ð¾ имени
(Get-Command Get-Language).Module ÑзнаÑÑ Ðº ÐºÐ°ÐºÐ¾Ð¼Ñ Ð¼Ð¾Ð´ÑÐ»Ñ Ð¿ÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°
Get-Command Get-Content | fl Module,DLL ÑзнаÑÑ Ð¿ÑинадлежноÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ðº модÑÐ»Ñ Ð¸ dll
Get-Command -Module LanguagePackManagement оÑобÑазиÑÑ ÑпиÑок команд Ñказанного модÑлÑ
(Get-Module LanguagePackManagement).ExportedCommands.Values оÑобÑазиÑÑ ÑпиÑок команд Ñказанного модÑлÑ
Get-Language | Get-Member оÑобÑазиÑÑ ÑпиÑок меÑодов ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ (дейÑÑвиÑ), обÑекÑÑ Ð²Ñвода и Event (ÑобÑÑÐ¸Ñ Ð¾Ð±ÑекÑов: Click)
(Get-Help Get-Service).Aliases ÑзнаÑÑ Ð¿Ñевдонимом командÑ
Get-Alias gsv ÑзнаÑÑ Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¿Ð¾ пÑевдонимÑ
Get-Help Get-Service ÑинÑакÑиÑ
Get-Help Get-Service -Parameter * опиÑание вÑеÑ
паÑамеÑÑов
Get-Help Get-Service -Online
Get-Help Get-Service -ShowWindow опиÑание паÑамеÑÑов в GUI Ñ ÑилÑÑÑаÑией
Show-Command вÑвеÑÑи ÑпиÑок команд в GUI
Show-Command Get-Service ÑпиÑок паÑамеÑÑов ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² GUI
Invoke-Expression iex пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑекÑÑ Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð² конÑоли как командÑ
$PSVersionTable веÑÑÐ¸Ñ PowerShell
Set-ExecutionPolicy Unrestricted
Get-ExecutionPolicy
$Metadata = New-Object System.Management.Automation.CommandMetaData (Get-Command Get-Service) полÑÑиÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ командлеÑе
[System.Management.Automation.ProxyCommand]::Create($Metadata) иÑÑ
однÑй код ÑÑнкÑии
Object
Variable
$var = Read-Host "Enter" ÑÑÑной ввод
$pass = Read-Host "Enter Password" -AsSecureString ÑкÑÑваÑÑ Ð½Ð°Ð±Ð¾Ñ
$global:path = "\\path" задаÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ Ð¿ÐµÑеменнÑÑ, напÑÐ¸Ð¼ÐµÑ Ð² ÑÑнкÑии
$using:srv иÑполÑзоваÑÑ Ð¿ÐµÑеменнÑÑ ÑекÑÑей ÑеÑÑи в Invoke-ÑеÑÑии
Get-Variable оÑобÑазиÑÑ Ð²Ñе пеÑеменнÑе
ls variable:/ оÑобÑазиÑÑ Ð²Ñе пеÑеменнÑе
Get-Variable *srv* найÑи пеÑеменнÑÑ Ð¿Ð¾ имени
Get-Variable -Scope Global оÑобÑазиÑÑ Ð²Ñе глобалÑнÑе пеÑеменнÑе
Get-Variable Error поÑледнÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° Ñ Ð¾Ñибкой
Remove-Variable -Name * оÑиÑÑиÑÑ Ð²Ñе пеÑеменнÑе
$LASTEXITCODE ÑодеÑÐ¶Ð¸Ñ ÐºÐ¾Ð´ вÑвода поÑледней запÑÑенной пÑогÑаммÑ, напÑÐ¸Ð¼ÐµÑ ping. ÐÑли код возвÑаÑа положиÑелÑнÑй (True), Ñо $LastExitCode = 0
ENV
Get-ChildItem Env: оÑобÑазиÑÑ Ð²Ñе пеÑеменнÑе окÑÑжениÑ
$env:PSModulePath диÑекÑоÑии импоÑÑа модÑлей
$env:userprofile
$env:computername
$env:username
$env:userdnsdomain
$env:logonserver
([DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).Name
[Environment]::GetFolderPath('ApplicationData')
History
Get-History иÑÑоÑÐ¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ ÑекÑÑей ÑеÑÑии
(Get-History)[-1].Duration.TotalSeconds вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñледней командÑ
(Get-PSReadLineOption).HistorySavePath пÑÑÑ Ðº ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð½Ð¾Ð¼Ñ ÑÐ°Ð¹Ð»Ñ Ñ 4096 поÑледниÑ
команд (из модÑÐ»Ñ PSReadLine)
Get-Content (Get-PSReadlineOption).HistorySavePath | Select-String Get поиÑк по ÑодеÑÐ¶Ð¸Ð¼Ð¾Ð¼Ñ Ñайла (GREP)
Set-PSReadlineOption -MaximumHistoryCount 10000 измениÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑоÑ
ÑанÑемÑÑ
команд в Ñайл
Get-PSReadLineOption | select MaximumHistoryCount
Set-PSReadlineOption -HistorySaveStyle SaveNothing оÑклÑÑиÑÑ Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ жÑÑнала
F2 пеÑеклÑÑиÑÑÑÑ Ñ InlineView на ListView
Clipboard
Set-Clipboard $srv ÑкопиÑоваÑÑ Ð² бÑÑÐµÑ Ð¾Ð±Ð¼ÐµÐ½Ð°
Get-Clipboard вÑÑавиÑÑ
Write
Write-Host -ForegroundColor Black -BackgroundColor Green "Test" -NoNewline
Write-Error Test
Foreach ($n in 1..100) {Write-Progress -Activity "Test Progress" -PercentComplete $n}
Array
$srv = @("server-01", "server-02") ÑоздаÑÑ Ð¼Ð°ÑÑив
$srv += @("server-03") добавиÑÑ Ð² маÑÑив новÑй ÑлеменÑ
$srv.Count оÑобÑазиÑÑ ÐºÐ¾Ð»-во ÑлеменÑов в маÑÑиве
Out-String поÑÑÑоÑнÑй вÑвод
Index
$srv[0] вÑвеÑÑи пеÑвое знаÑение ÑлеменÑа маÑÑива
$srv[0] = Name замена ÑлеменÑа в маÑÑиве
$srv[0].Length ÑзнаÑÑ ÐºÐ¾Ð»-во Ñимволов пеÑвого знаÑÐµÐ½Ð¸Ñ Ð² маÑÑиве
$srv[10..100] ÑÑез
$array = "a","b","c","d"
$num = 0
foreach ($a in $array) {
$num += 1
$index = [array]::IndexOf($array, $a) # ÑзнаÑÑ Ð½Ð¾Ð¼ÐµÑ Ð¸Ð½Ð´ÐµÐºÑа по заÑениÑ
$array[$index] = $num # пеÑеÑобÑаÑÑ Ð¸ÑÑ
однÑй маÑÑив
}
HashTable
$hashtable = @{"User" = "$env:username"; "Server" = "$env:computername"} # ÑоздаÑÑ
$hashtable += @{"User2" = "$env:username"; "Server2" = "$env:computername"} # добавиÑÑ ÐºÐ»ÑÑи
$hashtable.Keys # ÑпиÑок вÑеÑ
клÑÑей
$hashtable["User"] # полÑÑиÑÑ Ð·Ð½Ð°Ñение (Values) по клÑÑÑ
$hashtable["User"] = "Test" # измениÑÑ
$hashtable.Remove("User") # ÑдалиÑÑ ÐºÐ»ÑÑ
$Tag = @{$true = 'dev'; $false = 'prod'}[([System.Net.Dns]::GetHostEntry("localhost").HostName) -match '.*.TestDomain$']
Collections/List
$Collections = New-Object System.Collections.Generic.List[System.Object]
$Collections.Add([PSCustomObject]@{User = $env:username; Server = $env:computername})
PSCustomObject
$CustomObject = [PSCustomObject][ordered]@{User = $env:username; Server = $env:computername}
$CustomObject | Add-Member âMemberType NoteProperty âName Arr âValue @(1,2,3) # добавиÑÑ Property (ÑвойÑÑво/ÑÑобеÑ)
$CustomObject.Arr = @(1,3,5) # измениÑÑ ÑодеÑжимое
$CustomObject.PsObject.Properties.Remove('User') # ÑдалиÑÑ Property
Add-Member
$ScriptBlock = {Get-Service}
$CustomObject | Add-Member -Name "TestMethod" -MemberType ScriptMethod -Value $ScriptBlock # ÐобавиÑÑ Method
$CustomObject | Get-Member
$CustomObject.TestMethod()
Class
Class CustomClass {
[string]$User
[string]$Server
Start([bool]$Param1) {
If ($Param1) {Write-Host "Start Function"}}
}
$Class = New-Object -TypeName CustomClass
$Class.User = $env:username
$Class.Server = $env:computername
$Class.Start(1)
Pipeline
$obj | Add-Member -MemberType NoteProperty -Name "Type" -Value "user" -Force добавление обÑкÑа вÑвода NoteProperty
$obj | Add-Member -MemberType NoteProperty -Name "User" -Value "admin" -Force изменеие ÑодеÑжимого Ð´Ð»Ñ ÑÑÑноÑÑи обÑекÑа User
ping $srv | Out-Null пеÑенапÑавиÑÑ ÑезÑлÑÑÐ°Ñ Ð²Ñвода в Out-Null
Select-Object
Get-Process | Select-Object -Property * оÑобÑазиÑÑ Ð²Ñе доÑÑÑпнÑе обÑекÑÑ Ð²Ñвода
Get-Process | select -Unique "Name" ÑдалиÑÑ Ð¿Ð¾Ð²ÑоÑÑÑÑиеÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² маÑÑиве
Get-Process | select -ExpandProperty ProcessName пÑеобÑазоваÑÑ Ð¸Ð· обÑекÑа-коллекÑии в маÑÑив (вÑвеÑÑи ÑодеÑжимое без Ð½Ð°Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ñ ÑÑолбÑа)
(Get-Process | ? Name -match iperf).Modules ÑпиÑок иÑполÑзÑемÑÑ
модÑлей пÑоÑеÑÑом
Expression
ps | Sort-Object -Descending CPU | select -first 10 ProcessName, # ÑоÑÑиÑовка по CPU, вÑвеÑÑи пеÑвÑÑ
10 знаÑений (-first)
@{Name="ProcessorTime"; Expression={$_.TotalProcessorTime -replace "\.\d+$"}}, # заÑÑаÑено пÑоÑеÑÑоÑного вÑемени в минÑÑаÑ
@{Name="Memory"; Expression={[string]([int]($_.WS / 1024kb))+"MB"}}, # делим байÑÑ Ð½Ð° ÐÐ
@{Label="RunTime"; Expression={((Get-Date) - $_.StartTime) -replace "\.\d+$"}} # вÑÑеÑÑÑ Ð¸Ð· ÑекÑÑего вÑемени - вÑÐµÐ¼Ñ Ð·Ð°Ð¿ÑÑка, и ÑдалиÑÑ milisec
Select-String
$(ipconfig | Select-String IPv4) -replace ".+: " | Where-Object {$_ -match "^172."} ÑзнаÑÑ ÑолÑко IP
$Current_IP = Get-Content $RDCMan_RDG_PATH | Select-String $RDCMan_Display_Name -Context 0,1 полÑÑиÑÑ Ð´Ð²Ðµ ÑÑÑоки
$Current_IP = $Current_IP.Context.DisplayPostContext[0] -replace ".+<name>|<\/name>" забÑаÑÑ ÑолÑко вÑоÑÑÑ ÑÑÑÐ¾ÐºÑ Ð¸ ÑдалиÑÑ ÑÑги
Format-Table/Format-List
Get-Process | ft ProcessName, StartTime -Autosize авÑомаÑиÑеÑÐºÐ°Ñ Ð³ÑÑппиÑовка ÑазмеÑа ÑÑолбÑов
Measure-Object
Get-Process | Measure | select Count кол-во обÑекÑов
Get-Process | Measure -Line -Word -Character кол-во ÑÑÑок, Ñлов и Char обÑекÑов
Get-Process | Measure-Object PM -sum | Select-Object Count,@{Name="MEM_MB"; Expression={[int]($_.Sum/1mb)}} кол-во пÑоÑеÑÑов и обÑий обÑем занÑÑой памÑÑи в ÐÐайÑ
Compare-Object
Compare-Object -ReferenceObject (Get-Content -Path .\file1.txt) -DifferenceObject (Get-Content -Path .\file2.txt) ÑÑавнение двÑÑ
Ñайлов
$group1 = Get-ADGroupMember -Identity "Domain Admins"
$group2 = Get-ADGroupMember -Identity "Enterprise Admins"
Compare-Object -ReferenceObject $group1 -DifferenceObject $group2 -IncludeEqual
== Ð½ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹
<= еÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² $group1
=> еÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² $group2
Where-Object (?)
Get-Process | Where-Object {$_.ProcessName -match "zabbix"} ÑилÑÑÑаÑиÑ/поиÑк пÑоÑеÑÑов по имени ÑвойÑÑва обÑекÑа
Get-Process | where CPU -gt 10 | Sort-Object -Descending CPU вÑвеÑÑи обÑекÑÑ, где знаÑÐµÐ½Ð¸Ñ CPU болÑÑе 10
Get-Process | where WS -gt 200MB оÑобÑазиÑÑ Ð¿ÑоÑеÑÑÑ Ð³Ð´Ðµ WS вÑÑе 200ÐÐ
Get-Service | where Name -match "zabbix" поиÑк ÑлÑжбÑ
Get-Service -ComputerName $srv | Where {$_.Name -match "WinRM"} | Restart-Service пеÑезапÑÑÑиÑÑ ÑлÑÐ¶Ð±Ñ Ð½Ð° Ñдаленном компÑÑÑеÑе
(Get-Service).DisplayName вÑвеÑÑи знаÑÐµÐ½Ð¸Ñ ÑвойÑÑва маÑÑива
netstat -an | where {$_ -match 443}
netstat -an | ?{$_ -match 443}
(netstat -an) -match 443
Sort-Object
Get-Process | Sort-Object -Descending CPU | ft обÑаÑÐ½Ð°Ñ (-Descending) ÑоÑÑиÑовка по CPU
$path[-1..-10] обÑаÑÐ½Ð°Ñ ÑбоÑка маÑÑива без ÑоÑÑиÑовки
Last/First
Get-Process | Sort-Object -Descending CPU | select -First 10 вÑвеÑÑи пеÑвÑÑ
10 обÑекÑов
Get-Process | Sort-Object -Descending CPU | select -Last 10 вÑвеÑÑи поÑледниÑ
10 обÑекÑов
Group-Object
$Groups = Get-CimInstance -Class Win32_PnPSignedDriver |
Select-Object DriverProviderName, FriendlyName, Description, DriverVersion, DriverDate |
Group-Object DriverProviderName, FriendlyName, Description, DriverVersion, DriverDate
$(foreach ($Group in $Groups) {
$Group.Group[0]
}) | Format-Table
Error
$Error вÑÐ²Ð¾Ð´Ð¸Ñ Ð²Ñе оÑибки ÑекÑÑего ÑеанÑа
$Error[0].InvocationInfo ÑазвеÑнÑÑÑй оÑÑÐµÑ Ð¾Ð± оÑибке
$Error.clear()
$LASTEXITCODE ÑезÑлÑÑÐ°Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñледней ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ (0 - ÑÑпеÑ
)
exit 1 код завеÑÑениÑ, коÑоÑÑй возвÑаÑаеÑÑÑ $LASTEXITCODE
Property
$srv.Count кол-во ÑлеменÑов в маÑÑиве
$srv.Length ÑодеÑÐ¶Ð¸Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑво Ñимволом ÑÑÑоки пеÑеменной [string] или колиÑеÑÑво знаÑений (ÑÑÑок) обÑекÑа
$srv.Chars(2) оÑобÑазиÑÑ 3-й Ñимвол в ÑÑÑоке
$srv[2] оÑобÑазиÑÑ 3-Ñ ÑÑÑÐ¾ÐºÑ Ð² маÑÑиве
Method
$srv.Insert(0,"https://") добавиÑÑ Ð·Ð½Ð°Ñение пеÑед пеÑвÑм Ñимволом
$srv.Substring(4) ÑдалиÑÑ (из вÑего маÑÑива) пеÑвÑе 4 Ñимвола
$srv.Remove(3) ÑдалиÑÑ Ð¸Ð· вÑего маÑÑива вÑе поÑле 3 Ñимвола
$string = "123" ÑоздаÑÑ ÑÑÑокÑ
$int = [convert]::ToInt32($string) пÑеобÑазоваÑÑ ÑÑÑÐ¾ÐºÑ Ð² Ñип даннÑÑ
ÑиÑло
[string]::Concat($text,$num) обÑедениÑÑ Ð¿ÐµÑеменнÑе в Ð¾Ð´Ð½Ñ ÑÑÑокÑ
[string]::Join(":",$text,$num) обÑедениÑÑ Ð¸ÑполÑзÑÑ ÑазделиÑелÑ
[string]::Compare($text,$num,$true) вÑÐ´Ð°ÐµÑ 0 пÑи Ñовпадении или 1/-1 пÑи неÑовпадении, $true (без ÑÑеÑа ÑегиÑÑÑа) или $false (Ñ ÑÑеÑом ÑегиÑÑÑа)
[string]::Equals($text,$num) пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ ÑÑавнение двÑÑ
ÑÑÑок и вÑÐ´Ð°ÐµÑ $true пÑи иÑ
Ñовпадении или $false пÑи неÑовпадении
[string]::IsNullOrEmpty($text) пÑовеÑÑÐµÑ Ð½Ð°Ð»Ð¸Ñие ÑÑÑоки, еÑли ÑÑÑока пÑÑÑа $true, еÑли Ð½ÐµÑ $false
[string]::IsNullOrWhiteSpace($text2) пÑовеÑÑÐµÑ Ð½Ð° налиÑие ÑолÑко Ñимволов пÑобел, ÑабÑлÑÑÐ¸Ñ Ð¸Ð»Ð¸ Ñимвол новой ÑÑÑоки
DateTime
Get-TimeZone ÑаÑовой поÑÑ
[DateTime]::UtcNow вÑÐµÐ¼Ñ Ð² ÑоÑмаÑе UTC 0
(Get-Date).AddHours(-3)
$Date = (Get-Date -Format "dd/MM/yyyy hh:mm:ss")
$Date = Get-Date -f "dd/MM/yyyy" полÑÑаем Ñип даннÑÑ
[string]
[DateTime]$gDate = Get-Date "$Date" пÑеобÑазоваÑÑ Ð² Ñип [DateTime]
[int32]$days=($fDate-$gDate).Days полÑÑиÑÑ ÑазниÑÑ Ð² днÑÑ
"5/7/07" -as [DateTime] пÑеобÑазоваÑÑ Ð²Ñ
однÑе даннÑе в Ñип даннÑÑ
[DateTime]
New-TimeSpan -Start $VBRRP.CreationTimeUTC -End $VBRRP.CompletionTimeUTC полÑÑиÑÑ ÑазниÑÑ Ð²Ð¾ вÑемени
Measure-Command
(Measure-Command {ping ya.ru}).TotalSeconds ÑзнаÑÑ ÑолÑко вÑÐµÐ¼Ñ Ð²ÑполнениÑ
(Get-History)[-1] | select @{Name="RunTime"; Expression={$_.EndExecutionTime - $_.StartExecutionTime}},ExecutionStatus,CommandLine поÑÑиÑаÑÑ Ð²ÑÐµÐ¼Ñ ÑабоÑÑ Ð¿Ð¾Ñледней [-1] (select -Last 1) вÑполненной ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¸ ÑзнаÑÑ ÐµÐµ ÑÑаÑÑÑ
Timer
$start_time = Get-Date заÑикÑиÑоваÑÑ Ð²ÑÐµÐ¼Ñ Ð´Ð¾ вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ
$end_time = Get-Date заÑикÑиÑоваÑÑ Ð²ÑÐµÐ¼Ñ Ð¿Ð¾ завеÑÑениÑ
$time = $end_time - $start_time вÑÑÑиÑаÑÑ Ð²ÑÐµÐ¼Ñ ÑабоÑÑ ÑкÑипÑа
$min = $time.minutes
$sec = $time.seconds
Write-Host "$min минÑÑ $sec ÑекÑнд"
$timer = [System.Diagnostics.Stopwatch]::StartNew() запÑÑÑиÑÑ ÑаймеÑ
$timer.IsRunning ÑÑаÑÑÑ ÑабоÑÑ ÑаймеÑа
$timer.Elapsed.TotalSeconds оÑобÑазиÑÑ Ð²ÑÐµÐ¼Ñ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа запÑÑка (в ÑекÑндаÑ
)
$timer.Stop() оÑÑановиÑÑ ÑаймеÑ
npp
pwsh -NoExit -ExecutionPolicy Unrestricted -WindowStyle Maximized -File "$(FULL_CURRENT_PATH)"
%AppData%\Notepad++ themes/shortcuts.xml \
<?xml version="1.0" encoding="UTF-8" ?>
<NotepadPlus>
<InternalCommands />
<Macros>
<Macro name="`+\+>" Ctrl="yes" Alt="no" Shift="no" Key="190">
<Action type="0" message="2453" wParam="0" lParam="0" sParam="" />
<Action type="1" message="2170" wParam="0" lParam="0" sParam="`" />
<Action type="0" message="2451" wParam="0" lParam="0" sParam="" />
<Action type="0" message="2451" wParam="0" lParam="0" sParam="" />
<Action type="1" message="2170" wParam="0" lParam="0" sParam=" " />
<Action type="1" message="2170" wParam="0" lParam="0" sParam="\" />
<Action type="0" message="2300" wParam="0" lParam="0" sParam="" />
</Macro>
</Macros>
<UserDefinedCommands>
<Command name="PowerShell7" Ctrl="no" Alt="yes" Shift="no" Key="116">pwsh -NoExit -ExecutionPolicy Unrestricted -WindowStyle Maximized -File "$(FULL_CURRENT_PATH)"</Command>
</UserDefinedCommands>
<PluginCommands />
<ScintillaKeys />
</NotepadPlus>
Parsing text to Markdown:
Macros: FnLeft+'+FnRight+FnRight+\s\\+Down
Replace: "# ","'"
. # ÐбознаÑÐ°ÐµÑ Ð»Ñбой Ñимвол
\ # ÐкÑаниÑÑÑÑий Ñимвол. Ð¡Ð¸Ð¼Ð²Ð¾Ð»Ñ ÐºÐ¾ÑоÑÑе ÑкÑаниÑÑÑÑÑÑ: ^, [, ., $, {, *, (, ), \, +, |, ?, <, >
^ # ÐаÑало ÑÑÑоки
$ # ÐÐ¾Ð½ÐµÑ ÑÑÑоки
\n # ÐÐ¾Ð²Ð°Ñ ÑÑÑока
\d # ÐÑÐ±Ð°Ñ ÑиÑÑа
\D # Ðе ÑиÑÑа
\w # ÐÑÐ±Ð°Ñ Ð±Ñква лаÑиниÑÑ, ÑиÑÑа, или знак подÑÑÑкиваниÑ
\W # Ðе лаÑиниÑа, не ÑиÑÑа, не подÑÑÑкивание
\s # ÐÑобел, ÑабÑлÑÑиÑ, пеÑÐµÐ½Ð¾Ñ ÑÑÑоки
\S # Ðе пÑобел
\b # ÐÑаниÑа Ñлова. ÐÑименÑеÑÑÑ ÐºÐ¾Ð³Ð´Ð° нÑжно вÑделиÑÑ, ÑÑо иÑкомÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ÑвлÑÑÑÑÑ Ñловом, а не ÑаÑÑÑÑ Ð´ÑÑгого Ñлова
\B # Ðе гÑаниÑа Ñлова
\< # ÐаÑало Ñлова
\> # ÐÐ¾Ð½ÐµÑ Ñлова
\A # ÐаÑало ÑекÑÑа
\Z # ÐÐ¾Ð½ÐµÑ ÑекÑÑа
* # ÐовÑоÑиÑелÑ. ÐзнаÑÐ°ÐµÑ ÑÑо пÑедÑеÑÑвÑÑÑий Ñимвол Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ 0 и более Ñаз
+ # ÐолиÑеÑÑво пÑедÑеÑÑвÑÑÑего не менее 1-го.
? # ÐгÑаниÑиÑелÑ. Ðе более одного Ñаза
| # Ðли. СоединÑÐµÑ Ð½ÐµÑколÑко ваÑианÑов
() # РкÑÑглÑе Ñкобки заклÑÑаÑÑÑÑ Ð²Ñе комбинаÑии Ñ "или" и поиÑк наÑала и конÑа ÑÑÑок
[ ] # РквадÑаÑнÑÑ
ÑкобкаÑ
задаÑÑÑÑ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ðº поиÑкÑ, напÑÐ¸Ð¼ÐµÑ [a-ÑÐ-Я], или [0-9]
[^ ] # ÐÑклÑÑÐ°ÐµÑ Ð¸Ð· поиÑка ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ÑказаннÑе в квадÑаÑнÑÑ
ÑкобкаÑ
{ } # Ð ÑигÑÑнÑÑ
ÑкобкаÑ
ÑказÑваеÑÑÑ ÑоÑное колиÑеÑÑво вÑ
ождений
\d{2} # ÐайÑи две ÑиÑÑÑ
\d{2,4} # ÐайÑи две или ÑеÑÑÑе
{4,} # ÐайÑи ÑеÑÑÑе и более
^\s{1,}#.+` поиÑк внаÑале ÑÑÑоки комменÑаÑÐ¸Ñ Ð¸ пÑобел поÑле него 1 или болÑÑе и лÑбое кол-во Ñимволов
Regex
-replace "1","2" замена ÑлеменÑов в индекÑаÑ
маÑÑива (везде где пÑиÑÑÑÑÑвÑÐµÑ 1, замениÑÑ Ð½Ð° 2), Ð´Ð»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸ÑполÑзÑеÑÑÑ ÑолÑко пеÑвое знаÑение
-split " " пÑеобÑазоваÑÑ ÑÑÑÐ¾ÐºÑ Ð² маÑÑив, ÑазделиÑелем Ñказан пÑобел, коÑоÑой ÑдалÑеÑÑÑ ($url.Split("/")[-1])
-join " " пÑеобÑазоваÑÑ Ð¼Ð°ÑÑив (коллекÑиÑ) в единÑÑ ÑÑÑÐ¾ÐºÑ (string), добавиÑÑ ÑазделиÑелем пÑобел \
-like *txt* поиÑк по маÑкам wildcard, вÑÐ²Ð¾Ð´Ð¸Ñ Ð·Ð½Ð°Ñение на ÑкÑан
-match txt поиÑка по Ñаблонам, пÑовеÑка на ÑооÑвеÑÑÑвие ÑодеÑжимого ÑекÑÑа
-match "zabbix|rpc" ÑÑловиÑ, Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка по неÑколÑким Ñловам
-NotMatch пÑовеÑка на оÑÑÑÑÑÑвие вÑ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ \
Matches
$ip = "192.168.10.1"
$ip -match "(\.\d{1,3})\.\d{1,2}" True
$Matches оÑобÑазиÑÑ Ð²Ñе подÑ
одÑÑие пеÑеменнÑе поÑледнего поиÑка, коÑоÑÑе вÑ
одÑÑ Ð¸ не вÑ
одÑÑ Ð² гÑÑÐ¿Ð¿Ñ ()
$String = "09/14/2017 12:00:27 - mtbill_post_201709141058.txt 7577_Delivered: OK"
$String -Match ".*(?=\.txt)" | Out-Null
$Matches[0][-4..-1] -Join ""
$string.Substring($string.IndexOf(".txt")-4, 4) 2-й ваÑÐ¸Ð°Ð½Ñ (IndexOf)`
ФоÑмаÑиÑование (.NET method format)
[string]::Format("{1} {0}","Index0","Index1")
"{1} {0}" -f "Index0","Index1"
"{0:###-##-##}" -f 1234567 запиÑаÑÑ ÑиÑло в дÑÑгом ÑоÑмаÑе (#)
"{0:0000}" -f 123 вÑвеÑÑи ÑиÑло в ÑоÑмаÑе не менÑÑе 4 знаков (0123)
"{0:P0}" -f (220/1000) поÑÑиÑаÑÑ Ð² пÑоÑенÑаÑ
(P)
"{0:P}" -f (512MB/1GB) ÑколÑко % ÑоÑÑавлÑÐµÑ 512Ðб Ð¾Ñ 1Ðб
"{0:0.0%}" -f 0.123 ÑмножиÑÑ Ð½Ð° 100%
$gp = Get-Process | sort cpu -Descending | select -First 10
foreach ($p in $gp) {
"{0} - {1:N2}" -f $p.processname, $p.cpu # окÑÑглиÑÑ
}
УÑловнÑй опеÑаÑоÑ
$rh = Read-Host
if ($rh -eq 1) {ipconfig} elseif ($rh -eq 2) {getmac} else {hostname}
ÐÑли ÑÑловие if () ÑвлÑеÑÑÑ Ð¸ÑÑеннÑм ($True), вÑполниÑÑ Ð´ÐµÐ¹ÑÑвие в {}
ÐÑли ÑÑловие if () ÑвлÑеÑÑÑ Ð»Ð¾Ð¶Ð½Ñм ($False), вÑполниÑÑ Ð´ÐµÐ¹ÑÑвие не обÑзаÑелÑного опеÑаÑоÑа else
УÑловие Elseif идÑÑ Ð¿Ð¾Ñле ÑÑÐ»Ð¾Ð²Ð¸Ñ if Ð´Ð»Ñ Ð¿ÑовеÑки дополниÑелÑнÑÑ
ÑÑловий пеÑед вÑполнение опеÑаÑоÑа else. ÐпеÑаÑоÑ, коÑоÑÑй пеÑвÑй веÑÐ½ÐµÑ $True, оÑÐ¼ÐµÐ½Ð¸Ñ Ð²Ñполнение ÑледÑÑÑиÑ
дополниÑелÑнÑÑ
ÑÑловий
ÐÑли пеÑедаÑÑ Ð¿ÐµÑеменнÑÑ Ð² ÑÑловие без опеÑаÑоÑа, Ñо бÑÐ´ÐµÑ Ð¿ÑовеÑÑÑÑÑÑ Ð½Ð°Ð»Ð¸Ñие знаÑÐµÐ½Ð¸Ñ Ñ Ð¿ÐµÑеменной на $True/$False
if ((tnc $srv -Port 80).TcpTestSucceeded) {"Opened port"} else {"Closed port"}
ÐпеÑаÑоÑÑ
-eq Ñавно (equal)
-ceq ÑÑиÑÑваÑÑ ÑегиÑÑÑ
-ne не Ñавно (not equal)
-gt болÑÑе (greater)
-ge болÑÑе или Ñавно
-lt менÑÑе (less)
-le менÑÑе или Ñавно
-in пÑовеÑиÑÑ Ð½Ð° налиÑие (5 -in @(1,2,3,4,5))
-NOT логиÑеÑкое ÐÐТ !(Test-Path $path)
-and логиÑеÑкое Ð
-or логиÑеÑкое ÐÐÐ
if ((($1 -eq 1) -and ($2 -eq 2)) -or ($1 -ne 3)) {"$true"} else {"$false"} два ÑÑловиÑ: (еÑли $1 = 1 и $2 = 2) или $1 не Ñавно 3
Pipeline Operators
Write-Output "First" && Write-Output "Second" две ÑÑпеÑнÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð²ÑполнÑÑÑÑÑ
Write-Error "Bad" && Write-Output "Second" пеÑÐ²Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° завеÑÑаеÑÑÑ Ð¾Ñибкой, из-за Ñего вÑоÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° не вÑполнÑеÑÑÑ
Write-Error "Bad" || Write-Output "Second" пеÑÐ²Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° завеÑÑаеÑÑÑ Ð¾Ñибкой, поÑÑÐ¾Ð¼Ñ Ð²ÑполнÑеÑÑÑ Ð²ÑоÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°
Write-Output "First" || Write-Output "Second" пеÑÐ²Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° вÑполнена ÑÑпеÑно, поÑÑÐ¾Ð¼Ñ Ð²ÑоÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° не вÑполнÑеÑÑÑ
Invocation Operator
$addr = "8.8.8.8"
$ping = "ping"
& $ping $addr запÑÑÐºÐ°ÐµÑ ÑекÑÑ ÐºÐ°Ðº командÑ
& $ping $addr & запÑÑÑиÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² Ñоне
(Get-Job)[-1] | Receive-Job -Keep
СпеÑиалÑнÑе ÑимволÑ
\d ÑиÑло Ð¾Ñ 0 до 9 (20-07-2022 ÑквиваленÑ: "\d\d-\d\d-\d\d\d\d")
\D обознаÑÐ°ÐµÑ Ð»Ñбой Ñимвол, кÑоме ÑиÑÑÑ. Ð£Ð´Ð°Ð»ÐµÐ½Ð¸Ñ Ð²ÑеÑ
Ñимволов, кÑоме ÑиÑÑ: [int]$("123 test" -replace "\D")
\w бÑква Ð¾Ñ "a" до "z" и Ð¾Ñ "A" до "Z" или ÑиÑло Ð¾Ñ 0 до 9
\s пÑобел, ÑквиваленÑ: " "
\n Ð½Ð¾Ð²Ð°Ñ ÑÑÑока
\b маÑка, опÑеделÑÐµÑ Ð½Ð°Ñало и ÐºÐ¾Ð½ÐµÑ Ñелого ÑловоÑоÑеÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка
. обознаÑÐ°ÐµÑ Ð»Ñбой Ñимвол, кÑоме новой ÑÑÑоки
\ ÑкÑаниÑÑÐµÑ Ð»Ñбой ÑпеÑиалÑÐ½Ñ Ñимвол (меÑаÑимвол). ÐÑполÑзÑеÑÑÑ, еÑли нÑжно ÑказаÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑй Ñимвол, вмеÑÑо ÑпеÑиалÑного ({ } [ ] / \ + * . $ ^ | ?)
+ повÑоÑÑеÑÑÑ 1 и более Ñаз (\s+)
{1,25} кванÑиÑикаÑоÑ, ÑказÑÐ²Ð°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво повÑоÑений Ñимвола Ñлева на пÑаво (Ð¾Ñ 1 до 25 Ñаз)
[] поиÑк ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð»Ñбой бÑквÑ, напÑимеÑ, [A-z0-9] Ð¾Ñ A до z и ÑиÑÑÑ Ð¾Ñ 0 до 9 ("192.168.1.1" -match "192.1[6-7][0-9]")
ЯкоÑи
^ или \A опÑеделÑÐµÑ Ð½Ð°Ñало ÑÑÑоки. $url -replace '^','https:'добавиÑÑ Ð² наÑало; \$или\ZобознаÑаÑÑ ÐºÐ¾Ð½ÐµÑ ÑÑÑоки. $ip -replace "\d{1,3}$","0" \(?=text)поиÑк Ñлова Ñлева. ÐиÑем Ñлева на пÑаво Ð¾Ñ Ð¸Ñкомого (иÑÐµÑ ÑолÑко ÑелÑе ÑловоÑоÑеÑаниÑ) "Server:\s(.{1,30})\s(?=$username)" \(?<=text) поиÑк Ñлова ÑпÑава. $in_time -replace ".+(?<=Last)" ÑдалиÑÑ Ð²Ñе до Ñлова Last
(?!text) не ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñо Ñловом Ñлева
(?<!text) не ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñо Ñловом ÑпÑава
$test = "string"
$test -replace ".{1}$" ÑдалиÑÑ Ð»Ñбое кол-во Ñимволов в конÑе ÑÑÑоки
$test -replace "^.{1}" ÑдалиÑÑ Ð»Ñбое кол-во Ñимволов в наÑале ÑÑÑоки \
ÐÑÑÐ¿Ð¿Ñ Ð·Ð°Ñ Ð²Ð°Ñа
$date = '12.31.2021'
$date -replace '^(\d{2}).(\d{2})','$2.$1' поменÑÑÑ Ð¼ÐµÑÑами
$1 ÑодеÑжимое пеÑвой гÑÑÐ¿Ð¿Ñ Ð² ÑкобкаÑ
$2 ÑодеÑжимое вÑоÑой гÑÑппÑ
DataType
$srv.GetType() ÑзнаÑÑ Ñип даннÑÑ
$srv -is [string] пÑовеÑка на ÑооÑвеÑÑÑвие Ñипа даннÑÑ
$srv -isnot [System.Object] пÑовеÑка на неÑооÑвеÑÑÑвие
[Object] маÑÑив (BaseType:System.Array)
[DateTime] ÑоÑÐ¼Ð°Ñ Ð²Ñемени (BaseType:System.ValueType)
[Bool]/[Boolean] логиÑеÑкое знаÑение ($True/$False) или 1/0 (1 биÑ) налиÑие/оÑÑÑÑÑвие напÑÑжениÑ
[Byte] 8-биÑное (1 байÑ) Ñелое ÑиÑло без знака (0..255)
[Int16] 16-биÑное знаковое Ñелое ÑиÑло Ð¾Ñ -32767 до 32767 (Ñип даннÑÑ
WORD 0..65535)
[Int] 32-биÑное (4 байÑа) знаковое Ñелое ÑиÑло Ð¾Ñ â2147483648 до 2147483647 (DWORD)
[Int64] 64-биÑное Ð¾Ñ -9223372036854775808 до 9223372036854775808 (LWORD)
[Decimal] 128-биÑное деÑÑÑиÑное знаÑение Ð¾Ñ â79228162514264337593543950335 до 79228162514264337593543950335
[Single] ÑиÑло Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей запÑÑой (32-ÑазÑÑдное)
[Double] ÑиÑло Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей запÑÑой Ñ Ð´Ð²Ð¾Ð¹Ð½Ð¾Ð¹ ÑоÑноÑÑÑÑ (64-ÑазÑÑдное)
[String] неизменÑÐµÐ¼Ð°Ñ ÑÑÑока Ñимволов Юникода ÑикÑиÑованной Ð´Ð»Ð¸Ð½Ñ (BaseType:System.Object)
Math
[math] | Get-Member -Static
[math]::Pow(2,4) 2 в 4 ÑÑепени
[math]::Truncate(1.8) гÑÑбое окÑÑгление, ÑдалÑÐµÑ Ð´ÑобнÑÑ ÑаÑÑÑ
[math]::Ceiling(1.8) окÑÑглÑÐµÑ ÑиÑло в болÑÑÑÑ ÑÑоÑÐ¾Ð½Ñ Ð´Ð¾ ближайÑего Ñелого знаÑениÑ
[math]::Floor(-1.8) окÑÑглÑÐµÑ ÑиÑло в менÑÑÑÑ ÑÑоÑонÑ
[math]::Min(33,22) возвÑаÑÐ°ÐµÑ Ð½Ð°Ð¸Ð¼ÐµÐ½ÑÑее знаÑение двÑÑ
знаÑений
[math]::Max(33,22) возвÑаÑÐ°ÐµÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÑÑее знаÑение двÑÑ
знаÑений
Round
[double]::Round(87.5, 0) 88 (неÑеÑное), в .NET по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ÑполÑзÑеÑÑÑ Ð¾ÐºÑÑгление в ÑÑедней ÑоÑке ToEven, где *.5 знаÑÐµÐ½Ð¸Ñ Ð¾ÐºÑÑглÑÑÑÑÑ Ð´Ð¾ ближайÑего ÑеÑного Ñелого ÑиÑла.
[double]::Round(88.5, 0) 88 (ÑеÑное)
[double]::Round(88.5, 0, 1) 89 (окÑÑглÑÑÑ Ð² болÑÑÑÑ ÑÑоÑонÑ)
[double]::Round(1234.56789, 2) окÑÑглиÑÑ Ð´Ð¾ 2 Ñимволов поÑле запÑÑой
ToString
(4164539/1MB).ToString("0.00") ÑазделиÑÑ Ð½Ð° Ð´Ð²Ð°Ð¶Ð´Ñ Ð½Ð° 1024/1024 и окÑÑглиÑÑ Ð´Ð¾ 3,97
Char
[Char] cимвол Юникода (16-ÑазÑÑднÑй)
$char = $srv.ToCharArray() ÑазбиÑÑ ÑÑÑÐ¾ÐºÑ [string] на маÑÑив [System.Array] из бÑкв \
Module
psd1
@{
RootModule = "Get-Function.psm1"
ModuleVersion = "0.1"
Author = "Lifailon"
CompanyName = "Open Source Community"
Copyright = "Apache-2.0"
Description = "Function example"
PowerShellVersion = "7.2"
PrivateData = @{
PSData = @{
Tags = @("Function","Example")
ProjectUri = "https://github.com/Lifailon/PS-Commands"
LicenseUri = "https://github.com/Lifailon/Console-Translate/blob/rsa/LICENSE"
ReleaseNotes = "Second release"
}
}
}
psm1
function Get-Function {
<#
.SYNOPSIS
ÐпиÑание
.DESCRIPTION
ÐпиÑание
.LINK
https://github.com/Lifailon/PS-Commands
#>
param (
[Parameter(Mandatory,ValueFromPipeline)][string]$Text,
[ValidateSet("Test1","Test2")][string]$Provider = "Test1",
[ValidateRange(1,3)][int]$Number = 2,
[Switch]$Switch
)
Write-Host Param Text: $Text
Write-Host Param Provider: $Provider
Write-Host Param Number: $Number
Write-Host Param Switch: $Switch
}
Get-Function Test
Switch
$MMM = Get-Date -UFormat "%m"
switch($MMM) {
"01" {$Month = 'Jan'}
"02" {$Month = 'Feb'}
"03" {$Month = 'Mar'}
"04" {$Month = 'Apr'}
"05" {$Month = 'May'}
"06" {$Month = 'Jun'}
"07" {$Month = 'Jul'}
"08" {$Month = 'Aug'}
"09" {$Month = 'Sep'}
"10" {$Month = 'Oct'}
"11" {$Month = 'Nov'}
"12" {$Month = 'Dec'}
}
function switch
Function fun-switch (
[switch]$param
) {
If ($param) {"yes"} else {"no"}
}
fun-switch -param
Bit
ÐвоиÑное ÐеÑÑÑиÑное
1 1
10 2
11 3
100 4
101 5
110 6
111 7
1000 8
1001 9
1010 10
1011 11
1100 12
1101 13
1110 14
1111 15
1 0000 16
ÐвоиÑное ÐеÑÑÑиÑное ÐÐ¾Ð¼ÐµÑ ÑазÑÑда
1 1 0
10 2 1
100 4 2
1000 8 3
1 0000 16 4
10 0000 32 5
100 0000 64 6
1000 0000 128 7
1 0000 0000 256 8
Ðз двоиÑного => деÑÑÑиÑное (1-й ваÑÐ¸Ð°Ð½Ñ Ð¿Ð¾ ÑаблиÑе)
1001 0011 = 1000 0000 + 1 0000 + 10 + 1 = 128 + 16 + 2 + 1 = 147
2-й ваÑианÑ
7654 3210 (ÑазÑÑÐ´Ñ Ð´Ð²Ð¾Ð¸Ñного вÑÑажениÑ) = (1*2^7)+(0*2^6)+(0*2^5)+(1*2^4)+(0*2^3)+(0*2^2)+(1*2^1)+(1*2^0) = 147
[math]::Pow(2,7) + [math]::Pow(2,4) + [math]::Pow(2,1) + [math]::Pow(2,0) = 147` иÑклÑÑиÑÑ 0 и ÑложиÑÑ ÑÑепенÑ
Ðз деÑÑÑиÑного => двоиÑное (1-й ваÑÐ¸Ð°Ð½Ñ Ð¿Ð¾ ÑаблиÑе)
347 вÑÑеÑÑÑ Ð±Ð»Ð¸Ð¶Ð°Ð¹Ñие 256 = 91 (+ 1 0000 0000 забÑаÑÑ Ð´Ð²Ð¾Ð¸ÑнÑй оÑÑаÑок)
91 - 64 = 27 ближайÑее 16 (+ 100 0000)
27 - 16 = 11 ближайÑее 8 (+ 1 0000)
11 - 8 = 3 ближайÑее 2 (+ 1000)
3 - 2 = 1 (+ 10)
1 - 1 = 0 (+ 1)
1 0101 1011
2-й ваÑианÑ
ÐоÑледоваÑелÑное Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÑиÑла на 2, пÑедвоÑиÑелÑно забиÑÐ°Ñ Ð¾ÑÑаÑок Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑеÑного ÑиÑла в менÑÑÑÑ ÑÑоÑонÑ
347 - 346 = оÑÑаÑок 1, (347-1)/2 = 173
173 - 172 = оÑÑаÑок 1, (172-1)/2 = 86
86 - 86 = оÑÑаÑок 0, 86/2 = 43
43 - 42 = оÑÑаÑок 1, (43-1)/2 = 21
21 - 20 = оÑÑаÑок 1, (21-1)/2 = 10
10 - 10 = оÑÑаÑок 0, 10/2 = 5
5 - 4 = оÑÑаÑок 1, (5-1)/2 = 2
2 - 2 = оÑÑаÑок 0, 2/2 = 1
1 - 2 = оÑÑаÑок 1, (1-1)/2 = 0
РезÑлÑÑÐ°Ñ Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸ÑÑваеÑÑÑ ÑÐ½Ð¸Ð·Ñ Ð²Ð²ÐµÑÑ
Bit Convertor
function ConvertTo-Bit {
param (
[Int]$int
)
[array]$bits = @()
$test = $true
while ($test -eq $true) {
if (($int/2).GetType() -match [double]) {
$int = ($int-1)/2
[array]$bits += 1
}
elseif (($int/2).GetType() -match [int]) {
$int = $int/2
[array]$bits += 0
}
if ($int -eq 0) {
$test = $false
}
}
$bits = $bits[-1..-999]
([string]($bits)) -replace "\s"
}
ConvertTo-Bit 347
function ConvertFrom-Bit {
param (
$bit
)
[int]$int = 0
$bits = $bit.ToString().ToCharArray()
$index = ($bits.Count)-1
foreach ($b in $bits) {
if ($b -notlike 0) {
$int += [math]::Pow(2,$index)
}
$index -= 1
}
$int
}
ConvertFrom-Bit 10010011
Get-Process pwsh | fl ProcessorAffinity пÑивÑзка пÑоÑеÑÑа к ÑдÑам, пÑедÑÑавлÑÐµÑ Ð¸Ð· ÑÐµÐ±Ñ Ð±Ð¸ÑовÑÑ Ð¼Ð°ÑÐºÑ (bitmask), где ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð±Ð¸ÑÑ ÑооÑвеÑÑÑвÑÐµÑ ÑдÑо пÑоÑеÑÑоÑа. ÐÑли Ð´Ð»Ñ ÑдÑа оÑмеÑено ÑÑ
одÑÑво (affinity), Ñо Ð±Ð¸Ñ Ð²ÑÑÑавлÑеÑÑÑ Ð² 1, еÑли Ð½ÐµÑ â Ñо в 0. ÐапÑимеÑ, еÑли вÑбÑÐ°Ð½Ñ Ð²Ñе 16 ÑдеÑ, Ñо ÑÑо 1111 1111 1111 1111 или 65535.
(Get-Process pwsh).ProcessorAffinity = 15 0000000000001111 пÑиÑвоиÑÑ 4 пеÑвÑÑ
ÑдÑа
(Get-Process pwsh).ProcessorAffinity = 61440 1111000000000000 пÑиÑвоиÑÑ 4 поÑледниÑ
ÑдÑа
(Get-Process pwsh).ProcessorAffinity = (ConvertFrom-Bit 1111000000000000)
Cycle
Foreach
$list = 100..110 ÑоздаÑÑ Ð¼Ð°ÑÑив из ÑиÑÑ Ð¾Ñ 100 до 110
foreach ($srv in $list) {ping 192.168.3.$srv -n 1 -w 50} $srv Ñ
ÑÐ°Ð½Ð¸Ñ ÑекÑÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸Ð· $list и повÑоÑÑÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð´Ð¾ поÑледнего ÑлеменÑа в маÑÑиве
$foreach.Current ÑекÑÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² Ñикле
$foreach.Reset() обнÑлÑÐµÑ Ð¸ÑеÑаÑиÑ, пеÑÐµÐ±Ð¾Ñ Ð½Ð°ÑнеÑÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾, ÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº беÑконеÑÐ½Ð¾Ð¼Ñ ÑиклÑ
$foreach.MoveNext() пеÑеÑ
од к ÑледÑÑÑÐµÐ¼Ñ ÑлеменÑÑ Ð² Ñикле
ForEach-Object (%)
100..110 | %{ping -n 1 -w 50 192.168.3.$_ > $null
if ($LastExitCode -eq 0) {Write-Host "192.168.3.$_" -ForegroundColor green
} else {
Write-Host "192.168.3.$_"-ForegroundColor Red}}
% # пеÑедаÑÑ Ñикл ÑеÑез ÐºÐ¾Ð½Ð²ÐµÐµÑ (ForEach-Object)
$_ # пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñикла и конвееÑа ($PSItem)
gwmi Win32_QuickFixEngineering | where {$_.InstalledOn.ToString() -match "2022"} | %{($_.HotFixID.Substring(2))} # gwmi ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð¼Ð°ÑÑив, вÑвод ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¿ÐµÑедаеÑÑÑ where Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка подÑ
одÑÑиÑ
под кÑиÑеÑии обÑекÑов. Ðо конвееÑÑ Ð¿ÐµÑедаеÑÑÑ Ð² Ñикл Ð´Ð»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑвÑÑ
(2) Ñимволов меÑодом Substring из вÑеÑ
обÑекÑов HotFixID.
While
$srv = "yandex.ru"
$out2 = "ÐÑÑÑ Ð¿Ð¸Ð½Ð³"
$out3 = "ÐÐµÑ Ð¿Ð¸Ð½Ð³Ð°"
$out = $false # пÑедваÑиÑелÑно ÑбÑоÑиÑÑ Ð¿ÐµÑеменнÑÑ, While пÑовеÑÑÐµÑ ÑÑловие до запÑÑка Ñикла
While ($out -eq $false){ # пока ÑÑловие ÑвлÑеÑÑÑ $true, Ñикл бÑÐ´ÐµÑ Ð¿Ð¾Ð²ÑоÑÑÑÑÑÑ
$out = ping -n 1 -w 50 $srv
if ($out -match "ttl") {$out = $true; $out2} else {$out = $false; $out3; sleep 1}
}
while ($True){ # запÑÑÑиÑÑ Ð±ÐµÑконеÑнÑй Ñикл
$result = ping yandex.ru -n 1 -w 50
if ($result -match "TTL"){ # ÑÑловие, пÑи коÑоÑом бÑÐ´ÐµÑ Ð²Ñполнен break
Write-Host "Ð¡Ð°Ð¹Ñ Ð´Ð¾ÑÑÑпен"
break # оÑÑÐ°Ð½Ð¾Ð²Ð¸Ñ Ñикл
} else {Write-Host "Ð¡Ð°Ð¹Ñ Ð½ÐµÐ´Ð¾ÑÑÑпен"; sleep 1}
}
Try-Catch-Finally
Try {$out = pping 192.168.3.1}
Catch {Write-Warning "$($error[0])"} # вÑÐ²Ð¾Ð´Ð¸Ñ Ð² ÑлÑÑае оÑибки (вмеÑÑо оÑибки)
finally {$out = "End"} # вÑполнÑеÑÑÑ Ð² конÑе в лÑбом ÑлÑÑае
Files
$file = [System.IO.File]::Create("$home\desktop\test.txt") ÑоздаÑÑ Ñайл
$file.Close() закÑÑÑÑ Ñайл
[System.IO.File]::ReadAllLines("$home\desktop\test.txt") пÑоÑиÑаÑÑ Ñайл
$file = New-Object System.IO.StreamReader("$home\desktop\test.txt") Ñайл бÑÐ´ÐµÑ Ð·Ð°Ð½ÑÑ Ð¿ÑоÑеÑÑом PowerShell
$file | gm
$file.ReadLine() поÑÑÑоÑнÑй вÑвод
$file.ReadToEnd() пÑоÑиÑаÑÑ Ñайл Ñеликом
Read/Write Bytes
$file = [io.file]::ReadAllBytes("$home\desktop\powershell.jpg") меÑод оÑкÑÑÐ²Ð°ÐµÑ Ð´Ð²Ð¾Ð¸ÑнÑй Ñайл, ÑÑиÑÑÐ²Ð°ÐµÑ ÐµÐ³Ð¾ в маÑÑив Ð±Ð°Ð¹Ñ Ð¸ закÑÑÐ²Ð°ÐµÑ Ñайл
[io.file]::WriteAllBytes("$home\desktop\tloztotk-2.jpg",$file) ÑоÑ
ÑаниÑÑ Ð±Ð°Ð¹ÑÑ Ð² Ñайл (можно иÑполÑзоваÑÑ Ð´Ð»Ñ Ð²ÑгÑÑзки двоиÑнÑÑ
Ñайлов из ÐÐ)
Get-Content $home/desktop\test.txt -Wait аналог tail
Test-Path $path пÑовеÑиÑÑ Ð´Ð¾ÑÑÑпноÑÑÑ Ð¿ÑÑи
Get-ChildItem $path -Filter *.txt -Recurse оÑобÑазиÑÑ ÑодеÑжимое каÑалога (Alias: ls/gci/dir) и доÑеÑниÑ
каÑалогов (-Recurse) и оÑÑилÑÑÑоваÑÑ Ð²Ñвод
Get-Location оÑобÑазиÑÑ ÑекÑÑие меÑÑоÑаÑположение (Alias: pwd/gl)
Set-Location $path пеÑемеÑение по каÑалогам (Alias: cd/sl)
Invoke-Item $path оÑкÑÑÑÑ Ñайл (Alias: ii/start)
Get-ItemProperty $env:userprofile\Documents\dns-list.txt | select FullName,Directory,Name,BaseName,Extension ÑвойÑÑва Ñайла
Get-ItemProperty -Path $path\* | select FullName,CreationTime,LastWriteTime ÑвойÑÑва Ñайлов ÑодеÑжимого диÑекÑоÑии, даÑа иÑ
ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸ поÑледнего изменениÑ
New-Item -Path "C:\test\" -ItemType "Directory" ÑоздаÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ (Alias: mkdir/md)
New-Item -Path "C:\test\file.txt" -ItemType "File" -Value "ÐобавиÑÑ ÑекÑÑ Ð² Ñайл" ÑоздаÑÑ Ñайл
"test" > "C:\test\file.txt" замениÑÑ ÑодеÑжимое
"test" >> "C:\test\file.txt" добавиÑÑ ÑÑÑÐ¾ÐºÑ Ð² Ñайл
New-Item -Path "C:\test\test\file.txt" -Force клÑÑ Ð¸ÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾ÑÑÑÑÑÑвÑÑÑиÑ
в пÑÑи диÑекÑоÑий или пеÑезапиÑи Ñайла еÑли он Ñже ÑÑÑеÑÑвÑеÑ
Move-Item пеÑемеÑение обÑекÑов (Alias: mv/move)
Remove-Item "$path\" -Recurse Ñдаление вÑеÑ
Ñайлов внÑÑÑи каÑалога, без запÑоÑа подвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ (Alias: rm/del)
Remove-Item $path -Recurse -Include "*.txt","*.temp" -Exclude "log.txt" ÑдалиÑÑ Ð²Ñе ÑÐ°Ð¹Ð»Ñ Ñ ÑаÑÑиÑением txt и temp ([Array]), кÑоме log.txt
Rename-Item "C:\test\*.*" "*.jpg" пеÑеименоваÑÑ ÑÐ°Ð¹Ð»Ñ Ð¿Ð¾ маÑке (Alias: ren)
Copy-Item копиÑование Ñайлов и каÑалогов (Alias: cp/copy)
Copy-Item -Path "\\server-01\test" -Destination "C:\" -Recurse копиÑоваÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ Ñ ÐµÐµ ÑодеÑжимÑм (-Recurse)
Copy-Item -Path "C:\*.txt" -Destination "C:\test\" знак '' в конÑе Destination иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÐµÑеноÑа папки внÑÑÑÑ Ñказанной, оÑÑÑÑÑÑвие, ÑÑо ÑÑо новое Ð¸Ð¼Ñ Ð´Ð¸ÑекÑоÑии
Copy-Item -Path "C:\*" -Destination "C:\test\" -Include '*.txt','*.jpg' копиÑоваÑÑ Ð¾Ð±ÑекÑÑ Ñ ÑказаннÑм ÑаÑÑиÑением (Include)
Copy-Item -Path "C:\*" -Destination "C:\test\" -Exclude '*.jpeg' копиÑоваÑÑ Ð¾Ð±ÑекÑÑ, за иÑклÑÑением Ñайлов Ñ ÑаÑÑиÑением (Exclude)
$log = Copy-Item "C:\*.txt" "C:\test\" -PassThru вÑвеÑÑи ÑезÑлÑÑÐ°Ñ ÐºÐ¾Ð¿Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ (логиÑование) в пеÑеменнÑÑ, можно забиÑаÑÑ ÑÑÑоки Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¸Ð½Ð´ÐµÐºÑов $log[0].FullName
Clear-env-Temp-14-days
$ls = Get-Item $env:TEMP\*.tmp # ÑÑиÑаÑÑ Ð²Ñе ÑÐ°Ð¹Ð»Ñ Ñ ÑказаннÑм ÑаÑÑиÑением
$date = (Get-Date).AddDays(-14)
foreach ($l in $ls) {
if ($l.LastWriteTime -le $date) {
$l.FullName
Remove-Item $l.FullName -Recurse
}
}
Filehash
Get-Filehash -Algorithm SHA256 "$env:USERPROFILE\Documents\RSA.conf.txt"
Microsoft.PowerShell.Archive
Compress-Archive -Path $sourcepath -DestinationPath $dstpath -CompressionLevel Optimal аÑÑ
ивиÑоваÑÑ
Expand-Archive .\powerlinefonts.zip ÑазаÑÑ
ивиÑоваÑÑ
Credential
$Cred = Get-Credential ÑоÑ
ÑанÑÐµÑ ÐºÑÐµÐ´Ñ Ð² пеÑеменнÑе $Cred.Username и $Cred.Password
$Cred.GetNetworkCredential().password извлеÑÑ Ð¿Ð°ÑолÑ
cmdkey /generic:"TERMSRV/$srv" /user:"$username" /pass:"$password" добавиÑÑ ÑказаннÑе кÑÐµÐ´Ñ Ð°ÑденÑиÑикаÑии на на ÑеÑминалÑнÑй ÑеÑÐ²ÐµÑ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð±ÐµÐ· паÑолÑ
mstsc /admin /v:$srv авÑоÑизоваÑÑÑÑ
cmdkey /delete:"TERMSRV/$srv" ÑдалиÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ñе кÑÐµÐ´Ñ Ð°ÑденÑиÑикаÑии из ÑиÑÑемÑ
rundll32.exe keymgr.dll,KRShowKeyMgr Ñ
ÑанилиÑе Stored User Names and Password
Get-Service VaultSvc ÑлÑжба Ð´Ð»Ñ ÑабоÑÑ Credential Manager
Install-Module CredentialManager ÑÑÑановиÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Credential Manager к Ñ
ÑанилиÑÑ PasswordVault из PowerShell
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]'Tls11,Tls12' Ð´Ð»Ñ ÑÑÑаноки модÑлÑ
Get-StoredCredential полÑÑиÑÑ ÑÑеÑнÑе даннÑе из Ñ
ÑанилиÑа Windows Vault
Get-StrongPassword генеÑаÑÐ¾Ñ Ð¿Ð°ÑолÑ
New-StoredCredential -UserName test -Password "123456" добавиÑÑ ÑÑеÑнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ
Remove-StoredCredential ÑдалиÑÑ ÑÑеÑнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ
$Cred = Get-StoredCredential | where {$_.username -match "admin"}
$pass = $cred.password
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass)
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
Out-Gridview
Get-Service -cn $srv | Out-GridView -Title "Service $srv" -OutputMode Single âPassThru | Restart-Service пеÑезапÑÑÑиÑÑ Ð²ÑбÑаннÑÑ ÑлÑжбÑ
Out-File
Read-Host âAsSecureString | ConvertFrom-SecureString | Out-File "$env:userprofile\desktop\password.txt" пиÑаÑÑ Ð² Ñайл. ÐÑеобÑазоваÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ð² ÑоÑÐ¼Ð°Ñ SecureString Ñ Ð¸ÑполÑзованием ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ Windows Data Protection API (DPAPI)
Get-Content (gc/cat/type)
$password = gc "$env:userprofile\desktop\password.txt" | ConvertTo-SecureString ÑиÑаÑÑ Ñ
ÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ð¸Ð· Ñайла Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ»ÑÑей, Ñ
ÑанÑÑиÑ
ÑÑ Ð² пÑоÑиле ÑекÑÑего полÑзоваÑелÑ, коÑоÑÑй невозможно пÑоÑиÑаÑÑ Ð½Ð° дÑÑгом копÑÑÑеÑе
AES Key
$AESKey = New-Object Byte[] 32
[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($AESKey)
$AESKey | Out-File "C:\password.key"
$Cred.Password | ConvertFrom-SecureString -Key (Get-Content "C:\password.key") | Set-Content "C:\password.txt" ÑоÑ
ÑаниÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ð² Ñайл иÑполÑзÑÑ Ð²Ð½ÐµÑний клÑÑ
$pass = Get-Content "C:\password.txt" | ConvertTo-SecureString -Key (Get-Content "\\Server\Share\password.key") ÑаÑÑиÑÑоваÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ð½Ð° вÑоÑом компÑÑÑеÑе
WinEvent
Get-WinEvent -ListLog * оÑобÑазиÑÑ Ð²Ñе доÑÑÑпнÑе жÑÑÐ½Ð°Ð»Ñ Ð»Ð¾Ð³Ð¾Ð²
Get-WinEvent -ListLog * | where RecordCount -ne 0 | where RecordCount -ne $null | sort -Descending RecordCount оÑобÑазиÑÑ Ð½Ðµ пÑÑÑÑе жÑÑÐ½Ð°Ð»Ñ Ñ ÑоÑÑиÑовкой по кол-Ð²Ñ Ð·Ð°Ð¿Ð¸Ñей
Get-WinEvent -ListProvider * | ft оÑобÑазиÑÑ Ð²ÑеÑ
пÑовайдеÑов пÑиложений
Get-WinEvent -ListProvider GroupPolicy найÑи в какой жÑÑнал LogLinks {Application} пиÑÑÑÑÑ Ð»Ð¾Ð³Ð¸ пÑиложениÑ
Get-WinEvent -ListProvider *smb*
Get-WinEvent -ListLog * | where logname -match SMB | sort -Descending RecordCount найÑи вÑе жÑÑÐ½Ð°Ð»Ñ Ð¿Ð¾ имени
Get-WinEvent -LogName "Microsoft-Windows-SmbClient/Connectivity"
Get-WinEvent -ListProvider *firewall*
Filter XPath/Hashtable
Get-WinEvent -FilterHashtable @{LogName="Security";ID=4624} найÑи логи по ID в жÑÑнале Security
Get-WinEvent -FilterHashtable @{LogName="System";Level=2} найÑи вÑе запиÑи оÑибки (1 - кÑиÑиÑеÑкий, 3 - пÑедÑпÑеждение, 4 - ÑведениÑ)
Get-WinEvent -FilterHashtable @{LogName="System";Level=2;ProviderName="Service Control Manager"} оÑÑилÑÑÑоваÑÑ Ð¿Ð¾ имени пÑовайдеÑа
([xml](Get-WinEvent -FilterHashtable @{LogName="Security";ID=4688} -MaxEvents 1).ToXml()).Event.EventData.Data оÑобÑазиÑÑ Ð²Ñе ÑвойÑÑва, Ñ
ÑанимÑе в EventData (Message)
Get-WinEvent -FilterHashtable @{logname="security";ID=4688} -MaxEvents 1 | select timecreated,{$_.Properties[5].value} оÑÑилÑÑÑоваÑÑ Ð²ÑÐµÐ¼Ñ ÑобÑÑÐ¸Ñ Ð¸ Ð¸Ð¼Ñ Ð·Ð°Ð¿ÑÑенного пÑоÑеÑÑа
$query = '
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">
*[System[EventID=4688]] and
*[EventData[Data[@Name="NewProcessName"]="C:\Windows\System32\autochk.exe" or Data[@Name="NewProcessName"]="C:\Windows\System32\services.exe"]]
</Select>
</Query>
</QueryList>
'
Get-WinEvent -LogName Security -FilterXPath $query
Reboot
$query = '
<QueryList>
<Query Id="0" Path="System">
<Select Path="System">
*[
System[
EventID=41 or
EventID=1074 or
EventID=1076 or
EventID=6005 or
EventID=6006 or
EventID=6008 or
EventID=6009 or
EventID=6013
]
]
</Select>
</Query>
</QueryList>
'
Get-WinEvent -LogName System -FilterXPath $query
41 ` СиÑÑема бÑла пеÑезагÑÑжена без коÑÑекÑного завеÑÑÐµÐ½Ð¸Ñ ÑабоÑÑ.
1074` СиÑÑема бÑла коÑÑекÑного вÑклÑÑена полÑзоваÑелем или пÑоÑеÑÑом.
1076` СледÑÐµÑ Ð·Ð° Event ID 6008 и ознаÑаеÑ, ÑÑо пеÑвÑй полÑзоваÑÐµÐ»Ñ (Ñ Ð¿Ñавом вÑклÑÑÐµÐ½Ð¸Ñ ÑиÑÑемÑ) подклÑÑивÑийÑÑ Ðº ÑеÑвеÑÑ Ð¿Ð¾Ñле неожиданной пеÑезагÑÑзки или вÑклÑÑениÑ, Ñказал пÑиÑÐ¸Ð½Ñ ÑÑого ÑобÑÑиÑ.
6005` ÐапÑÑк "ÐÑÑнала ÑобÑÑий Windows" (Event Log). УказÑÐ²Ð°ÐµÑ Ð½Ð° вклÑÑение ÑиÑÑемÑ.
6006` ÐÑÑановка «ÐÑÑнала ÑобÑÑий Windows». УказÑÐ²Ð°ÐµÑ Ð½Ð° вÑклÑÑение ÑиÑÑемÑ.
6008` ÐÑедÑдÑÑее вÑклÑÑение ÑиÑÑÐµÐ¼Ñ Ð±Ñло неожиданнÑм.
6009` ÐеÑÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑионной ÑиÑÑемÑ, заÑикÑиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ñи загÑÑзке ÑиÑÑемÑ.
6013` ÐÑÐµÐ¼Ñ ÑабоÑÑ ÑиÑÑÐµÐ¼Ñ (system uptime) в ÑекÑндаÑ
.
Logon
$srv = "localhost"
$FilterXPath = '<QueryList><Query Id="0"><Select>*[System[EventID=21]]</Select></Query></QueryList>'
$RDPAuths = Get-WinEvent -ComputerName $srv -LogName "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" -FilterXPath $FilterXPath
[xml[]]$xml = $RDPAuths | Foreach {$_.ToXml()}
$EventData = Foreach ($event in $xml.Event) {
New-Object PSObject -Property @{
"Connection Time" = (Get-Date ($event.System.TimeCreated.SystemTime) -Format 'yyyy-MM-dd hh:mm K')
"User Name" = $event.UserData.EventXML.User
"User ID" = $event.UserData.EventXML.SessionID
"User Address" = $event.UserData.EventXML.Address
"Event ID" = $event.System.EventID
}}
$EventData | ft
EventLog
Get-EventLog -List оÑобÑазиÑÑ Ð²Ñе коÑневÑе жÑÑÐ½Ð°Ð»Ñ Ð»Ð¾Ð³Ð¾Ð² и иÑ
ÑазмеÑ
Clear-EventLog Application оÑиÑÑиÑÑ Ð»Ð¾Ð³Ð¸ Ñказанного жÑÑнала
Get-EventLog -LogName Security -InstanceId 4624 найÑи логи по ID в жÑÑнале Security
Firewall
$days = 5
$obj = @()
$fw = Get-WinEvent "Microsoft-Windows-Windows Firewall With Advanced Security/Firewall"
foreach ($temp_fw in $fw) {
if ($temp_fw.id -eq 2097) { # 2004
$type = "Added Rule"
}
elseif ($temp_fw.id -eq 2006) {
$type = "Deleted Rule"
}
$port = $temp_fw.Properties[7] | select -ExpandProperty value
$name = $temp_fw.Properties[1] | select -ExpandProperty value
$obj += [PSCustomObject]@{
Time = $temp_fw.TimeCreated;
Type = $type;
Port = $port;
Name = $name}
}
$obj | Where-Object time -gt (Get-Date).AddDays(-$days)
New-NetFirewallRule -Profile Any -DisplayName "Open Port 135 RPC" -Direction Inbound -Protocol TCP -LocalPort 135 оÑкÑÑÑÑ in-поÑÑ
Get-NetFirewallRule | where DisplayName -match kms | select * найÑи пÑавило по имени
Get-NetFirewallPortFilter | where LocalPort -like 80 найÑи дейÑÑвÑÑÑие пÑавило по номеÑÑ Ð¿Ð¾ÑÑа
Get-NetFirewallRule -Enabled True -Direction Inbound | select -Property DisplayName,
@{Name='Protocol';Expression={($_ | Get-NetFirewallPortFilter).Protocol}},
@{Name='LocalPort';Expression={($_ | Get-NetFirewallPortFilter).LocalPort}},
@{Name='RemotePort';Expression={($_ | Get-NetFirewallPortFilter).RemotePort}},
@{Name='RemoteAddress';Expression={($_ | Get-NetFirewallAddressFilter).RemoteAddress}},
Enabled,Profile
Firewall-Manager
Install-Module Firewall-Manager
Export-FirewallRules -Name * -CSVFile $home\documents\fw.csv -Inbound -Outbound -Enabled -Disabled -Allow -Block (ÑилÑÑÑ Ð¿Ñавил Ð´Ð»Ñ ÑкÑпоÑÑа)
Import-FirewallRules -CSVFile $home\documents\fw.csv
Defender
Import-Module Defender
Get-Command -Module Defender
Get-MpComputerStatus
(Get-MpComputerStatus).AntivirusEnabled ÑÑаÑÑÑ ÑабоÑÑ Ð°Ð½ÑивиÑÑÑа
$session = NewCimSession -ComputerName hostname подклÑÑиÑÑÑÑ Ðº ÑÐ´Ð°Ð»ÐµÐ½Ð½Ð¾Ð¼Ñ ÐºÐ¾Ð¼Ð¿ÑÑÑеÑÑ, иÑполÑзÑеÑÑÑ WinRM
Get-MpComputerStatus -CimSession $session | fl fullscan* ÑзнаÑÑ Ð´Ð°ÑÑ Ð¿Ð¾Ñледнего ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° Ñдаленном компÑÑÑеÑе
Get-MpPreference наÑÑÑойки
(Get-MpPreference).ScanPurgeItemsAfterDelay вÑÐµÐ¼Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñей жÑÑнала заÑиÑника в днÑÑ
Set-MpPreference -ScanPurgeItemsAfterDelay 30 измениÑÑ Ð²ÑÐµÐ¼Ñ Ñ
ÑанениÑ
ls "C:\ProgramData\Microsoft\Windows Defender\Scans\History"
Get-MpPreference | select disable* оÑобÑазиÑÑ ÑÑаÑÑÑ Ð²ÑеÑ
видов пÑовеÑок/ÑканиÑований
Set-MpPreference -DisableRealtimeMonitoring $true оÑклÑÑиÑÑ Ð·Ð°ÑиÑÑ Defender в ÑеалÑном вÑемени (иÑполÑзоваÑÑ ÑолÑко ÑÑÑное ÑканиÑование)
Set-MpPreference -DisableRemovableDriveScanning $false вклÑÑиÑÑ ÑканиÑование USB накопиÑелей
Get-MpPreference | select excl* оÑобÑазиÑÑ ÑпиÑок вÑеÑ
иÑклÑÑений
(Get-MpPreference).ExclusionPath
Add-MpPreference -ExclusionPath C:\install добавиÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ Ð² иÑклÑÑение
Remove-MpPreference -ExclusionPath C:\install ÑдалиÑÑ Ð¸Ð· иÑклÑÑениÑ
New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name DisableAntiSpyware -Value 1 -PropertyType DWORD -Force полноÑÑÑÑ Ð¾ÑклÑÑиÑÑ Windows Defender
Set-MpPreference -SignatureDefinitionUpdateFileSharesSources \\FileShare1\Updates Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð· ÑеÑевой папки нÑжно пÑедваÑиÑелÑно ÑкаÑаÑÑ ÑÐ°Ð¹Ð»Ñ Ñ ÑигнаÑÑÑами баз Ñ ÑайÑа https://www.microsoft.com/security/portal/definitions/adl.aspx и помеÑÑиÑÑ Ð² ÑеÑевой каÑалог
Update-MpSignature -UpdateSource FileShares измениÑÑ Ð¸ÑÑоÑник обновлений (MicrosoftUpdateServer â ÑеÑвеÑа обновлений MS в инÑеÑнеÑе, InternalDefinitionUpdateServer â внÑÑÑенний WSUS ÑеÑвеÑ)
Update-MpSignature обновиÑÑ ÑигнаÑÑÑÑ
Start-MpScan -ScanType QuickScan бÑÑÑÑÐ°Ñ Ð¿ÑовеÑка или FullScan
Start-MpScan -ScanType FullScan -AsJob
Set-MpPreference -RemediationScheduleDay 1-7 вÑбÑаÑÑ Ð´Ð½Ð¸, наÑÐ¸Ð½Ð°Ñ Ñ Ð²Ð¾ÑкÑеÑенÑÑ Ð¸Ð»Ð¸ 0 каждÑй денÑ, 8 - ÑбÑоÑиÑÑ
Set-MpPreference -ScanScheduleQuickScanTime 14:00:00
Start-MpScan -ScanType CustomScan -ScanPath "C:\Program Files" ÑканиÑоваÑÑ Ð²ÑбÑаннÑÑ Ð´Ð¸ÑекÑоÑиÑ
Get-MpThreat иÑÑоÑÐ¸Ñ ÑгÑоз и Ñип ÑгÑÐ¾Ð·Ñ (ThreatName: HackTool/Trojan)
Get-MpThreatCatalog ÑпиÑок извеÑÑнÑÑ
видов ÑгÑоз
Get-MpThreatDetection иÑÑоÑÐ¸Ñ Ð·Ð°ÑиÑÑ (акÑивнÑÑ
и пÑоÑлÑе) и ID ÑгÑозÑ
Get-MpThreat -ThreatID 2147760253
ls "C:\ProgramData\Microsoft\Windows Defender\Quarantine\" диÑекÑоÑÐ¸Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ñайлов в каÑанÑине
cd "C:\Program Files\Windows Defender\"
.\MpCmdRun.exe -restore -name $ThreatName воÑÑÑановиÑÑ Ñайл из каÑанÑина
.\MpCmdRun.exe -restore -filepath $path_file
WindowsUpdate
Get-Hotfix | Sort-Object -Descending InstalledOn ÑпиÑок ÑÑÑановленнÑÑ
обновлений (инÑоÑмаÑÐ¸Ñ Ð¸Ð· cimv2)
Get-Hotfix -Description "Security update"
Get-CimInstance Win32_QuickFixEngineering
Get-Command -Module WindowsUpdate
Get-WindowsUpdateLog
Get-Service uhssvc ÑлÑжба Microsoft Health Update Tools, коÑоÑÐ°Ñ Ð¾ÑвеÑÐ°ÐµÑ Ð·Ð° пÑедоÑÑавление обновлений
Install-Module -Name PSWindowsUpdate -Scope CurrentUser
Import-Module PSWindowsUpdate
Get-Command -Module PSWindowsUpdate
Get-WindowsUpdate ÑпиÑок обновлений Ð´Ð»Ñ ÑкаÑаÑÑ Ð¸ ÑÑÑановиÑÑ Ñ ÑеÑвеÑа WSUS или Microsoft Update
Get-WindowsUpdate -Download загÑÑзиÑÑ Ð²Ñе обновлениÑ
Get-WindowsUpdate âInstall ÑÑÑановиÑÑ Ð²Ñе обновлениÑ
Install-WindowsUpdate -MicrosoftUpdate -AcceptAll -IgnoreReboot ÑÑÑановиÑÑ Ð²Ñе Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±ÐµÐ· пеÑезагÑÑзки
Get-WindowsUpdate -KBArticleID KB2267602, KB4533002 -Install
Get-WindowsUpdate -KBArticleID KB2538243 -Hide ÑкÑÑÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ, ÑÑо Ð±Ñ Ð¾Ð½Ð¸ никогда не ÑÑÑанавливалиÑÑ
Get-WindowsUpdate âIsHidden оÑобÑазиÑÑ ÑкÑÑÑÑе Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ (Hide-WindowsUpdate)
Remove-WindowsUpdate -KBArticleID KB4011634 -NoRestart ÑдалиÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ
Uninstall-WindowsUpdate ÑдалиÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ
Add-WUServiceManager ÑегиÑÑÑаÑÐ¸Ñ ÑеÑвеÑа Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ (Windows Update Service Manager)
Enable-WURemoting вклÑÑиÑÑ Ð¿Ñавила Windows Defender, ÑазÑеÑаÑÑие Ñдаленное иÑполÑзование командлеÑа PSWindowsUpdate
Get-WUApiVersion веÑÑÐ¸Ñ Windows Update Agent
Get-WUHistory ÑпиÑок вÑеÑ
ÑÑÑановленнÑÑ
обновлений (иÑÑоÑÐ¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ð¹)
Get-WUHistory | Where-Object {$_.Title -match "KB4517389"} поиÑк обновлениÑ
Get-WULastResults даÑÑ Ð¿Ð¾Ñледнего поиÑка и ÑÑÑановки обновлений
Get-WURebootStatus пÑовеÑиÑÑ, нÑжна ли пеÑезагÑÑзка Ð´Ð»Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÐºÑеÑного обновлениÑ
Get-WUServiceManager вÑÐ²Ð¾Ð´Ð¸Ñ Ð¸ÑÑоÑники обновлений
Get-WUInstallerStatus ÑÑаÑÑÑ ÑлÑÐ¶Ð±Ñ Windows Installer
Remove-WUServiceManager оÑклÑÑиÑÑ Windows Update Service Manager
DISM
Get-Command -Module Dism -Name *Driver*
Export-WindowsDriver -Online -Destination C:\Users\Lifailon\Documents\Drivers\ извлеÑение дÑайвеÑов из ÑекÑÑей ÑиÑÑÐµÐ¼Ñ (C:\Windows\System32\DriverStore\FileRepository), вÑгÑÑÐ¶Ð°ÐµÑ ÑпиÑок Ñайлов, коÑоÑÑе необÑ
Ð¾Ð´Ð¸Ð¼Ñ Ð´Ð»Ñ ÑÑÑановки дÑайвеÑа (dll,sys,exe) в ÑооÑвеÑÑÑвии Ñо ÑпиÑком Ñайлов, ÑказаннÑÑ
в ÑекÑии [CopyFiles] inf-Ñайла дÑайвеÑа.
Export-WindowsDriver -Path C:\win_image -Destination C:\drivers извлеÑÑ Ð´ÑайвеÑа из оÑлайн обÑаза Windows, ÑмонÑиÑованного в каÑалог c:\win_image
$BackupDrivers = Export-WindowsDriver -Online -Destination C:\Drivers
$BackupDrivers | ft Driver,ClassName,ProviderName,Date,Version,ClassDescription ÑпиÑок дÑайвеÑов в обÑекÑном пÑедÑÑавлении
$BackupDrivers | where classname -match printer
pnputil.exe /add-driver C:\drivers\*.inf /subdirs /install ÑÑÑановиÑÑ Ð²Ñе (паÑамеÑÑ subdirs) дÑайвеÑа из Ñказанной папки (вклÑÑÐ°Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе)
sfc /scannow пÑовеÑиÑÑ ÑелоÑÑноÑÑÑ ÑиÑÑемнÑÑ
Ñайлов Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑилиÑÑ SFC (System File Checker), в ÑлÑÑае поиÑка оÑибок, попÑобÑÐµÑ Ð²Ð¾ÑÑÑановиÑÑ Ð¸Ñ
оÑигиналÑнÑе копии из Ñ
ÑанилиÑа ÑиÑÑемнÑÑ
компоненÑов Windows (каÑалог C:\Windows\WinSxS). ÐÑвод ÑабоÑÑ Ð»Ð¾Ð³Ð¸ÑÑеÑÑÑ Ð² C:\Windows\Logs\CBS Ñ Ñегом SR
Get-ComputerInfo | select * подÑÐ¾Ð±Ð½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑиÑÑеме (WindowsVersion,WindowsEditionId,Bios)
Get-WindowsImage -ImagePath E:\sources\install.wim ÑпиÑок доÑÑÑпнÑÑ
веÑÑий в обÑазе
Repair-WindowsImage -Online âScanHealth
Repair-WindowsImage -Online -RestoreHealth воÑÑÑановление Ñ
ÑанилиÑа ÑиÑÑемнÑÑ
компоненÑов
Repair-WindowsImage -Online -RestoreHealth -Source E:\sources\install.wim:3 âLimitAccess воÑÑÑановление в оÑÑлайн Ñежиме из обÑаза по номеÑÑ Ð¸Ð½Ð´ÐµÐºÑа
Scheduled
$Trigger = New-ScheduledTaskTrigger -At 01:00am -Daily 1:00 ноÑи
$Trigger = New-ScheduledTaskTrigger âAtLogon запÑÑк пÑи вÑ
оде полÑзоваÑÐµÐ»Ñ Ð² ÑиÑÑемÑ
$Trigger = New-ScheduledTaskTrigger -AtStartup пÑи запÑÑке ÑиÑÑемÑ
$User = "NT AUTHORITY\SYSTEM"
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "$home\Documents\DNS-Change-Tray-1.3.ps1"
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -NoLogo -NonInteractive -ExecutionPolicy Unrestricted -WindowStyle Hidden -File $home\Documents\DNS-Change-Tray-1.3.ps1"
Register-ScheduledTask -TaskName "DNS-Change-Tray-Startup" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest âForce
Get-ScheduledTask | ? state -ne Disabled ÑпиÑок вÑеÑ
акÑивнÑÑ
заданий
Start-ScheduledTask DNS-Change-Tray-Startup запÑÑÑиÑÑ Ð·Ð°Ð´Ð°Ð½Ð¸Ðµ немедленно
Get-ScheduledTask DNS-Change-Tray-Startup | Disable-ScheduledTask оÑклÑÑиÑÑ Ð·Ð°Ð´Ð°Ð½Ð¸Ðµ
Get-ScheduledTask DNS-Change-Tray-Startup | Enable-ScheduledTask вклÑÑиÑÑ Ð·Ð°Ð´Ð°Ð½Ð¸Ðµ
Unregister-ScheduledTask DNS-Change-Tray-Startup ÑдалиÑÑ Ð·Ð°Ð´Ð°Ð½Ð¸Ðµ
Export-ScheduledTask DNS-Change-Tray-Startup | Out-File $home\Desktop\Task-Export-Startup.xml ÑкÑпоÑÑиÑоваÑÑ Ð·Ð°Ð´Ð°Ð½Ð¸Ðµ в xml
Register-ScheduledTask -Xml (Get-Content $home\Desktop\Task-Export-Startup.xml | Out-String) -TaskName "DNS-Change-Tray-Startup"
Network
ping
Test-Connection -Count 1 $srv1, $srv2 оÑпÑавиÑÑ icmp-Ð¿Ð°ÐºÐµÑ Ð´Ð²Ñм Ñ
оÑÑам
Test-Connection $srv -ErrorAction SilentlyContinue не вÑводиÑÑ Ð¾Ñибок, еÑли Ñ
оÑÑ Ð½Ðµ оÑвеÑаеÑ
Test-Connection -Source $srv1 -ComputerName $srv2 пинг Ñ Ñдаленного компÑÑÑеÑа
function Test-PingNetwork {
param (
[Parameter(Mandatory,ValueFromPipeline)][string[]]$Network,
[ValidateRange(100,10000)][int]$Timeout = 100
)
$ping = New-Object System.Net.NetworkInformation.Ping
$Network = $Network -replace "0$"
$net = @()
foreach ($r in @(1..254)) {
$net += "$network$r"
}
foreach ($n in $net) {
$ping.Send($n, $timeout) | select @{Name="Address"; Expression={$n -replace ".+\."}}, Status
}
}
Test-PingNetwork -Network 192.168.3.0
Test-PingNetwork -Network 192.168.3.0 -Timeout 1000
Get-CimInstance -Class Win32_PingStatus -Filter "Address='127.0.0.1'"
Get-CimInstance -Class Win32_PingStatus -Filter "Address='127.0.0.1'" | Format-Table -Property Address,ResponseTime,StatusCode -Autosize 0 - ÑÑпеÑ
'127.0.0.1','8.8.8.8' | ForEach-Object -Process {Get-CimInstance -Class Win32_PingStatus -Filter ("Address='$_'") | Select-Object -Property Address,ResponseTime,StatusCode}
$ips = 1..254 | ForEach-Object -Process {'192.168.1.' + $_} ÑÑоÑмиÑоваÑÑ Ð¼Ð°ÑÑив из ip-адÑеÑов подÑеÑи
dhcp
Get-CimInstance -Class Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=$true" оÑобÑазиÑÑ Ð°Ð´Ð°Ð¿ÑеÑÑ Ñ Ð²ÐºÐ»ÑÑеннÑм DHCP
$wql = 'SELECT * from Win32_NetworkAdapterConfiguration WHERE IPEnabled=True and DHCPEnabled=False'
Invoke-CimMethod -MethodName ReleaseDHCPLease -Query $wql вклÑÑение DHCP на вÑеÑ
адапÑеÑаÑ
Invoke-CimMethod -ClassName Win32_NetworkAdapterConfiguration -MethodName ReleaseDHCPLeaseAll оÑмениÑÑ Ð°ÑÐµÐ½Ð´Ñ Ð°Ð´ÑеÑов DHCP на вÑеÑ
адапÑеÑаÑ
Invoke-CimMethod -ClassName Win32_NetworkAdapterConfiguration -MethodName RenewDHCPLeaseAll обновиÑÑ Ð°ÑÐµÐ½Ð´Ñ Ð°Ð´ÑеÑов DHCP на вÑеÑ
адапÑеÑаÑ
port
tnc $srv -p 5985
tnc $srv -CommonTCPPort WINRM HTTP,RDP,SMB
tnc ya.ru âTraceRoute -Hops 2 TTL=2
tnc ya.ru -DiagnoseRouting маÑÑÑÑÑизаÑÐ¸Ñ Ð´Ð¾ Ñ
оÑÑа, кÑда (DestinationPrefix: 0.0.0.0/0) ÑеÑез (NextHop: 192.168.1.254)
nslookup
nslookup ya.ru 1.1.1.1 Ñ Ñказанием DNS ÑеÑвеÑа
nslookup -type=any ya.ru ÑказаÑÑ Ñип запиÑи
Resolve-DnsName ya.ru -Type MX ALL,ANY,A,NS,SRV,CNAME,PTR,TXT(spf)
[System.Net.Dns]::GetHostEntry("ya.ru")
ipconfig
Get-NetIPConfiguration
Get-NetIPConfiguration -InterfaceIndex 14 -Detailed
Adapter
Get-NetAdapter
Set-NetIPInterface -InterfaceIndex 14 -Dhcp Disabled оÑклÑÑиÑÑ DHCP
Get-NetAdapter -InterfaceIndex 14 | New-NetIPAddress âIPAddress 192.168.3.99 -DefaultGateway 192.168.3.1 -PrefixLength 24 задаÑÑ/добавиÑÑ ÑÑаÑиÑеÑкий IP-адÑеÑ
Set-NetIPAddress -InterfaceIndex 14 -IPAddress 192.168.3.98 измениÑÑ IP-адÑÐµÐ°Ñ Ð½Ð° адапÑеÑе
Remove-NetIPAddress -InterfaceIndex 14 -IPAddress 192.168.3.99 ÑдалиÑÑ IP-адÑÐµÑ Ð½Ð° адапÑеÑе
Set-NetIPInterface -InterfaceIndex 14 -Dhcp Enabled вклÑÑиÑÑ DHCP
DNSClient
Get-DNSClientServerAddress
Set-DNSClientServerAddress -InterfaceIndex 14 -ServerAddresses 8.8.8.8
DNSCache
Get-DnsClientCache оÑобÑазиÑÑ ÐºÑÑиÑованнÑе запиÑи клиенÑа DNS
Clear-DnsClientCache оÑиÑÑиÑÑ ÐºÑÑ
Binding
Get-NetAdapterBinding -Name Ethernet -IncludeHidden -AllBindings
Get-NetAdapterBinding -Name "ÐеÑпÑÐ¾Ð²Ð¾Ð´Ð½Ð°Ñ ÑеÑÑ" -DisplayName "IP веÑÑии 6 (TCP/IPv6)" | Set-NetAdapterBinding -Enabled $false оÑклÑÑиÑÑ IPv6 на адапÑеÑе
TCPSetting
Get-NetTCPSetting
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CongestionProvider DCTCP
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CwndRestart True
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -ForceWS Disabled
netstat
netstat -anop tcp -n/-f/-b
Get-NetTCPConnection -State Established,Listen | ? LocalPort -Match 3389
Get-NetTCPConnection -State Established,Listen | ? RemotePort -Match 22
Get-NetUDPEndpoint | ? LocalPort -Match 514 netstat -ap udp`
Statistics
netstat -se
Get-NetAdapterStatistics
hostname
$env:computername
hostname.exe
(Get-CIMInstance CIM_ComputerSystem).Name
(New-Object -ComObject WScript.Network).ComputerName
[System.Environment]::MachineName
[System.Net.Dns]::GetHostName()
arp
ipconfig /all | Select-String "Ñиз" grep
Get-NetNeighbor -AddressFamily IPv4
function Get-ARP {
Param (
$proxy,
$search
)
if (!$proxy) {
$arp = arp -a
}
if ($proxy) {
$arp = icm $proxy {arp -a}
}
$mac = $arp[3..260]
$mac = $mac -replace "^\s\s"
$mac = $mac -replace "\s{1,50}"," "
$mac_coll = New-Object System.Collections.Generic.List[System.Object]
foreach ($m in $mac) {
$smac = $m -split " "
$mac_coll.Add([PSCustomObject]@{
IP = $smac[0];
MAC = $smac[1];
Type = $smac[2]
})
}
if ($search) {
if ($search -NotMatch "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}") {
#$ns = nslookup $search
#$ns = $ns[-2]
#$global:ns = $ns -replace "Address:\s{1,10}"
$rdns = Resolve-DnsName $search -ErrorAction Ignore
$ns = $rdns.IPAddress
if ($ns -eq $null) {
return
}
} else {
$ns = $search
}
$mac_coll = $mac_coll | ? ip -Match $ns
}
$mac_coll
}
Get-ARP -search 192.168.3.100
Get-ARP -search 192.168.3.100 -proxy dc-01
RDP
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "PortNumber" оÑобÑазиÑÑ Ð½Ð¾Ð¼ÐµÑ ÑекÑÑего RDP поÑÑа
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "PortNumber" -Value "3390" измениÑÑ RDP-поÑÑ
$(Get-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server\" -Name "fDenyTSConnections").fDenyTSConnections еÑли 0, Ñо вклÑÑен
Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server\" -Name "fDenyTSConnections" -Value 0 вклÑÑиÑÑ RDP
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
(gcim -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).SetAllowTSConnections(0) вклÑÑиÑÑ RDP (Ð´Ð»Ñ Windows Server)
Get-Service TermService | Restart-Service -Force пеÑезапÑÑÑиÑÑ rdp-ÑлÑжбÑ
New-NetFirewallRule -Profile Any -DisplayName "RDP 3390" -Direction Inbound -Protocol TCP -LocalPort 3390 оÑкÑÑÑÑ RDP-поÑÑ
IPBan
auditpol /get /category:* оÑобÑазиÑÑ Ð²Ñе полиÑики аÑдиÑа
auditpol /get /category:ÐÑ
од/вÑÑ
од оÑобÑазиÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑе полиÑики аÑдиÑа Ð´Ð»Ñ ÐÑ
ода и ÐÑÑ
ода из ÑиÑÑемÑ
auditpol /set /subcategory:"ÐÑ
од в ÑиÑÑемÑ" /success:enable /failure:enable вклÑÑиÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑе полиÑики - ÐÑÐ´Ð¸Ñ Ð²Ñ
ода в ÑиÑÑемÑ
auditpol /set /subcategory:"ÐÑÑ
од из ÑиÑÑемÑ" /success:enable /failure:enable
$url = $($(Invoke-RestMethod https://api.github.com/repos/DigitalRuby/IPBan/releases/latest).assets | Where-Object name -match ".+win.+x64.+").browser_download_url полÑÑиÑÑ ÑÑÑÐ»ÐºÑ Ð´Ð»Ñ Ð·Ð°Ð³ÑÑзки поÑледней веÑÑии
$version = $(Invoke-RestMethod https://api.github.com/repos/DigitalRuby/IPBan/releases/latest).tag_name полÑÑиÑÑ Ð½Ð¾Ð¼ÐµÑ Ð¿Ð¾Ñледней веÑÑии
$path = "$home\Documents\ipban-$version" пÑÑÑ Ð´Ð»Ñ ÑÑÑановки
Invoke-RestMethod $url -OutFile "$home\Downloads\IPBan-$version.zip" ÑкаÑаÑÑ Ð´Ð¸ÑÑÑибÑÑив
Expand-Archive "$home\Downloads\ipban-$version.zip" -DestinationPath $path ÑазаÑÑ
ивиÑоваÑÑ Ð² пÑÑÑ Ð´Ð»Ñ ÑÑÑановки
Remove-Item "$home\Downloads\ipban-$version.zip" ÑдалиÑÑ Ð´Ð¸ÑÑÑибÑÑив
sc create IPBan type=own start=delayed-auto binPath="$path\DigitalRuby.IPBan.exe" DisplayName=IPBan ÑоздаÑÑ ÑлÑжбÑ
Get-Service IPBan ÑÑаÑÑÑ ÑлÑжбÑ
$conf = $(Get-Content "$path\ipban.config") ÑиÑаем конÑигÑÑаÑиÑ
$conf = $conf -replace '<add key="Whitelist" value=""/>','<add key="Whitelist" value="192.168.3.0/24"/>' добавиÑÑ Ð² белÑй лиÑÑ Ð´Ð¾Ð¼Ð°ÑнÑÑ ÑеÑÑ Ð´Ð»Ñ Ð¸ÑклÑÑениÑ
$conf = $conf -replace '<add key="ProcessInternalIPAddresses" value="false"/>','<add key="ProcessInternalIPAddresses" value="true"/>' вклÑÑиÑÑ Ð¾Ð±ÑабоÑÐºÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑÑ
(внÑÑÑенниÑ
) ip-адÑеÑов
$conf = $conf -replace '<add key="FailedLoginAttemptsBeforeBanUserNameWhitelist" value="20"/>','<add key="FailedLoginAttemptsBeforeBanUserNameWhitelist" value="5"/>' ÑказаÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво попÑÑок подклÑÑÐµÐ½Ð¸Ñ Ð´Ð¾ блокиÑовки
$conf = $conf -replace '<add key="ExpireTime" value="01:00:00:00"/>','<add key="ExpireTime" value="00:01:00:00"/>' задаÑÑ Ð²ÑÐµÐ¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки 1 ÑаÑ
$conf > "$path\ipban.config" обновиÑÑ ÐºÐ¾Ð½ÑигÑÑаÑиÑ
Get-Service IPBan | Start-Service запÑÑÑиÑÑ ÑлÑжбÑ
Get-NetFirewallRule | Where-Object DisplayName -Match "IPBan" | ForEach-Object {
$Name = $_.DisplayName
Get-NetFirewallAddressFilter -AssociatedNetFirewallRule $_ | Select-Object @{Name="Name"; Expression={$Name}},LocalIP,RemoteIP
} # оÑобÑазиÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñавил ÐÑандмаÑÑÑа Ð´Ð»Ñ IPBan
Get-Content -Wait "$path\logfile.txt" ÑиÑаÑÑ Ð»Ð¾Ð³
Get-Service IPBan | Stop-Service оÑÑановиÑÑ ÑлÑжбÑ
sc delete IPBan ÑдалиÑÑ ÑлÑжбÑ
shutdown
shutdown /r /o пеÑезагÑÑзка в безопаÑнÑй Ñежим
shutdown /s /t 600 /c "Power off after 10 minutes" вÑклÑÑение
shutdown /s /f пÑинÑдиÑелÑное закÑÑÑие пÑиложений
shutdown /a оÑмена
shutdown /r /t 0 /m \\192.168.3.100
Restart-Computer -ComputerName 192.168.3.100 -Protocol WSMan ÑеÑез WinRM
Restart-Computer âComputerName 192.168.3.100 âForce ÑеÑез WMI
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\PolicyManager\default\Start\HideShutDown" -Name "value" -Value 1 ÑкÑÑÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ Ð²ÑклÑÑениÑ
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\PolicyManager\default\Start\HideRestart" -Name "value" -Value 1 ÑкÑÑÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ Ð¿ÐµÑезагÑÑзки
function Start-Shutdown {
<#
.SYNOPSIS
Module for shutdown and restart the computer at a specified time
.DESCRIPTION
Example:
# Start-Shutdown -Time "18:00"
# Start-Shutdown -Restart -Time "18:00"
# Start-Shutdown -Cancel
.LINK
https://github.com/Lifailon/PS-Commands
#>
param(
[string]$Time,
[switch]$Restart,
[switch]$Cancel
)
if ($Time) {
$currentDateTime = Get-Date
$shutdownTime = Get-Date $Time
if ($shutdownTime -lt $currentDateTime) {
$shutdownTime = $shutdownTime.AddDays(1)
}
$timeUntilShutdown = $shutdownTime - $currentDateTime
$secondsUntilShutdown = [math]::Round($timeUntilShutdown.TotalSeconds)
}
if ($Cancel) {
Start-Process -FilePath "shutdown.exe" -ArgumentList "/a"
} elseif ($Restart) {
Write-Host "The computer will restart after $($timeUntilShutdown.Hours) hours and $($timeUntilShutdown.Minutes) minutes."
Start-Process -FilePath "shutdown.exe" -ArgumentList "/r", "/f", "/t", "$secondsUntilShutdown"
} else {
Write-Host "The computer will shutdown after $($timeUntilShutdown.Hours) hours and $($timeUntilShutdown.Minutes) minutes."
Start-Process -FilePath "shutdown.exe" -ArgumentList "/s", "/f", "/t", "$secondsUntilShutdown"
}
}
LocalAccounts
Get-Command -Module Microsoft.PowerShell.LocalAccounts
Get-LocalUser ÑпиÑок полÑзоваÑелей
Get-LocalGroup ÑпиÑок гÑÑпп
New-LocalUser "1C" -Password $Password -FullName "1C Domain" ÑоздаÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ
Set-LocalUser -Password $Password 1C измениÑÑ Ð¿Ð°ÑолÑ
Add-LocalGroupMember -Group "Administrators" -Member "1C" добавиÑÑ Ð² гÑÑÐ¿Ð¿Ñ ÐдминиÑÑÑаÑоÑов
Get-LocalGroupMember "Administrators" ÑÐ»ÐµÐ½Ñ Ð³ÑÑппÑ
@("vproxy-01","vproxy-02","vproxy-03") | %{
icm $_ {Add-LocalGroupMember -Group "Administrators" -Member "support4"}
icm $_ {Get-LocalGroupMember "Administrators"}
}
SMB
Get-SmbServerConfiguration
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force оÑклÑÑиÑÑ Ð¿ÑоÑокол SMB v1
Get-WindowsFeature | Where-Object {$_.name -eq "FS-SMB1"} | ft Name,Installstate модÑÐ»Ñ ServerManager, пÑовеÑиÑÑ ÑÑÑановлен ли ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ SMB1
Install-WindowsFeature FS-SMB1 ÑÑÑановиÑÑ SMB1
Uninstall-WindowsFeature âName FS-SMB1 âRemove ÑдалиÑÑ SMB1 клиенÑа (понадобиÑÑÑ Ð¿ÐµÑезагÑÑзка)
Get-WindowsOptionalFeature -Online модÑÐ»Ñ DISM, Ð´Ð»Ñ ÑабоÑÑ Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñами Windows
Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -Remove ÑдалиÑÑ SMB1
Set-SmbServerConfiguration âAuditSmb1Access $true вклÑÑиÑÑ Ð°ÑÐ´Ð¸Ñ SMB1
Get-SmbConnection ÑпиÑок акÑивнÑÑ
ÑеÑÑий и иÑполÑзÑÐµÐ¼Ð°Ñ Ð²ÐµÑÑÐ¸Ñ SMB (Dialect)
Get-SmbOpenFile | select ClientUserName,ClientComputerName,Path,SessionID ÑпиÑок оÑкÑÑÑÑÑ
Ñайлов
Get-SmbShare ÑпиÑок ÑеÑевÑÑ
папок
New-SmbShare -Name xl-share -Path E:\test ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ Ð¾Ð±ÑÑÑ ÑеÑевÑÑ Ð¿Ð°Ð¿ÐºÑ (ÑаÑÑаÑиÑÑ)
-EncryptData $True вклÑÑиÑÑ ÑиÑÑование SMB
-Description Ð¸Ð¼Ñ Ð² ÑеÑевом окÑÑжении
-ReadAccess "domain\username" доÑÑÑп на ÑÑение
-ChangeAccess доÑÑÑп на запиÑÑ
-FullAccess полнÑй доÑÑÑп
-NoAccess ALL Ð½ÐµÑ Ð¿Ñав
-FolderEnumerationMode [AccessBased | Unrestricted] позволÑÐµÑ ÑкÑÑÑÑ Ð² ÑеÑевой папке обÑекÑÑ, на коÑоÑÑÑ
Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð½ÐµÑ Ð´Ð¾ÑÑÑпа Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Access-Based Enumeration (ABE)
Get-SmbShare xl-share | Set-SmbShare -FolderEnumerationMode AccessBased клÑÑиÑÑ ABE Ð´Ð»Ñ Ð²ÑеÑ
ÑаÑÑаÑеннÑÑ
папок
Remove-SmbShare xl-share -force ÑдалиÑÑ ÑеÑевой доÑÑÑп (ÑаÑÑ)
Get-SmbShareAccess xl-share вÑвеÑÑи ÑпиÑок доÑÑÑпов безопаÑноÑÑи к ÑаÑе
Revoke-SmbShareAccess xl-share -AccountName Everyone âForce ÑдалиÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ð¸Ð· ÑпиÑка доÑÑÑпов
Grant-SmbShareAccess -Name xl-share -AccountName "domain\XL-Share" -AccessRight Change âforce измениÑÑ/добавиÑÑ ÑазÑеÑÐµÐ½Ð¸Ñ Ð½Ð° запиÑÑ (Full,Read)
Grant-SmbShareAccess -Name xl-share -AccountName "вÑе" -AccessRight Change âforce
Block-SmbShareAccess -Name xl-share -AccountName "domain\noAccess" -Force пÑинÑдиÑелÑнÑй запÑеÑ
New-SmbMapping -LocalPath X: -RemotePath \\$srv\xl-share -UserName support4 -Password password âPersistent $true подклÑÑиÑÑ ÑеÑевой диÑк
-Persistent воÑÑÑановление ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле оÑклÑÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¿ÑÑÑеÑа или ÑеÑи
-SaveCredential позволÑÐµÑ ÑоÑ
ÑаниÑÑ ÑÑеÑнÑе даннÑе полÑзоваÑÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð² диÑпеÑÑÐµÑ ÑÑеÑнÑÑ
даннÑÑ
Windows Credential Manager
Stop-Process -Name "explorer" | Start-Process -FilePath "C:\Windows\explorer.exe" пеÑезапÑÑÑиÑÑ Ð¿ÑоÑеÑÑ Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² пÑоводнике
Get-SmbMapping ÑпиÑок подклÑÑеннÑÑ
ÑеÑевÑÑ
диÑков
Remove-SmbMapping X: -force оÑмонÑиÑоваÑÑ ÑеÑевой диÑк
$CIMSession = New-CIMSession âComputername $srv ÑоздаÑÑ ÑÐµÐ°Ð½Ñ CIM (аÑденÑиÑикаÑÐ¸Ñ Ð½Ð° SMB)
Get-SmbOpenFile -CIMSession $CIMSession | select ClientUserName,ClientComputerName,Path | Out-GridView -PassThru | Close-SmbOpenFile -CIMSession $CIMSession -Confirm:$false âForce закÑÑÑÑ ÑÐ°Ð¹Ð»Ñ (оÑкÑÑÑÑ Ðº ним ÑеÑевой доÑÑÑп)
Get-Acl
(Get-Acl \\$srv\xl-share).access доÑÑÑп ACL на ÑÑовне NTFS
Get-Acl C:\Drivers | Set-Acl C:\Distr ÑкопиÑоваÑÑ NTFS ÑазÑеÑÐµÐ½Ð¸Ñ Ñ Ð¾Ð´Ð½Ð¾Ð¹ папки и пÑимениÑÑ Ð¸Ñ
на дÑÑгÑÑ
NTFSSecurity
Install-Module -Name NTFSSecurity -force
Get-Item "\\$srv\xl-share" | Get-NTFSAccess
Add-NTFSAccess -Path "\\$srv\xl-share" -Account "domain\xl-share" -AccessRights Fullcontrol -PassThru добавиÑÑ
Remove-NTFSAccess -Path "\\$srv\xl-share" -Account "domain\xl-share" -AccessRights FullControl -PassThru ÑдалиÑÑ
Get-ChildItem -Path "\\$srv\xl-share" -Recurse -Force | Clear-NTFSAccess ÑдалиÑÑ Ð²Ñе ÑазÑеÑениÑ, без ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑнаÑледованнÑÑ
ÑазÑеÑений
Get-ChildItem -Path "\\$srv\xl-share" -Recurse -Force | Enable-NTFSAccessInheritance вклÑÑиÑÑ NTFS наÑледование Ð´Ð»Ñ Ð²ÑеÑ
обÑекÑов в каÑалоге
Storage
Get-Command -Module Storage
Get-Disk ÑпиÑок логиÑеÑкиÑ
диÑков
Get-Partition оÑобÑазиÑÑ ÑÐ°Ð·Ð´ÐµÐ»Ñ Ð½Ð° вÑеÑ
диÑкаÑ
Get-Volume ÑпиÑок логиÑкиÑ
Ñазделов
Get-PhysicalDisk ÑпиÑок ÑизиÑеÑкиÑ
диÑков
Initialize-Disk 1 âPartitionStyle MBR иниÑиализиÑоваÑÑ Ð´Ð¸Ñк
New-Partition -DriveLetter D âDiskNumber 1 -Size 500gb ÑоздаÑÑ Ñаздел (вÑделиÑÑ Ð²Ñе меÑÑо -UseMaximumSize)
Format-Volume -DriveLetter D -FileSystem NTFS -NewFileSystemLabel Disk-D ÑоÑмаÑиÑоваÑÑ Ñаздел
Set-Partition -DriveLetter D -IsActive $True ÑделаÑÑ Ð°ÐºÑивнÑм
Remove-Partition -DriveLetter D âDiskNumber 1 ÑдалиÑÑ Ñаздел
Clear-Disk -Number 1 -RemoveData оÑиÑÑиÑÑ Ð´Ð¸Ñк
Repair-Volume âdriveletter C âScan Check disk
Repair-Volume âdriveletter C âSpotFix
Repair-Volume âdriverletter C -Scan âCimsession $CIMSession
iSCSI
New-IscsiVirtualDisk -Path D:\iSCSIVirtualDisks\iSCSI2.vhdx -Size 20GB ÑоздаÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑкий vhdx-диÑк (Ð´Ð»Ñ ÑикÑиÑованного ÑазмеÑа -UseFixed)
New-IscsiServerTarget -TargetName iscsi-target-2 -InitiatorIds "IQN:iqn.1991-05.com.microsoft:srv3.contoso.com" ÑоздаÑÑ Target
Get-IscsiServerTarget | fl TargetName, LunMappings
Connect-IscsiTarget -NodeAddress "iqn.1995-05.com.microsoft:srv2-iscsi-target-2-target" -IsPersistent $true подклÑÑиÑÑÑÑ Ð¸Ð½Ð¸ÑиаÑоÑом к ÑаÑгеÑÑ
Get-IscsiTarget | fl
Disconnect-IscsiTarget -NodeAddress "iqn.1995-05.com.microsoft:srv2-iscsi-target-2-target" -Confirm:$false оÑклÑÑиÑÑÑÑ
ActiveDirectory
RSAT (Remote Server Administration Tools)
DISM.exe /Online /add-capability /CapabilityName:Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 /CapabilityName:Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0
Add-WindowsCapability âonline âName Rsat.Dns.Tools~~~~0.0.1.0
Add-WindowsCapability -Online -Name Rsat.DHCP.Tools~~~~0.0.1.0
Add-WindowsCapability âonline âName Rsat.FileServices.Tools~~~~0.0.1.0
Add-WindowsCapability -Online -Name Rsat.WSUS.Tools~~~~0.0.1.0
Add-WindowsCapability -Online -Name Rsat.CertificateServices.Tools~~~~0.0.1.0
Add-WindowsCapability -Online -Name Rsat.RemoteDesktop.Services.Tools~~~~0.0.1.0
Get-WindowsCapability -Name RSAT* -Online | Select-Object -Property DisplayName, State оÑобÑазиÑÑ ÑпиÑок ÑÑÑановленнÑÑ
компаненÑов
Import-Module ActiveDirectory
$Session = New-PSSession -ComputerName $srv -Credential $cred\Export-PSsession -Session $Session -Module ActiveDirectory -OutputModule ActiveDirectoryÑкÑпоÑÑиÑоваÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ Ð¸Ð· Ñдаленной ÑеÑÑи (напÑимеÑ, Ñ DC) \Remove-PSSession -Session $Session\Import-Module ActiveDirectory\Get-Command -Module ActiveDirectory`
ADSI (Active Directory Service Interface)
$d0 = $env:userdnsdomain
$d0 = $d0 -split "\."
$d1 = $d0[0]
$d2 = $d0[1]
$group = [ADSI]"LDAP://OU=Domain Controllers,DC=$d1,DC=$d2"
$group | select *
$Local_User = [ADSI]"WinNT://./ÐдминиÑÑÑаÑоÑ,user"
$Local_User | Get-Member
$Local_User.Description
$Local_User.LastLogin вÑÐµÐ¼Ñ Ð¿Ð¾Ñледней авÑоÑизаÑии локалÑного полÑзоваÑелÑ
LDAP (Lightweight Directory Access Protocol)
$ldapsearcher = New-Object System.DirectoryServices.DirectorySearcher
$ldapsearcher.SearchRoot = "LDAP://OU=Domain Controllers,DC=$d1,DC=$d2"
$ldapsearcher.Filter = "(objectclass=computer)"
$dc = $ldapsearcher.FindAll().path
$usr = $env:username cпиÑок гÑÑпп ÑекÑÑего полÑзоваÑелÑ
$ldapsearcher = New-Object System.DirectoryServices.DirectorySearcher
$ldapsearcher.Filter = "(&(objectCategory=User)(samAccountName=$usr))"
$usrfind = $ldapsearcher.FindOne()
$groups = $usrfind.properties.memberof -replace "(,OU=.+)"
$groups = $groups -replace "(CN=)"
DC (Domain Component) - ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ð´Ð¾Ð¼ÐµÐ½Ð½Ð¾Ð³Ð¾ имени
OU (Organizational Unit) - оÑганизаÑионнÑе подÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ (type), иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ ÑпоÑÑдоÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑов
Container - Ñак же иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑпоÑÑдоÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑов, конÑейнеÑÑ Ð² оÑлиÑии Ð¾Ñ Ð¿Ð¾Ð´Ñаделений не могÑÑ Ð±ÑÑÑ Ð¿ÐµÑеименованÑ, ÑдаленÑ, ÑÐ¾Ð·Ð´Ð°Ð½Ñ Ð¸Ð»Ð¸ ÑвÑÐ·Ð°Ð½Ñ Ñ Ð¾Ð±ÑекÑом гÑÑпповой полиÑики (Computers, Domain Controllers, Users)
DN (Distinguished Name) â ÑникалÑное Ð¸Ð¼Ñ Ð¾Ð±ÑекÑа и меÑÑоположение в леÑÑ AD. Ð DN опиÑÑваеÑÑÑ ÑодеÑжимое аÑÑибÑÑов в деÑеве (пÑÑÑ Ð½Ð°Ð²Ð¸Ð³Ð°Ñии), ÑÑебÑемое Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к конкÑеÑной запиÑи или ее поиÑка
CN (Common Name) - обÑее имÑ
(Get-ADObject (Get-ADRootDSE).DefaultNamingContext -Properties wellKnownObjects).wellKnownObjects оÑобÑазиÑÑ Ð¾ÑобÑазиÑÑ ÐºÐ¾Ð½ÑейнеÑÑ Ð¿Ð¾ ÑмолÑаниÑ
redircmp OU=Client Computers,DC=root,DC=domain,DC=local измениÑÑ ÐºÐ¾Ð½ÑÐµÐ¹Ð½ÐµÑ ÐºÐ¾Ð¼Ð¿ÑÑÑеÑов по ÑмолÑаниÑ
redirusr измениÑÑ ÐºÐ¾Ð½ÑÐµÐ¹Ð½ÐµÑ Ð¿Ð¾Ð»ÑзоваÑелей по ÑмолÑаниÑ
LAPS (Local Admin Password Management)
Import-module AdmPwd.ps импоÑÑиÑоваÑÑ Ð¼Ð¾Ð´ÑлÑ
Get-AdmPwdPassword -ComputerName NAME поÑмоÑÑеÑÑ Ð¿Ð°ÑолÑ
Reset-AdmPwdPassword -ComputerName NAME измениÑÑ Ð¿Ð°ÑолÑ
Get-ADComputer -Filter * -SearchBase "DC=$d1,DC=$d2" | Get-AdmPwdPassword -ComputerName {$_.Name} | select ComputerName,Password,ExpirationTimestamp | Out-GridView
Get-ADComputer -Identity $srv | Get-AdmPwdPassword -ComputerName {$_.Name} | select ComputerName,Password,ExpirationTimestamp
Recycle Bin
УдаленнÑе обÑекÑÑ Ñ
ÑанÑÑÑÑ Ð² коÑзине AD в ÑеÑении вÑемени заÑ
оÑÐ¾Ð½ÐµÐ½Ð¸Ñ (опÑеделÑеÑÑÑ Ð² аÑÑибÑÑе домена msDS-deletedObjectLifetime), заданном Ð´Ð»Ñ Ð»ÐµÑа. Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑо 180 дней. ÐÑли даннÑй ÑÑок пÑоÑел, обÑÐµÐºÑ Ð²Ñе еÑе оÑÑаеÑÑÑ Ð² конÑейнеÑе Deleted Objects, но болÑÑинÑÑво его аÑÑибÑÑов и ÑвÑзей оÑиÑаÑÑÑÑ (Recycled Object). ÐоÑле иÑÑеÑÐµÐ½Ð¸Ñ Ð¿ÐµÑиода tombstoneLifetime (по ÑмолÑÐ°Ð½Ð¸Ñ Ñакже 180 дней, но можно ÑвелиÑиÑÑ) обÑÐµÐºÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ ÑдалÑеÑÑÑ Ð¸Ð· AD авÑомаÑиÑеÑким пÑоÑеÑÑом оÑиÑÑки.
Get-ADForest domain.local оÑобÑазиÑÑ ÑÑÐ¾Ð²ÐµÐ½Ñ ÑабоÑÑ Ð»ÐµÑа
Set-ADForestMode -Identity domain.local -ForestMode Windows2008R2Forest -force ÑвелиÑиÑÑ ÑÑÐ¾Ð²ÐµÐ½Ñ ÑабоÑÑ Ð»ÐµÑа
Enable-ADOptionalFeature âIdentity "CN=Recycle Bin Feature,CN=Optional Features,CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=domain,DC=local" âScope ForestOrConfigurationSet âTarget "domain.local" вклÑÑиÑÑ ÐºÐ¾ÑзинÑ
Get-ADOptionalFeature "Recycle Bin Feature" | select-object name,EnabledScopes еÑли знаÑение EnabledScopes не пÑÑÑое, знаÑÐ¸Ñ Ð² домене коÑзина Active Directory вклÑÑена
Get-ADObject -Filter 'Name -like "*tnas*"' -IncludeDeletedObjects найÑи ÑдаленнÑÑ (Deleted: True) УР(ObjectClass: user) в AD
Get-ADObject -Filter 'Name -like "*tnas*"' âIncludeDeletedObjects -Properties *| select-object Name, sAMAccountName, LastKnownParent, memberOf, IsDeleted | fl пÑовеÑиÑÑ Ð·Ð½Ð°Ñение аÑÑибÑÑа IsDeleted, конÑейнеÑ, в коÑоÑом наÑ
одилÑÑ Ð¿Ð¾Ð»ÑзоваÑеле пеÑед Ñдалением (LastKnownParent) и ÑпиÑок гÑÑпп, в коÑоÑÑÑ
он ÑоÑÑоÑл
Get-ADObject âfilter {Deleted -eq $True -and ObjectClass -eq "user"} âincludeDeletedObjects вÑвеÑÑи ÑпиÑок ÑдаленнÑÑ
полÑзоваÑелей
Restore-ADObject -Identity "3dc33c7c-b912-4a19-b1b7-415c1395a34e" воÑÑÑановиÑÑ Ð¿Ð¾ знаÑÐµÐ½Ð¸Ñ Ð°ÑÑибÑÑа ObjectGUID
Get-ADObject -Filter 'SAMAccountName -eq "tnas-01"' âIncludeDeletedObjects | Restore-ADObject воÑÑÑановиÑÑ Ð¿Ð¾ SAMAccountName
Get-ADObject -Filter {Deleted -eq $True -and ObjectClass -eq 'group' -and Name -like '*Allow*'} âIncludeDeletedObjects | Restore-ADObject âVerbose воÑÑÑановиÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ð¸Ð»Ð¸ компÑÑÑеÑ
thumbnailPhoto
$photo = [byte[]](Get-Content C:\Install\adm.jpg -Encoding byte) пÑеобÑазоваÑÑ Ñайл каÑÑинки в маÑÑив байÑов (jpeg/bmp Ñайл, ÑазмеÑом ÑоÑо до 100 Ðб и ÑазÑеÑением 96?96)
Set-ADUser support4 -Replace @{thumbnailPhoto=$photo} задаÑÑ Ð·Ð½Ð°Ñение аÑÑибÑÑа thumbnailPhoto
ADDomainController
Get-ADDomainController вÑÐ²Ð¾Ð´Ð¸Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑекÑÑем конÑÑоллеÑе домена (LogonServer), коÑоÑÑй иÑполÑзÑеÑÑÑ Ð´Ð°Ð½Ð½Ñм компÑÑÑеÑом Ð´Ð»Ñ Ð°ÑÑенÑиÑикаÑии (DC вÑбиÑаеÑÑÑ Ð¿Ñи загÑÑзке в ÑооÑвеÑÑÑвии Ñ Ñопологией ÑайÑов AD)
Get-ADDomainController -Discover -Service PrimaryDC найÑи конÑÑÐ¾Ð»Ð»ÐµÑ Ñ ÑолÑÑ PDC в домене
Get-ADDomainController -Filter * | ft HostName,IPv4Address,Name,Site,OperatingSystem,IsGlobalCatalog ÑпиÑок вÑе DC, пÑинадлежноÑÑÑ Ðº ÑайÑÑ, веÑÑии ÐС и GC
ÐÑи загÑÑзке ÐС ÑлÑжба NetLogon Ð´ÐµÐ»Ð°ÐµÑ DNS запÑÐ¾Ñ Ñо ÑпиÑком конÑÑоллеÑов домена (к SRV запиÑи _ldap._tcp.dc.msdcs.domain), DNS возвÑаÑÐ°ÐµÑ ÑпиÑок DC в домене Ñ Ð·Ð°Ð¿Ð¸ÑÑÑ Service Location (SRV). ÐÐ»Ð¸ÐµÐ½Ñ Ð´ÐµÐ»Ð°ÐµÑ LDAP запÑÐ¾Ñ Ðº DC Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑайÑа AD по ÑÐ²Ð¾ÐµÐ¼Ñ IP адÑеÑÑ. ÐÐ»Ð¸ÐµÐ½Ñ ÑеÑез DNS запÑаÑÐ¸Ð²Ð°ÐµÑ ÑпиÑок конÑÑоллеÑов домена в ÑайÑе (в Ñазделе _tcp.sitename._sites...).
USN (Update Sequence Numbers) - ÑÑеÑÑик номеÑа поÑледоваÑелÑного обновлениÑ, коÑоÑÑй ÑÑÑеÑÑвÑÐµÑ Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ обÑекÑа AD. ÐÑи ÑепликаÑии конÑÑоллеÑÑ Ð¾Ð±Ð¼ÐµÐ½Ð¸Ð²Ð°ÑÑÑÑ Ð·Ð½Ð°ÑениÑми USN, обÑÐµÐºÑ Ñ Ð±Ð¾Ð»ÐµÐµ низким USN бÑÐ´ÐµÑ Ð¿Ñи ÑепликаÑии пеÑезапиÑан обÑекÑом Ñ Ð±Ð¾Ð»ÐµÐµ вÑÑоким USN. ÐÐ°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² ÑвойÑÑÐ²Ð°Ñ - Object (вклÑÑиÑÑ View - Advanced Features). ÐаждÑй конÑÑÐ¾Ð»Ð»ÐµÑ Ð´Ð¾Ð¼ÐµÐ½Ð° ÑодеÑÐ¶Ð¸Ñ Ð¾ÑделÑнÑй ÑÑеÑÑик USN, коÑоÑÑй наÑÐ¸Ð½Ð°ÐµÑ Ð¾ÑÑÑÐµÑ Ð² Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð·Ð°Ð¿ÑÑка пÑоÑеÑÑа Dcpromo и пÑÐ¾Ð´Ð¾Ð»Ð¶Ð°ÐµÑ ÑвелиÑиваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² ÑеÑение вÑего вÑемени ÑÑÑеÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½ÑÑоллеÑа домена. ÐнаÑение ÑÑеÑÑика USN ÑвелиÑиваеÑÑÑ ÐºÐ°Ð¶Ð´Ñй Ñаз, когда на конÑÑоллеÑе домена пÑоиÑÑ Ð¾Ð´Ð¸Ñ ÑÑанзакÑиÑ, ÑÑо опеÑаÑии ÑозданиÑ, Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑа.
Get-ADDomainController -Filter * | % { оÑобÑазиÑÑ USN обÑекÑа на вÑеÑ
DC в домене\Get-ADUser -Server $_.HostName -Identity support4 -Properties uSNChanged | select SamAccountName,uSNChanged\}`
dcpromo /forceremoval пÑинÑдиÑелÑно вÑÐ¿Ð¾Ð»Ð½Ð¸Ñ Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð¸Ðµ в Ñоли конÑÑоллеÑа домена до ÑÑÐ¾Ð²Ð½Ñ ÑÑдового ÑеÑвеÑа. ÐоÑле Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð¸Ñ Ñоли вÑполнÑеÑÑÑ Ñдаление вÑеÑ
ÑÑÑлок в домене на ÑÑÐ¾Ñ ÐºÐ¾Ð½ÑÑоллеÑ. Ðалее пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ Ð²ÐºÐ»ÑÑение ÑеÑвеÑа в ÑоÑÑав домена, и вÑполнение обÑаÑного пÑоÑеÑÑа, Ñ.е. повÑÑение ÑеÑвеÑа до ÑÑÐ¾Ð²Ð½Ñ ÐºÐ¾Ð½ÑÑоллеÑа домена.
ADComputer
nltest /DSGETDC:$env:userdnsdomain ÑзнаÑÑ Ð½Ð° каком DC аÑденÑиÑиÑиÑован Ñ
оÑÑ (Logon Server)
nltest /SC_RESET:$env:userdnsdomain\srv-dc2.$env:userdnsdomain пеÑеклÑÑиÑÑ ÐºÐ¾Ð¼Ð¿ÑÑÑÐµÑ Ð½Ð° дÑÑгой конÑÑÐ¾Ð»Ð»ÐµÑ Ð´Ð¾Ð¼ÐµÐ½Ð° AD вÑÑÑнÑÑ (The command completed successfully)
Get-ADComputer âIdentity $env:computername -Properties PasswordLastSet вÑÐµÐ¼Ñ Ð¿Ð¾Ñледней ÑÐ¼ÐµÐ½Ñ Ð¿Ð°ÑÐ¾Ð»Ñ Ð½Ð° ÑеÑвеÑе
Test-ComputerSecureChannel âverbose пÑовеÑиÑÑ Ð´Ð¾Ð²ÐµÑиÑелÑнÑе оÑноÑÐµÐ½Ð¸Ñ Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð¼ (ÑооÑвеÑÑÑвÑÐµÑ Ð»Ð¸ локалÑнÑй паÑÐ¾Ð»Ñ ÐºÐ¾Ð¼Ð¿ÑÑÑеÑа паÑолÑ, Ñ
ÑанÑÑемÑÑÑ Ð² AD)
Reset-ComputerMachinePassword -Credential domain\admin пÑинÑдиÑелÑно обновиÑÑ Ð¿Ð°ÑолÑ
Netdom ResetPWD /Server:dc-01 /UserD:domain\admin /PasswordD:* ÑбÑоÑиÑÑ Ñ
ÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ ÐºÐ¾Ð¼Ð¿ÑÑÑеÑа в домене (пеÑезагÑÑзка не ÑÑебÑеÑÑÑ)
Search-ADAccount -AccountDisabled -ComputersOnly | select Name,LastLogonDate,Enabled оÑобÑазиÑÑ Ð²Ñе оÑклÑÑеннÑе компÑÑÑеÑÑ
Get-ADComputer -Filter * -Properties * | select name ÑпиÑок вÑеÑ
компÑÑÑеÑов в домене (Filter), вÑвеÑÑи вÑе ÑвойÑÑва (Properties)
Get-ADComputer -Identity $srv -Properties * | ft Name,LastLogonDate,PasswordLastSet,ms-Mcs-AdmPwd -Autosize конкÑеÑного компÑÑÑеÑа в AD (Identity)
Get-ADComputer -SearchBase "OU=Domain Controllers,DC=$d1,DC=$d2" -Filter * -Properties * | ft Name, LastLogonDate, distinguishedName -Autosize поиÑк в базе по DN (SearchBase)
(Get-ADComputer -Filter {enabled -eq "true"}).count полÑÑиÑÑ Ð¾Ð±Ñее колиÑеÑÑво акÑивнÑÑ
(незаблокиÑованнÑÑ
) компÑÑÑеÑов
(Get-ADComputer -Filter {enabled -eq "true" -and OperatingSystem -like "*Windows Server 2016*"}).count кол-во акÑивнÑÑ
копÑÑÑеÑов Ñ ÐС WS 2016
Get-ADComputer -Filter * -Properties * | select @{Label="Ping Status"; Expression={
$ping = ping -n 1 -w 50 $_.Name
if ($ping -match "TTL") {"Online"} else {"Offline"}
}},
@{Label="Status"; Expression={
if ($_.Enabled -eq "True") {$_.Enabled -replace "True","Active"} else {$_.Enabled -replace "False","Blocked"}
}}, Name, IPv4Address, OperatingSystem, @{Label="UserOwner"; Expression={$_.ManagedBy -replace "(CN=|,.+)"}
},Created | Out-GridView
ADUser
Get-ADUser -Identity support4 -Properties * ÑпиÑок вÑеÑ
аÑÑибÑÑов
Get-ADUser -Identity support4 -Properties DistinguishedName, EmailAddress, Description пÑÑÑ DN, email и опиÑание
Get-ADUser -Filter {(Enabled -eq "True") -and (mail -ne "null")} -Properties mail | ft Name,mail ÑпиÑок акÑивнÑÑ
полÑзоваÑелей и еÑÑÑ Ð¿Ð¾ÑÑовÑй ÑÑик
Get-ADUser -Filter {SamAccountName -like "*"} | Measure-Object поÑÑиÑаÑÑ ÐºÐ¾Ð»-во вÑеÑ
аккаÑнÑов (Count)
Get-ADUser -Filter * -Properties WhenCreated | sort WhenCreated | ft Name, whenCreated даÑа ÑозданиÑ
Get-ADUser -Identity support4 -property LockedOut | select samaccountName,Name,Enabled,Lockedout
Enabled=True ÑÑеÑÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð²ÐºÐ»ÑÑена - да
Lockedout=False ÑÑеÑÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñована (напÑимеÑ, полиÑикой паÑолей) - неÑ
Get-ADUser -Identity support4 | Unlock-ADAccount ÑазблокиÑоваÑÑ ÑÑеÑнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ
Disable-ADAccount -Identity support4 оÑклÑÑиÑÑ ÑÑеÑнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ
Enable-ADAccount -Identity support4 вклÑÑиÑÑ ÑÑеÑнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ
Search-ADAccount -LockedOut найÑи вÑе заблокиÑованнÑе ÑÑеÑнÑе запиÑи
Search-ADAccount -AccountDisabled | select Name,LastLogonDate,Enabled оÑобÑазиÑÑ Ð²Ñе оÑклÑÑеннÑе ÑÑеÑнÑе запиÑи Ñ Ð²Ñеменем поÑледнего вÑ
ода
Get-ADUser -Identity support4 -Properties PasswordLastSet,PasswordExpired,PasswordNeverExpires
PasswordLastSet вÑÐµÐ¼Ñ Ð¿Ð¾Ñледней ÑÐ¼ÐµÐ½Ñ Ð¿Ð°ÑолÑ
PasswordExpired=False паÑÐ¾Ð»Ñ Ð¸ÑÑек - неÑ
PasswordNeverExpires=True ÑÑок дейÑÑÐ²Ð¸Ñ Ð¿Ð°ÑÐ¾Ð»Ñ Ð½Ðµ иÑÑÐµÐºÐ°ÐµÑ - да
Set-ADAccountPassword support4 -Reset -NewPassword (ConvertTo-SecureString -AsPlainText "password" -Force -Verbose) измениÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ ÑÑеÑной запиÑи
Set-ADUser -Identity support4 -ChangePasswordAtLogon $True Ñмена паÑÐ¾Ð»Ñ Ð¿Ñи ÑледÑÑÑем вÑ
оде в ÑиÑÑемÑ
$day = (Get-Date).adddays(-90)
Get-ADUser -filter {(passwordlastset -le $day)} | ft полÑзоваÑели, коÑоÑÑе не менÑли Ñвой паÑÐ¾Ð»Ñ Ð±Ð¾Ð»ÑÑе 90 дней
$day = (Get-Date).adddays(-30)
Get-ADUser -filter {(Created -ge $day)} -Property Created | select Name,Created ÐовÑе полÑзоваÑели за 30 дней
$day = (Get-Date).adddays(-360)
Get-ADUser -Filter {(LastLogonTimestamp -le $day)} -Property LastLogonTimestamp | select Name,SamAccountName,@{n='LastLogonTimestamp';e={[DateTime]::FromFileTime($_.LastLogonTimestamp)}} | sort -Descending LastLogonTimestamp полÑзоваÑели, коÑоÑÑе не логинилиÑÑ Ð±Ð¾Ð»ÑÑе 360 дней. РепликаÑÐ¸Ñ Ð°ÑÑибÑÑа LastLogonTimestamp ÑоÑÑавлÑÐµÑ Ð¾Ñ 9 до 14 дней.
| Disable-ADAccount $_.SamAccountName заблокиÑоваÑÑ
-WhatIf оÑобÑазиÑÑ Ð²Ñвод без пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹
ADGroupMember
(Get-ADUser -Identity support4 -Properties MemberOf).memberof ÑпиÑок гÑÑпп в коÑоÑÑÑ
ÑоÑÑÐ¾Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ
Get-ADGroupMember -Identity "Domain Admins" | Select Name,SamAccountName ÑпиÑок полÑзоваÑелей в гÑÑппе
Add-ADGroupMember -Identity "Domain Admins" -Members support5 добавиÑÑ Ð² гÑÑппÑ
Remove-ADGroupMember -Identity "Domain Admins" -Members support5 -force ÑдалиÑÑ Ð¸Ð· гÑÑппÑ
Get-ADGroup -filter * | where {!($_ | Get-ADGroupMember)} | Select Name оÑобÑазиÑÑ ÑпиÑок пÑÑÑÑÑ
гÑÑпп (-Not)
ADReplication
Get-Command -Module ActiveDirectory -Name *Replication* ÑпиÑок вÑеÑ
командлеÑов модÑлÑ
Get-ADReplicationFailure -Target dc-01 ÑпиÑок оÑибок ÑепликаÑии Ñ Ð¿Ð°ÑÑнеÑами
Get-ADReplicationFailure -Target $env:userdnsdomain -Scope Domain
Get-ADReplicationPartnerMetadata -Target dc-01 | select Partner,LastReplicationAttempt,LastReplicationSuccess,LastReplicationResult,LastChangeUsn вÑÐµÐ¼Ñ Ð¿Ð¾Ñледней и вÑÐµÐ¼Ñ ÑÑпеÑной ÑепликаÑии Ñ Ð¿Ð°ÑÑнеÑами
Get-ADReplicationUpToDatenessVectorTable -Target dc-01 Update Sequence Number (USN) ÑвелиÑиваеÑÑÑ ÐºÐ°Ð¶Ð´Ñй Ñаз, когда на конÑÑоллеÑе домена пÑоиÑÑ
Ð¾Ð´Ð¸Ñ ÑÑанзакÑÐ¸Ñ (опеÑаÑии ÑозданиÑ, Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑа), пÑи ÑепликаÑии DC обмениваÑÑÑÑ Ð·Ð½Ð°ÑениÑми USN, обÑÐµÐºÑ Ñ Ð±Ð¾Ð»ÐµÐµ низким USN пÑи ÑепликаÑии бÑÐ´ÐµÑ Ð¿ÐµÑезапиÑан вÑÑоким USN.
repadmin
repadmin /replsummary оÑобÑÐ°Ð¶Ð°ÐµÑ Ð²ÑÐµÐ¼Ñ Ð¿Ð¾Ñледней ÑепликаÑии на вÑеÑ
DC по напÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ (Source и Destination) и иÑ
ÑоÑÑоÑние Ñ ÑÑеÑом паÑÑнеÑов
repadmin /showrepl $srv оÑобÑÐ°Ð¶Ð°ÐµÑ Ð²ÑеÑ
паÑÑнеÑов по ÑеплкаÑии и иÑ
ÑÑаÑÑÑ Ð´Ð»Ñ Ð²ÑеÑ
Ñазделов Naming Contexts (DC=ForestDnsZones, DC=DomainDnsZones, CN=Schema, CN=Configuration)
repadmin /replicate $srv2 $srv1 DC=domain,DC=local вÑполниÑÑ ÑепликаÑÐ¸Ñ Ñ $srv1 на $srv2 ÑолÑко ÑказаннÑй Ñаздела домена
repadmin /SyncAll /AdeP запÑÑÑиÑÑ Ð¼ÐµÐ¶ÑайÑовÑÑ Ð¸ÑÑ
одÑÑÑÑ ÑепликаÑÐ¸Ñ Ð²ÑеÑ
Ñазделов Ð¾Ñ ÑекÑÑего ÑеÑвеÑа Ñо вÑеми паÑÑнеÑами по ÑепликаÑии
/A вÑполниÑÑ Ð´Ð»Ñ Ð²ÑеÑ
Ñазделов NC
/d в ÑообÑениÑÑ
иденÑиÑиÑиÑоваÑÑ ÑеÑвеÑÑ Ð¿Ð¾ DN (вмеÑÑо GUID DNS - глобалÑнÑм ÑникалÑнÑм иденÑиÑикаÑоÑам)
/e межÑайÑÐ¾Ð²Ð°Ñ ÑинÑ
ÑонизаÑÐ¸Ñ (по ÑмолÑÐ°Ð½Ð¸Ñ ÑинÑ
ÑонизиÑÑÐµÑ ÑолÑко Ñ DC ÑекÑÑего ÑайÑа)
/P извеÑаÑÑ Ð¾Ð± изменениÑÑ
Ñ ÑÑого ÑеÑвеÑа (по ÑмолÑаниÑ: опÑаÑиваÑÑ Ð¾Ð± изменениÑÑ
)
repadmin /Queue $srv оÑобÑÐ°Ð¶Ð°ÐµÑ ÐºÐ¾Ð»-во запÑоÑов вÑ
одÑÑей ÑепликаÑии (оÑеÑедÑ), коÑоÑое необÑ
одимо обÑабоÑаÑÑ (пÑиÑиной Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±Ð¾Ð»ÑÑое кол-во паÑÑнеÑов или ÑоÑмиÑование 1000 обÑекÑов ÑкÑипÑом)
repadmin /showbackup * ÑзнаÑÑ Ð´Ð°ÑÑ Ð¿Ð¾Ñледнего Backup
Error: 1722 ÑеÑÐ²ÐµÑ rpc недоÑÑÑпен (оÑибка оÑкаÑа ÑепликаÑии). ÐÑовеÑиÑÑ Ð¸Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ð° в наÑÑÑойкаÑ
ÑеÑевого адапÑеÑа, пеÑвÑм должен идÑи адÑÐµÑ DNS-ÑеÑвеÑа дÑÑгого конÑÑоллеÑа домена, вÑоÑÑм Ñвой адÑеÑ.
Get-Service -ComputerName $srv | select name,status | ? name -like "RpcSs"
Get-Service -ComputerName $srv -Name RpcSs -RequiredServices завиÑимÑе ÑлÑжбÑ
ÐавиÑимÑе ÑлÑÐ¶Ð±Ñ RPC:
"СлÑжба Ñведений о подклÑÑеннÑÑ
ÑеÑÑÑ
" - должен бÑÑÑ Ð²ÐºÐ»ÑÑен оÑложеннÑй запÑÑк. ÐÑли ÑлÑжба ÑÑабаÑÑÐ²Ð°ÐµÑ Ð´Ð¾ "ÑлÑÐ¶Ð±Ñ ÑпиÑка ÑеÑей", Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð°Ð´Ð°ÑÑ ÑвÑÐ·Ñ Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð¼ (netlogon)
"ЦенÑÑ ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ ÐºÐ»ÑÑей Kerberos"
"DNS-ÑеÑвеÑ"
nslookup $srv
tnc $srv -p 135
repadmin /retry повÑоÑиÑÑ Ð¿Ð¾Ð¿ÑÑÐºÑ Ð¿ÑивÑзки к ÑÐµÐ»ÐµÐ²Ð¾Ð¼Ñ DC, еÑли бÑла оÑибка 1722 или 1753 (RPC недоÑÑÑпен)
repadmin /showrepl $srv
Last attempt @ 2022-07-15 10:46:01 завеÑÑена Ñ Ð¾Ñибкой, ÑезÑлÑÑÐ°Ñ 8456 (0x2108) пÑи пÑовеÑки showrepl ÑÑого паÑÑнеÑа, его оÑибка: 8457 (0x2109)
Last success @ 2022-07-11 02:29:46 поÑледний ÑÑпеÑ
Ðогда ÑепликаÑÐ¸Ñ Ð°Ð²ÑомаÑиÑеÑки оÑклÑÑена, ÐС запиÑÑÐ²Ð°ÐµÑ Ð² DSA - not writable одно из ÑеÑÑÑеÑ
знаÑений:
Path: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\NTDS\Parameters
Dsa Not Writable
#define DSA_WRITABLE_GEN 1 веÑÑÐ¸Ñ Ð»ÐµÑа неÑовмеÑÑима Ñ ÐС
#define DSA_WRITABLE_NO_SPACE 2 на диÑке, где ÑазмеÑена база даннÑÑ
Active Directory или ÑÐ°Ð¹Ð»Ñ Ð¶ÑÑналов (логи), недоÑÑаÑоÑно Ñвободного меÑÑа
#define DSA_WRITABLE_USNROLLBCK 4 оÑÐºÐ°Ñ USN пÑоизоÑел из-за непÑавилÑного оÑкаÑа Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
Active Directory во вÑемени (воÑÑÑановление из ÑнапÑоÑа)
#define DSA_WRITABLE_CORRUPT_UTDV 8 векÑÐ¾Ñ Ð°ÐºÑÑалÑноÑÑи повÑежден на локалÑном конÑÑоллеÑе домена
dcdiag
dcdiag /s:<DomainController> [/n:<NamingContext>] [[/u:<domain\user>] [/p:<password>]] [{/a|/e}{/q|/v}] [/f:<LogFile>] [/ferr:<ErrorLog>] [/test:<test>] [/fix]
dcdiag /Test:replications /s:dc-01 оÑобÑÐ°Ð¶Ð°ÐµÑ Ð¾Ñибки ÑепликаÑии
dcdiag /Test:DNS /e /v /q ÑеÑÑ DNS
/a пÑовеÑка вÑеÑ
ÑеÑвеÑов данного ÑайÑа
/e пÑовеÑка вÑеÑ
ÑеÑвеÑов пÑедпÑиÑÑиÑ
/q вÑводиÑÑ ÑолÑко ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибкаÑ
/v вÑводиÑÑ Ð¿Ð¾Ð´ÑобнÑÑ Ð¸Ð½ÑоÑмаÑиÑ
/fix авÑомаÑиÑеÑки иÑпÑавлÑÐµÑ Ð¾Ñибки
/test:
NetLogons пÑовеÑка налиÑие пÑав на вÑполнение ÑепликаÑии
Connectivity пÑовеÑÑÐµÑ ÑегиÑÑÑаÑÐ¸Ñ DNS Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ конÑÑоллеÑа домена, оÑпÑавлÑÐµÑ ÑеÑÑовÑй ÑÑ
о-Ð¿Ð°ÐºÐµÑ Ð½Ð° каждÑй конÑÑÐ¾Ð»Ð»ÐµÑ Ð´Ð¾Ð¼ÐµÐ½Ð° и пÑовеÑÑÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑение по пÑоÑоколам LDAP и RPC к ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÐºÐ¾Ð½ÑÑоллеÑÑ Ð´Ð¾Ð¼ÐµÐ½Ð°
Services пÑовеÑÑÐµÑ ÑабоÑоÑпоÑобноÑÑÑ Ð²ÑеÑ
ÑлÑжб, необÑ
одимÑÑ
Ð´Ð»Ñ ÑабоÑÑ ÐºÐ¾Ð½ÑÑоллеÑа домена, на Ñказанном конÑÑоллеÑе домена
Systemlog пÑовеÑÑÐµÑ Ð½Ð°Ð»Ð¸Ñие оÑибок в жÑÑналаÑ
конÑÑоллеÑа домена
FRSEvent пÑовеÑÑÐµÑ Ð¾Ñибки ÑепликаÑии в ÑабоÑе ÑлÑÐ¶Ð±Ñ ÑепликаÑии Ñайлов, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð·Ð½Ð°ÑаÑÑ Ð½Ð°Ð»Ð¸Ñие пÑоблем в ÑепликаÑии SYSVOL и, Ñаким обÑазом, ÑелоÑÑноÑÑи копий обÑекÑов гÑÑпповÑÑ
полиÑик
FSMOCheck не пÑовеÑÑÐµÑ Ñоли Ñ
озÑев опеÑаÑий, а вмеÑÑо ÑÑого запÑаÑÐ¸Ð²Ð°ÐµÑ ÑеÑÐ²ÐµÑ Ð³Ð»Ð¾Ð±Ð°Ð»Ñного каÑалога, пеÑвиÑнÑй конÑÑÐ¾Ð»Ð»ÐµÑ Ð´Ð¾Ð¼ÐµÐ½Ð°, пÑедпоÑÑиÑелÑнÑй ÑеÑÐ²ÐµÑ Ð²Ñемени, ÑеÑÐ²ÐµÑ Ð²Ñемени и ÑенÑÑ ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ ÐºÐ»ÑÑей (конÑÑÐ¾Ð»Ð»ÐµÑ Ð´Ð¾Ð¼ÐµÐ½Ð° Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑиÑÑÑÑ Ðº KDC, PDC, ÑеÑвеÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»Ñного каÑалога)
KnowsOfRoleHolders пgÑовеÑÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑÑоллеÑов домена ко вÑем пÑÑи Ñ
озÑевам опеÑаÑий (ÑолÑми FSMO)
MachineAccount пÑовеÑÑÐµÑ Ð¿ÑавилÑноÑÑÑ ÑегиÑÑÑаÑии ÑÑеÑной запиÑи Ñелевого компÑÑÑеÑа и пÑавилÑноÑÑÑ Ð¾Ð±ÑÑвлений ÑлÑжб ÑÑого компÑÑÑеÑа (коÑÑекÑноÑÑÑ Ð´Ð¾Ð²ÐµÑиÑелÑнÑÑ
оÑноÑÐµÐ½Ð¸Ñ Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð¼). ÐÑли обнаÑÑжена оÑибка, ее можно иÑпÑавиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑилиÑÑ dcdiag, Ñказав паÑамеÑÑÑ /fixmachineaccount или /recreatemachineaccount
Advertising пÑовеÑÑеÑ, пÑавилÑно ли конÑÑÐ¾Ð»Ð»ÐµÑ Ð´Ð¾Ð¼ÐµÐ½Ð° ÑообÑÐ°ÐµÑ Ð¾ Ñебе и о Ñвоей Ñоли Ñ
озÑина опеÑаÑий. ÐÑÐ¾Ñ ÑеÑÑ Ð·Ð°Ð²ÐµÑÑиÑÑÑÑ Ð½ÐµÑдаÑно, еÑли ÑлÑжба NetLogon не запÑÑена
CheckSDRefDom пÑовеÑÑÐµÑ Ð¿ÑавилÑноÑÑÑ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð² ÑÑÑлок деÑкÑипÑоÑов безопаÑноÑÑи Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñаздела каÑалогов пÑогÑамм
CrossRefValidation пÑовеÑÑÐµÑ Ð¿ÑавилÑноÑÑÑ Ð¿ÐµÑекÑеÑÑнÑÑ
ÑÑÑлок Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð²
RRSSysvol пÑовеÑÑÐµÑ ÑоÑÑоÑние гоÑовноÑÑи Ð´Ð»Ñ FRS SYSVOL
Intersite пÑовеÑÑÐµÑ Ð½Ð°Ð»Ð¸Ñие оÑибок, коÑоÑÑе могÑÑ Ð¿Ð¾Ð¼ÐµÑаÑÑ Ð½Ð¾ÑмалÑной ÑепликаÑии Ð¼ÐµÐ¶Ð´Ñ ÑайÑами. ÐÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ Microsoft пÑедÑпÑеждаеÑ, ÑÑо иногда ÑезÑлÑÑаÑÑ ÑÑого ÑеÑÑа могÑÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð½ÐµÑоÑнÑми
KCCEvent пÑовеÑÑÐµÑ Ð±ÐµÐ·Ð¾ÑибоÑноÑÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов Ñоединений Ð´Ð»Ñ ÑепликаÑии Ð¼ÐµÐ¶Ð´Ñ ÑайÑами
NCSecDesc пÑовеÑÑÐµÑ Ð¿ÑавилÑноÑÑÑ ÑазÑеÑений Ð´Ð»Ñ ÑепликаÑии в деÑкÑипÑоÑаÑ
безопаÑноÑÑи Ð´Ð»Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð² конÑекÑÑа именованиÑ
ObjectsReplicated пÑовеÑÑÐµÑ Ð¿ÑавилÑноÑÑÑ ÑепликаÑии агенÑа ÑеÑвеÑа каÑалогов и обÑекÑов ÑÑеÑнÑÑ
запиÑей компÑÑÑеÑов
OutboundSecureChannels пÑовеÑÑеÑÑÑ Ð½Ð°Ð»Ð¸Ñие безопаÑнÑÑ
каналов Ð¼ÐµÐ¶Ð´Ñ Ð²Ñеми конÑÑоллеÑами домена в инÑеÑеÑÑÑÑем домене
Replications пÑовеÑÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑепликаÑии Ð¼ÐµÐ¶Ð´Ñ ÐºÐ¾Ð½ÑÑоллеÑами домена и ÑообÑÐ°ÐµÑ Ð¾Ð±Ð¾ вÑеÑ
оÑибкаÑ
пÑи ÑепликаÑии
RidManager пÑовеÑÑÐµÑ ÑабоÑоÑпоÑобноÑÑÑ Ð¸ доÑÑÑпноÑÑÑ Ñ
озÑина оÑноÑиÑелÑнÑÑ
иденÑиÑикаÑоÑов
VerifyEnterpriseReferences пÑовеÑÑÐµÑ Ð´ÐµÐ¹ÑÑвиÑелÑноÑÑÑ ÑиÑÑемнÑÑ
ÑÑÑлок ÑлÑÐ¶Ð±Ñ ÑепликаÑии Ñайлов Ð´Ð»Ñ Ð²ÑеÑ
обÑекÑов на вÑеÑ
конÑÑоллеÑаÑ
домена в леÑÑ
VerifyReferences пÑовеÑÑÐµÑ Ð´ÐµÐ¹ÑÑвиÑелÑноÑÑÑ ÑиÑÑемнÑÑ
ÑÑÑлок ÑлÑÐ¶Ð±Ñ ÑепликаÑии Ñайлов Ð´Ð»Ñ Ð²ÑеÑ
обÑекÑов на Ñказанном конÑÑоллеÑе домена
VerifyReplicas пÑовеÑÑÐµÑ Ð´ÐµÐ¹ÑÑвиÑелÑноÑÑÑ Ð²ÑеÑ
Ñазделов каÑалога пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° вÑеÑ
ÑеÑвеÑаÑ
, пÑинимаÑÑиÑ
ÑÑаÑÑие в ÑепликаÑии
ntdsutil
ÐеÑÐµÐ½Ð¾Ñ ÐÐ AD (ntds.dit):
Get-Acl C:\Windows\NTDS | Set-Acl D:\AD-DB ÑкопиÑоваÑÑ NTFS ÑазÑеÑÐµÐ½Ð¸Ñ Ð½Ð° новÑй каÑалог
Stop-Service -ComputerName dc -name NTDS оÑÑановиÑÑ ÑлÑÐ¶Ð±Ñ Active Directory Domain Services
ntdsutil запÑÑÑиÑÑ ÑÑилиÑÑ ntdsutil
activate instance NTDS вÑбÑаÑÑ Ð°ÐºÑивнÑй ÑкземплÑÑ Ð±Ð°Ð·Ñ AD
files пеÑейдем в конÑекÑÑ files, в коÑоÑом возможно вÑполнение опеÑаÑÐ¸Ñ Ñ Ñайлами Ð±Ð°Ð·Ñ ntds.dit
move DB to D:\AD-DB\ пеÑенеÑÑи Ð±Ð°Ð·Ñ AD в новÑй каÑалог (пÑедваÑиÑелÑно нÑжно его ÑоздаÑÑ)
info пÑовеÑиÑÑ, ÑÑо ÐРнаÑ
одиÑÑÑ Ð² новом каÑалоге
move logs to D:\AD-DB\ пеÑемеÑÑим в ÑÐ¾Ñ Ð¶Ðµ каÑалог ÑÐ°Ð¹Ð»Ñ Ñ Ð¶ÑÑналами ÑÑанзакÑий
quit
Start-Service -ComputerName dc -name NTDS
СбÑÐ¾Ñ Ð¿Ð°ÑÐ¾Ð»Ñ DSRM (Ñежим воÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑлÑжб каÑалогов):
ntdsutil
set dsrm password
reset password on server NULL
новÑй паÑолÑ
подÑвеÑждение паÑолÑ
quit
quit
СинÑ
ÑонизиÑоваÑÑ Ñ Ð¿Ð°Ñолем УРв AD:
ntdsutil
set dsrm password
sync from domain account dsrmadmin
quit
quit
ÐÑибка 0x00002e2 пÑи загÑÑзке ÐС.
ÐагÑÑзиÑÑÑÑ Ð² Ñежиме воÑÑÑÐ°Ð½Ð°Ð²Ð»ÐµÐ½Ð¸Ñ WinRE (Windows Recovery Environment) - Startup Settings - Restart - DSRM (Directory Services Restore Mode)
reagentc /boottore shutdown /f /r /o /t 0 пеÑезагÑÑзка в Ñежиме WinRE - ÐС на базе WinPE (Windows Preinstallation Environment), обÑаз winre.wim наÑ
одиÑÑÑ Ð½Ð° ÑкÑÑÑом Ñазделе System Restore
Ðа конÑÑоллеÑе домена единÑÑÐ²ÐµÐ½Ð½Ð°Ñ Ð»Ð¾ÐºÐ°Ð»ÑÐ½Ð°Ñ ÑÑеÑÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ â админиÑÑÑаÑÐ¾Ñ DSRM. ÐаÑÐ¾Ð»Ñ ÑоздаеÑÑÑ Ð¿Ñи ÑÑÑановке Ñоли конÑÑоллеÑа домена ADDS на ÑеÑвеÑе (SafeModeAdministratorPassword).
ntdsutil
activate instance ntds
Files
Info
integrity пÑовеÑиÑÑ ÑелоÑÑноÑÑÑ ÐÐ
ÐÑибка: Failed to open DIT for AD DS/LDS instance NTDS. Error -2147418113
mkdir c:\ntds_bak
xcopy c:\Windows\NTDS\*.* c:\ntds_bak backup ÑодеÑжимого каÑалога Ñ ÐÐ
esentutl /g c:\windows\ntds\ntds.dit пÑовеÑим ÑелоÑÑноÑÑÑ Ñайла
ÐÑвод: Integrity check completed. Database is CORRUPTED оÑибка, база AD повÑеждена
esentutl /p c:\windows\ntds\ntds.dit иÑпÑавиÑÑ Ð¾Ñибки
ÐÑвод: Operation completed successfully in xx seconds. Ð½ÐµÑ Ð¾Ñибок
esentutl /g c:\windows\ntds\ntds.dit пÑовеÑим ÑелоÑÑноÑÑÑ Ñайла
ÐÑполниÑÑ Ð°Ð½Ð°Ð»Ð¸Ð· ÑеманÑики Ð±Ð°Ð·Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ntdsutil:
ntdsutil
activate instance ntds
semantic database analysis
go
go fixup иÑпÑавиÑÑ ÑеманÑиÑеÑкие оÑибки
СжаÑÑ Ñайл ÐÐ:
activate instance ntds
files
compact to C:\Windows\NTDS\TEMP
copy C:\Windows\NTDS\TEMP\ntds.dit C:\Windows\NTDS\ntds.dit замениÑÑ Ð¾ÑигиналÑнÑй Ñайл ntds.dit
Del C:\Windows\NTDS\*.log ÑдалиÑÑ Ð²Ñе лог ÑÐ°Ð¹Ð»Ñ Ð¸Ð· каÑалога NTDS
GPO
Get-Command -Module GroupPolicy
Get-GPO -Domain domain.local -All | ft
Get-GPO -Name LAPS
[xml](Get-GPOReport LAPS -ReportType Xml)
Get-GPPermission -Name LAPS -All
Get-GPO LAPS | New-GPLink -Target "ou=servers,dc=domain,dc=local"
Set-GPLink -Name LAPS -Target "ou=servers,dc=domain,dc=local" -LinkEnabled No
Backup-GPO -Name LAPS -Path "$home\Desktop"
Backup-GPO -All -Path "$home\Desktop"
Restore-GPO -Name LAPS -Path C:\Backup\GPOs\
ServerManager
Get-Command *WindowsFeature* source module ServerManager
Get-WindowsFeature -ComputerName "localhost"
Get-WindowsFeature | where Installed -eq $True ÑпиÑок ÑÑÑановленнÑÑ
Ñолей и компоненÑов
Get-WindowsFeature | where FeatureType -eq "Role" оÑÑоÑÑиÑоваÑÑ Ð¿Ð¾ ÑпиÑÐºÑ Ñолей
Install-WindowsFeature -Name DNS ÑÑÑановиÑÑ ÑолÑ
Get-Command *DNS*
Get-DnsServerSetting -ALL
Uninstall-WindowsFeature -Name DNS ÑдалиÑÑ ÑолÑ
PSWA
Install-WindowsFeature -Name WindowsPowerShellWebAccess -IncludeManagementTools
Install-PswaWebApplication -UseTestCertificate СоздаÑÑ Ð²ÐµÐ±-пÑиложение /pswa
Add-PswaAuthorizationRule -UserGroupName "$domain\Domain Admins" -ComputerName * -ConfigurationName * -RuleName "For Admins" добавиÑÑ Ð¿Ñава авÑоÑизаÑии
WSB (Windows Server Backup)
ÐÑи Ñоздании backup DC ÑеÑез WSB, ÑоздаеÑÑÑ ÐºÐ¾Ð¿Ð¸Ñ ÑоÑÑоÑÐ½Ð¸Ñ ÑиÑÑÐµÐ¼Ñ (System State), кÑда Ð¿Ð¾Ð¿Ð°Ð´Ð°ÐµÑ Ð±Ð°Ð·Ð° AD (NTDS.DIT), обÑекÑÑ Ð³ÑÑпповÑÑ
полиÑик, ÑодеÑжимое каÑалога SYSVOL, ÑееÑÑÑ, меÑаданнÑе IIS, база AD CS, и дÑÑгие ÑиÑÑемнÑе ÑÐ°Ð¹Ð»Ñ Ð¸ ÑеÑÑÑÑÑ. РезеÑÐ²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ ÑоздаеÑÑÑ ÑеÑез ÑлÑÐ¶Ð±Ñ Ñеневого копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ VSS.
Get-WindowsFeature Windows-Server-Backup пÑовеÑиÑÑ ÑÑÑановлена ли ÑолÑ
Add-Windowsfeature Windows-Server-Backup âIncludeallsubfeature ÑÑÑановиÑÑ ÑолÑ
$path="\\$srv\bak-dc\dc-03\"
[string]$TargetUNC=$path+(get-date -f 'yyyy-MM-dd')
if ((Test-Path -Path $path) -eq $true) {New-Item -Path $TargetUNC -ItemType directory} # еÑли пÑÑÑ Ð´Ð¾ÑÑÑпен, ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ Ð¿Ð¾ даÑе
$WBadmin_cmd = "wbadmin.exe START BACKUP -backupTarget:$TargetUNC -systemState -noverify -vssCopy -quiet"
# $WBadmin_cmd = "wbadmin start backup -backuptarget:$path -include:C:\Windows\NTDS\ntds.dit -quiet" # Backup DB NTDS
Invoke-Expression $WBadmin_cmd
RDS
Get-Command -Module RemoteDesktop
Get-RDServer -ConnectionBroker $broker ÑпиÑок вÑеÑ
ÑеÑвеÑов в ÑеÑмеÑ, ÑказÑваеÑÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ðµ доменное Ð¸Ð¼Ñ Ð¿Ñи обÑаÑение к ÑеÑвеÑÑ Ñ ÑолÑÑ RDCB
Get-RDRemoteDesktop -ConnectionBroker $broker ÑпиÑок коллекÑий
(Get-RDLicenseConfiguration -ConnectionBroker $broker | select *).LicenseServer ÑпиÑок ÑеÑвеÑов Ñ ÑолÑÑ RDL
Get-RDUserSession -ConnectionBroker $broker ÑпиÑок вÑеÑ
акÑивнÑÑ
полÑзоваÑелей
Disconnect-RDUser -HostServer $srv -UnifiedSessionID $id -Force оÑклÑÑиÑÑ ÑеÑÑÐ¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ
Get-RDAvailableApp -ConnectionBroker $broker -CollectionName C03 ÑпиÑок ÑÑÑановленного ÐРна ÑеÑвеÑаÑ
в коллекÑии
(Get-RDSessionCollectionConfiguration -ConnectionBroker $broker -CollectionName C03 | select *).CustomRdpProperty use redirection server name:i:1
Get-RDConnectionBrokerHighAvailability
DNSServer
Get-Command -Module DnsServer
Show-DnsServerCache оÑобÑазиÑÑ Ð²ÐµÑÑ ÐºÑÑ DNS-ÑеÑвеÑа
Show-DnsServerCache | where HostName -match ru
Clear-DnsServerCache
Get-DnsServerCache
Get-DnsServerDiagnostics
$zone = icm $srv {Get-DnsServerZone} | select ZoneName,ZoneType,DynamicUpdate,ReplicationScope,SecureSecondaries,
DirectoryPartitionName | Out-GridView -Title "DNS Server: $srv" âPassThru
$zone_name = $zone.ZoneName
if ($zone_name -ne $null) {
icm $srv {Get-DnsServerResourceRecord -ZoneName $using:zone_name | sort RecordType | select RecordType,HostName, @{
Label="IPAddress"; Expression={$_.RecordData.IPv4Address.IPAddressToString}},TimeToLive,Timestamp
} | select RecordType,HostName,IPAddress,TimeToLive,Timestamp | Out-GridView -Title "DNS Server: $srv"
}
Sync-DnsServerZone âpassthru ÑинÑ
ÑонизиÑоваÑÑ Ð·Ð¾Ð½Ñ Ñ Ð´ÑÑгими DC в домене
Remove-DnsServerZone -Name domain.local ÑдалиÑÑ Ð·Ð¾Ð½Ñ
Get-DnsServerResourceRecord -ZoneName domain.local -RRType A вÑвеÑÑи вÑе Ð-запиÑи в Ñказанной зоне
Add-DnsServerResourceRecordA -Name new-host-name -IPv4Address 192.168.1.100 -ZoneName domain.local -TimeToLive 01:00:00 -CreatePtr ÑоздаÑÑ Ð-запиÑÑ Ð¸ PTR Ð´Ð»Ñ Ð½ÐµÐµ
Remove-DnsServerResourceRecord -ZoneName domain.local -RRType A -Name new-host-name âForce ÑдалиÑÑ Ð-запиÑÑ
$DNSServer = "DC-01"
$DNSFZone = "domain.com"
$DataFile = "C:\Scripts\DNS-Create-A-Records-from-File.csv"
# cat $DataFile
# "HostName;IP"
# "server-01;192.168.1.10"
$DNSRR = [WmiClass]"\\$DNSServer\root\MicrosoftDNS:MicrosoftDNS_ResourceRecord"
$ConvFile = $DataFile + "_unicode"
Get-Content $DataFile | Set-Content $ConvFile -Encoding Unicode
Import-CSV $ConvFile -Delimiter ";" | ForEach-Object {
$FQDN = $_.HostName + "." + $DNSFZone
$IP = $_.HostIP
$TextA = "$FQDN IN A $IP"
[Void]$DNSRR.CreateInstanceFromTextRepresentation($DNSServer,$DNSFZone,$TextA)
}
DHCPServer
Get-Command -Module DhcpServer
$mac = icm $srv -ScriptBlock {Get-DhcpServerv4Scope | Get-DhcpServerv4Lease} | select AddressState,
HostName,IPAddress,ClientId,DnsRegistration,DnsRR,ScopeId,ServerIP | Out-GridView -Title "HDCP Server: $srv" âPassThru
(New-Object -ComObject Wscript.Shell).Popup($mac.ClientId,0,$mac.HostName,64)
Add-DhcpServerv4Reservation -ScopeId 192.168.1.0 -IPAddress 192.168.1.10 -ClientId 00-50-56-C0-00-08 -Description "new reservation"
DFS
dfsutil /root:\\domain.sys\public /export:C:\export-dfs.txt ÑкÑпоÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии namespace root
dfsutil /AddFtRoot /Server:\\$srv /Share:public на новой маÑине пÑедваÑиÑелÑно ÑоздаÑÑ ÐºÐ¾ÑÐµÐ½Ñ Ð½Ð° оÑнове домена
dfsutil /root:\\domain.sys\public /import:C:\export-dfs.txt /<verify /set Import (пеÑед импоÑÑом даннÑÑ
в ÑÑÑеÑÑвÑÑÑий коÑÐµÐ½Ñ DFS, ÑÑилиÑа ÑÐ¾Ð·Ð´Ð°ÐµÑ ÑезеÑвнÑÑ ÐºÐ¾Ð¿Ð¸Ñ ÐºÐ¾Ð½ÑигÑÑаÑии коÑÐ½Ñ Ð² ÑекÑÑем каÑалоге, из коÑоÑого запÑÑкаеÑÑÑ ÑÑилиÑа dfsutil)
/verify вÑÐ²Ð¾Ð´Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, коÑоÑÑе бÑдÑÑ Ð²Ð½ÐµÑÐµÐ½Ñ Ð² пÑоÑеÑÑе импоÑÑа, без пÑименениÑ
/set менÑÐµÑ Ñелевое пÑоÑÑÑанÑÑво имен пÑÑем полной пеÑезапиÑи и Ð·Ð°Ð¼ÐµÐ½Ñ Ð½Ð° конÑигÑÑаÑÐ¸Ñ Ð¿ÑоÑÑÑанÑÑва имен из импоÑÑиÑÑемого Ñайла
/merge импоÑÑиÑÑÐµÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ Ð¿ÑоÑÑÑанÑÑва имен в дополнение к ÑÑÑеÑÑвÑÑÑей конÑигÑÑаÑии Ð´Ð»Ñ ÑлиÑниÑ, паÑамеÑÑÑ Ð¸Ð· Ñайла конÑигÑÑаÑии бÑдÑÑ Ð¸Ð¼ÐµÑÑ Ð±Ð¾Ð»ÑÑий пÑиоÑиÑеÑ, Ñем ÑÑÑеÑÑвÑÑÑие паÑамеÑÑÑ Ð¿ÑоÑÑÑанÑÑва имен
Export-DfsrClone ÑкÑпоÑÑиÑÑÐµÑ ÐºÐ»Ð¾Ð½Ð¸ÑованнÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
ÑепликаÑии DFS и паÑамеÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии Ñома
Get-DfsrCloneState полÑÑÐ°ÐµÑ ÑоÑÑоÑние опеÑаÑии клониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
Import-DfsrClone импоÑÑиÑÑÐµÑ ÐºÐ»Ð¾Ð½Ð¸ÑованнÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
ÑепликаÑии DFS и паÑамеÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии Ñома
net use x: \\$srv1\public\* пÑимонÑиÑоваÑÑ Ð´Ð¸Ñк
Get-DfsrFileHash x:\* | Out-File C:\$srv1.txt забÑаÑÑ hash вÑеÑ
Ñайлов диÑка в Ñайл (ÑÐ°Ð¹Ð»Ñ Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми Ñ
еÑами вÑегда ÑвлÑÑÑÑÑ ÑоÑнÑми копиÑми дÑÑг дÑÑга)
net use x: /d оÑмонÑиÑоваÑÑ
net use x: \\$srv2\public\*
Get-DfsrFileHash x:\* | Out-File C:\$srv2.txt
net use x: /d
Compare-Object -ReferenceObject (Get-Content C:\$srv1.txt) -DifferenceObject (Get-Content C:\$srv2.txt) -IncludeEqual ÑÑавниÑÑ ÑодеÑжимое Ñайлов
Get-DfsrBacklog -DestinationComputerName "fs-06" -SourceComputerName "fs-05" -GroupName "folder-rep" -FolderName "folder" -Verbose полÑÑÐ°ÐµÑ ÑпиÑок ожидаÑÑиÑ
обновлений Ñайлов Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÑÐ¼Ñ Ð¿Ð°ÑÑнеÑами ÑепликаÑии DFS
Get-DfsrConnection оÑобÑÐ°Ð¶Ð°ÐµÑ Ð³ÑÑÐ¿Ð¿Ñ ÑепликаÑии, ÑÑаÑÑников и ÑÑаÑÑÑ
Get-DfsReplicatedFolder оÑобÑÐ°Ð¶Ð°ÐµÑ Ð¸Ð¼Ñ Ð¸ полнÑй пÑÑÑ Ðº папкам ÑеликаÑии в ÑиÑÑеме DFS
Get-DfsrState -ComputerName fs-06 -Verbose ÑоÑÑоÑние ÑепликаÑии DFS Ð´Ð»Ñ Ñлена гÑÑппÑ
Get-DfsReplicationGroup оÑобÑÐ°Ð¶Ð°ÐµÑ Ð³ÑÑÐ¿Ð¿Ñ ÑепликаÑии и иÑ
ÑÑаÑÑÑ
Add-DfsrConnection ÑÐ¾Ð·Ð´Ð°ÐµÑ Ñоединение Ð¼ÐµÐ¶Ð´Ñ Ñленами гÑÑÐ¿Ð¿Ñ ÑепликаÑии
Add-DfsrMember добавлÑÐµÑ ÐºÐ¾Ð¼Ð¿ÑÑÑеÑÑ Ð² гÑÑÐ¿Ð¿Ñ ÑепликаÑии
ConvertFrom-DfsrGuid пÑеобÑазÑÐµÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑÑ GUID в понÑÑнÑе имена в заданной гÑÑÐ¿Ð¿Ñ ÑепликаÑии
Get-DfsrConnectionSchedule полÑÑÐ°ÐµÑ ÑаÑпиÑание Ñоединений Ð¼ÐµÐ¶Ð´Ñ Ñленами гÑÑÐ¿Ð¿Ñ ÑепликаÑии
Get-DfsrGroupSchedule Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÑ ÑаÑпиÑание гÑÑÐ¿Ð¿Ñ ÑепликаÑии
Get-DfsrIdRecord полÑÑÐ°ÐµÑ Ð·Ð°Ð¿Ð¸Ñи ID Ð´Ð»Ñ ÑеплиÑиÑованнÑÑ
Ñайлов или папок из Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
ÑепликаÑии DFS
Get-DfsrMember полÑÑÐ°ÐµÑ ÐºÐ¾Ð¼Ð¿ÑÑÑеÑÑ Ð² гÑÑппе ÑепликаÑии
Get-DfsrMembership полÑÑÐ°ÐµÑ Ð¿Ð°ÑамеÑÑÑ ÑленÑÑва Ð´Ð»Ñ Ñленов гÑÑпп ÑепликаÑии
Get-DfsrPreservedFiles полÑÑÐ°ÐµÑ ÑпиÑок Ñайлов и папок, Ñанее ÑоÑ
ÑаненнÑÑ
ÑепликаÑией DFS
Get-DfsrServiceConfiguration полÑÑÐ°ÐµÑ Ð¿Ð°ÑамеÑÑÑ ÑлÑÐ¶Ð±Ñ ÑепликаÑии DFS Ð´Ð»Ñ Ñленов гÑÑппÑ
Grant-DfsrDelegation пÑедоÑÑавлÑÐµÑ ÑазÑеÑÐµÐ½Ð¸Ñ ÑÑаÑÑникам безопаÑноÑÑи Ð´Ð»Ñ Ð³ÑÑÐ¿Ð¿Ñ ÑепликаÑии
Revoke-DfsrDelegation оÑменÑÐµÑ ÑазÑеÑÐµÐ½Ð¸Ñ ÑÑаÑÑников безопаÑноÑÑи Ð´Ð»Ñ Ð³ÑÑÐ¿Ð¿Ñ ÑепликаÑии
New-DfsReplicationGroup ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð³ÑÑÐ¿Ð¿Ñ ÑепликаÑии
New-DfsReplicatedFolder ÑÐ¾Ð·Ð´Ð°ÐµÑ ÑеплиÑиÑованнÑÑ Ð¿Ð°Ð¿ÐºÑ Ð² гÑÑппе ÑепликаÑии
Remove-DfsrConnection ÑдалÑÐµÑ Ñоединение Ð¼ÐµÐ¶Ð´Ñ Ñленами гÑÑÐ¿Ð¿Ñ ÑепликаÑии
Remove-DfsReplicatedFolder ÑдалÑÐµÑ ÑеплиÑиÑованнÑÑ Ð¿Ð°Ð¿ÐºÑ Ð¸Ð· гÑÑÐ¿Ð¿Ñ ÑепликаÑии
Remove-DfsReplicationGroup ÑдалÑÐµÑ Ð³ÑÑÐ¿Ð¿Ñ ÑепликаÑии
Remove-DfsrMember ÑдалÑÐµÑ ÐºÐ¾Ð¼Ð¿ÑÑÑеÑÑ Ð¸Ð· гÑÑÐ¿Ð¿Ñ ÑепликаÑии
Restore-DfsrPreservedFiles воÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑÐ°Ð¹Ð»Ñ Ð¸ папки, Ñанее ÑоÑ
ÑаненнÑе ÑепликаÑией DFS
Set-DfsrConnection изменÑÐµÑ Ð¿Ð°ÑамеÑÑÑ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ñленами гÑÑÐ¿Ð¿Ñ ÑепликаÑии
Set-DfsrConnectionSchedule изменÑÐµÑ Ð¿Ð°ÑамеÑÑÑ ÑаÑпиÑÐ°Ð½Ð¸Ñ Ñоединений Ð¼ÐµÐ¶Ð´Ñ Ñленами гÑÑÐ¿Ð¿Ñ ÑепликаÑии
Set-DfsReplicatedFolder изменÑÐµÑ Ð½Ð°ÑÑÑойки ÑеплиÑиÑованной папки
Set-DfsReplicationGroup изменÑÐµÑ Ð³ÑÑÐ¿Ð¿Ñ ÑепликаÑии
Set-DfsrGroupSchedule изменÑÐµÑ ÑаÑпиÑание гÑÑÐ¿Ð¿Ñ ÑепликаÑии
Set-DfsrMember изменÑÐµÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ компÑÑÑеÑе-ÑÑаÑÑнике в гÑÑппе ÑепликаÑии
Set-DfsrMembership наÑÑÑÐ°Ð¸Ð²Ð°ÐµÑ Ð¿Ð°ÑамеÑÑÑ ÑленÑÑва Ð´Ð»Ñ Ñленов гÑÑÐ¿Ð¿Ñ ÑепликаÑии
Set-DfsrServiceConfiguration изменÑÐµÑ Ð¿Ð°ÑамеÑÑÑ ÑлÑÐ¶Ð±Ñ ÑепликаÑии DFS
Sync-DfsReplicationGroup ÑинÑ
ÑонизиÑÑÐµÑ ÑепликаÑÐ¸Ñ Ð¼ÐµÐ¶Ð´Ñ ÐºÐ¾Ð¼Ð¿ÑÑÑеÑами незавиÑимо Ð¾Ñ ÑаÑпиÑаниÑ
Suspend-DfsReplicationGroup пÑиоÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑепликаÑÐ¸Ñ Ð¼ÐµÐ¶Ð´Ñ ÐºÐ¾Ð¼Ð¿ÑÑÑеÑами незавиÑимо Ð¾Ñ ÑаÑпиÑаниÑ
Update-DfsrConfigurationFromAD иниÑииÑÑÐµÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ ÑлÑÐ¶Ð±Ñ ÑепликаÑии DFS
Write-DfsrHealthReport ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð¾ÑÑÐµÑ Ð¾ ÑабоÑоÑпоÑобноÑÑи ÑепликаÑии DFS
Write-DfsrPropagationReport ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð¾ÑÑеÑÑ Ð´Ð»Ñ ÑеÑÑовÑÑ
Ñайлов ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð² гÑÑппе ÑепликаÑии
Start-DfsrPropagationTest ÑÐ¾Ð·Ð´Ð°ÐµÑ ÑеÑÑовÑй Ñайл ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð² ÑеплиÑиÑованной папке
StorageReplica
Install-WindowsFeature Storage-Replica âIncludeManagementTools -Restart
Get-Command -Module StorageReplica
Test-SRTopology пÑовеÑиÑÑ ÑооÑвеÑÑÑвÑÐµÑ Ð»Ð¸ ÑеÑÐ²ÐµÑ Ð¸ канал ÑвÑзи ÑеÑ
нологии Storage Replica
New-SRPartnership -SourceComputerName srv-01 -SourceRGName srv-01-rep-group-01 -SourceVolumeName D: -SourceLogVolumeName L: -DestinationComputerName srv-02 -DestinationRGName srv-02-rep-group-01 -DestinationVolumeName D: -DestinationLogVolumeName L: -LogSizeInBytes 1GB
Get-Counter -Counter "\Storage Replica Statistics(*)"
Get-WinEvent -ProviderName Microsoft-Windows-StorageReplica -max 10
Set-SRPartnership -ReplicationMode Asynchronous пеÑеклÑÑиÑÑ Ñежим ÑепликаÑии на аÑинÑ
ÑоннÑй
Set-SRPartnership -NewSourceComputerName srv-02 -SourceRGName srv-02-rep-group-01 -DestinationComputerName srv-01 -DestinationRGName srv-01-rep-group-01 измениÑÑ Ð²ÑÑÑнÑÑ Ð½Ð°Ð¿Ñавление ÑепликаÑии даннÑÑ
, пеÑÐµÐ²ÐµÐ´Ñ Ð²ÑоÑиÑнÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð² онлайн Ñежим (пÑи вÑÑ
оде из ÑÑÑÐ¾Ñ Ð¾Ñновного ÑеÑвеÑа)
Get-SRGroup инÑоÑмаÑÐ¸Ñ Ð¾ ÑоÑÑоÑние гÑÑÐ¿Ð¿Ñ ÑеплизаÑии
Get-SRPartnerShip инÑоÑмаÑÐ¸Ñ Ð¾ напÑавлении ÑепликаÑии
(Get-SRGroup).Replicas | Select-Object numofbytesremaining пÑовеÑиÑÑ Ð´Ð»Ð¸Ð½Ñ Ð¾ÑеÑеди копиÑованиÑ
Get-SRPartnership | Remove-SRPartnership ÑдалиÑÑ ÑеплизаÑÐ¸Ñ Ð½Ð° оÑновном ÑеÑвеÑе
Get-SRGroup | Remove-SRGroup ÑдалиÑÑ ÑеплизаÑÐ¸Ñ Ð½Ð° обоиÑ
ÑеÑвеÑаÑ
PS2EXE
Install-Module ps2exe -Repository PSGallery
Get-Module -ListAvailable ÑпиÑок вÑеÑ
модÑлей
-noConsole иÑполÑзоваÑÑ GUI, без окна конÑоли powershell
-noOutput вÑполнение в Ñоне
-noError без вÑвода оÑибок
-requireAdmin пÑи запÑÑке запÑоÑиÑÑ Ð¿Ñава админиÑÑÑаÑоÑа
-credentialGUI вÑвод диалогового окна Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° ÑÑеÑнÑÑ
даннÑÑ
Invoke-ps2exe -inputFile "$home\Desktop\WinEvent-Viewer-1.1.ps1" -outputFile "$home\Desktop\WEV-1.1.exe" -iconFile "$home\Desktop\log_48px.ico" -title "WinEvent-Viewer" -noConsole -noOutput -noError
NSSM
$powershell_Path = (Get-Command powershell).Source
$NSSM_Path = (Get-Command "C:\WinPerf-Agent\NSSM-2.24.exe").Source
$Script_Path = "C:\WinPerf-Agent\WinPerf-Agent-1.1.ps1"
$Service_Name = "WinPerf-Agent"
& $NSSM_Path install $Service_Name $powershell_Path -ExecutionPolicy Bypass -NoProfile -f $Script_Path ÑоздаÑÑ Service
& $NSSM_Path start $Service_Name запÑÑÑиÑÑ
& $NSSM_Path status $Service_Name ÑÑаÑÑÑ
$Service_Name | Restart-Service пеÑезапÑÑÑиÑÑ
$Service_Name | Get-Service ÑÑаÑÑÑ
$Service_Name | Stop-Service оÑÑановиÑÑ
& $NSSM_Path set $Service_Name description "Check performance CPU and report email" измениÑÑ Ð¾Ð¿Ð¸Ñание
& $NSSM_Path remove $Service_Name ÑдалиÑÑ
Jobs
Get-Job полÑÑение ÑпиÑка задаÑ
Start-Job запÑÑк пÑоÑеÑÑа
Stop-Job оÑÑановка пÑоÑеÑÑа
Suspend-Job пÑиоÑÑановка ÑабоÑÑ Ð¿ÑоÑеÑÑа
Resume-Job воÑÑÑановление ÑабоÑÑ Ð¿ÑоÑеÑÑа
Wait-Job ожидание вÑвода командÑ
Receive-Job полÑÑение ÑезÑлÑÑаÑов вÑполненного пÑоÑеÑÑа
Remove-Job ÑдалиÑÑ Ð·Ð°Ð´Ð°ÑÑ
function Start-PingJob ($Network) {
$RNetwork = $Network -replace "\.\d{1,3}$","."
foreach ($4 in 1..254) {
$ip = $RNetwork+$4
# Ñоздаем заданиÑ, забиÑаем 3-Ñ ÑÑÑÐ¾ÐºÑ Ð²Ñвода и добавлÑем к вÑÐ²Ð¾Ð´Ñ ip-адÑеÑ:
(Start-Job {"$using:ip : "+(ping -n 1 -w 50 $using:ip)[2]}) | Out-Null
}
while ($True){
$status_job = (Get-Job).State[-1] # забиÑаем ÑÑаÑÑÑ Ð¿Ð¾Ñледнего заданиÑ
if ($status_job -like "Completed"){ # пÑовеÑÑем на вÑполнение (Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð²ÑполнÑÑÑÑÑ Ð¿Ð¾ оÑеÑеди ÑвеÑÑ
Ñ Ð²Ð½Ð¸Ð·)
$ping_out = Get-Job | Receive-Job # еÑли вÑполнен, забиÑаем вÑвод вÑеÑ
заданий
Get-Job | Remove-Job -Force # ÑдалÑем заданиÑ
$ping_out
break # завеÑÑаем Ñикл
}}
}
Start-PingJob -Network 192.168.3.0
(Measure-Command {Start-PingJob -Network 192.168.3.0}).TotalSeconds 60 Seconds
ThreadJob
Install-Module -Name ThreadJob
Get-Module ThreadJob -list
Start-ThreadJob {ping ya.ru} | Out-Null ÑоздаÑÑ ÑоновÑÑ Ð·Ð°Ð´Ð°ÑÑ
Get-Job | Receive-Job -Keep оÑобÑазиÑÑ Ð¸ не ÑдалÑÑÑ Ð²Ñвод
(Get-Job).HasMoreData еÑли False, Ñо вÑвод ÐºÐ¾Ð¼Ð°Ð½Ñ Ñдален
(Get-Job)[-1].Output оÑобÑазиÑÑ Ð²Ñвод поÑледней задаÑи
function Start-PingThread ($Network) {
$RNetwork = $Network -replace "\.\d{1,3}$","."
foreach ($4 in 1..254) {
$ip = $RNetwork+$4
# Ñоздаем заданиÑ, забиÑаем 3-Ñ ÑÑÑÐ¾ÐºÑ Ð²Ñвода и добавлÑем к вÑÐ²Ð¾Ð´Ñ ip-адÑеÑ:
(Start-ThreadJob {"$using:ip : "+(ping -n 1 -w 50 $using:ip)[2]}) | Out-Null
}
while ($True){
$status_job = (Get-Job).State[-1] # забиÑаем ÑÑаÑÑÑ Ð¿Ð¾Ñледнего заданиÑ
if ($status_job -like "Completed"){ # пÑовеÑÑем на вÑполнение (Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð²ÑполнÑÑÑÑÑ Ð¿Ð¾ оÑеÑеди ÑвеÑÑ
Ñ Ð²Ð½Ð¸Ð·)
$ping_out = Get-Job | Receive-Job # еÑли вÑполнен, забиÑаем вÑвод вÑеÑ
заданий
Get-Job | Remove-Job -Force # ÑдалÑем заданиÑ
$ping_out
break # завеÑÑаем Ñикл
}}
}
Start-PingThread -Network 192.168.3.0
(Measure-Command {Start-PingThread -Network 192.168.3.0}).TotalSeconds 24 Seconds
PoshRSJob
function Start-PingRSJob ($Network) {
$RNetwork = $Network -replace "\.\d{1,3}$","."
foreach ($4 in 1..254) {
$ip = $RNetwork+$4
(Start-RSJob {"$using:ip : "+(ping -n 1 -w 50 $using:ip)[2]}) | Out-Null
}
$ping_out = Get-RSJob | Receive-RSJob
$ping_out
Get-RSJob | Remove-RSJob
}
Start-PingRSJob -Network 192.168.3.0
(Measure-Command {Start-PingRSJob -Network 192.168.3.0}).TotalSeconds 10 Seconds
SMTP
function Send-SMTP {
param (
[Parameter(Mandatory = $True)]$mess
)
$srv_smtp = "smtp.yandex.ru"
$port = "587"
$from = "[email protected]"
$to = "[email protected]"
$user = "login1"
$pass = "password"
$subject = "Service status on Host: $hostname"
$Message = New-Object System.Net.Mail.MailMessage
$Message.From = $from
$Message.To.Add($to)
$Message.Subject = $subject
$Message.IsBodyHTML = $true
$Message.Body = "<h1> $mess </h1>"
$smtp = New-Object Net.Mail.SmtpClient($srv_smtp, $port)
$smtp.EnableSSL = $true
$smtp.Credentials = New-Object System.Net.NetworkCredential($user, $pass);
$smtp.Send($Message)
}
Send-SMTP $(Get-Service)
Hyper-V
Install-WindowsFeature -Name Hyper-V -IncludeManagementTools -Restart ÑÑÑановиÑÑ ÑÐ¾Ð»Ñ Ð½Ð° Windows Server
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V âAll ÑÑÑановиÑÑ ÑÐ¾Ð»Ñ Ð½Ð° Windows Desktop
Get-Command -Module hyper-v
Get-VMHost
New-VMSwitch -name NAT -SwitchType Internal # ÑоздаÑÑ Ð²Ð¸ÑÑÑалÑнÑй коммÑÑаÑÐ¾Ñ Ð¸ адапÑÐµÑ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾
Get-NetAdapter | where InterfaceDescription -match Hyper-V # ÑпиÑок ÑеÑевÑÑ
адапÑеÑов
New-NetNat -Name LocalNat -InternalIPInterfaceAddressPrefix "192.168.3.0/24" # задаÑÑ ÑеÑÑ
Get-NetAdapter "vEthernet (NAT)" | New-NetIPAddress -IPAddress 192.168.3.200 -AddressFamily IPv4 -PrefixLength 24 # пÑиÑвоиÑÑ Ð°Ð´ÑеÑ, необÑ
одимо на ÐÐ ÑказаÑÑ ÑлÑз 192.168.3.200, ÑÑо Ð±Ñ Ð½Ð°Ñ
одиÑÑÑÑ Ð·Ð° NAT, или в наÑÑÑойка ÐÐ ÑказаÑÑ ÑооÑвеÑÑÑвÑÑÑий адапÑеÑ
Add-NetNatStaticMapping -NatName LocalNat -Protocol TCP -ExternalIPAddress 0.0.0.0 -ExternalPort 2222 -InternalIPAddress 192.168.3.103 -InternalPort 2121 # пÑобÑоÑ, веÑÑ ÑÑаÑик коÑоÑÑй пÑиÑ
Ð¾Ð´Ð¸Ñ Ð½Ð° Ñ
оÑÑ Hyper-V TCP/2222, бÑÐ´ÐµÑ Ð¿ÐµÑенапÑавлÑÑÑÑÑ Ð½Ð° ÑооÑвеÑÑÑвÑÑÑий поÑÑ Ð²Ð¸ÑÑÑалÑной маÑÐ¸Ð½Ñ Ð·Ð° NAT.
(Get-NetAdapter | where Name -match NAT).Status
Get-NetNatStaticMapping оÑобÑазиÑÑ Ð¿ÑобÑоÑÑ (NAT)
Get-NetNat ÑпиÑок ÑеÑей
Remove-NetNatStaticMapping -StaticMappingID 0 ÑдалиÑÑ Ð¿ÑобÑоÑ
Remove-NetNat -Name LocalNat ÑдалиÑÑ ÑеÑÑ
New-VMSwitch -Name Local -AllowManagementOS $True -NetAdapterName "Ethernet 4" -SwitchType External ÑоздаÑÑ Ð²Ñений (External) виÑÑÑалÑнÑй коммÑÑаÑоÑ
$VMName = "hv-dc-01"
$VM = @{
Name = $VMName
MemoryStartupBytes = 4Gb
Generation = 2
NewVHDPath = "D:\VM\$VMName\$VMName.vhdx"
NewVHDSizeBytes = 50Gb
BootDevice = "VHD"
Path = "D:\VM\$VMName"
SwitchName = "NAT"
}
New-VM @VM
Set-VMDvdDrive -VMName $VMName -Path "C:\Users\Lifailon\Documents\WS-2016.iso"
New-VHD -Path "D:\VM\$VMName\disk_d.vhdx" -SizeBytes 10GB ÑоздаÑÑ VHDX диÑк
Add-VMHardDiskDrive -VMName $VMName -Path "D:\VM\$VMName\disk_d.vhdx" пÑимонÑиÑоваÑÑ Ð´Ð¸Ñк
Get-VM âVMname $VMName | Set-VM âAutomaticStartAction Start авÑозапÑÑк
Get-VM -Name $VMName | Set-VMMemory -StartupBytes 8Gb
Set-VMProcessor $VMName -Count 2
Get-VM -Name $VMName | Checkpoint-VM -SnapshotName "Snapshot-1"
Restore-VMCheckpoint -Name Snapshot-1" -VMName $VMName -Confirm:$false
Get-VM | Select -ExpandProperty NetworkAdapters | Select VMName,IPAddresses,Status полÑÑиÑÑ IP адÑÐµÑ Ð²ÑеÑ
ÐÐ
vmconnect.exe localhost $VMHost
Get-NetTCPConnection -State Established,Listen | Where-Object LocalPort -Match 2179 найÑи поÑÑ ÑлÑÑаÑелÑ
Get-Process -Id (Get-NetTCPConnection -State Established,Listen | Where-Object LocalPort -Match 2179).OwningProcess найÑи пÑоÑеÑÑ Ð¿Ð¾ ID (vmms/VMConnect)
New-NetFirewallRule -Name "Hyper-V" -DisplayName "Hyper-V" -Group "Hyper-V" -Direction Inbound -Protocol TCP -LocalPort 2179 -Action Allow -Profile Public
Get-LocalGroupMember -Group "ÐдминиÑÑÑаÑоÑÑ Hyper-V" или "Hyper-V Administrators"
Add-LocalGroupMember -Group "ÐдминиÑÑÑаÑоÑÑ Hyper-V" -Member "lifailon"
Get-VM * | select name,ID добавиÑÑ id в RDCMan Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑениÑ
Grant-VMConnectAccess -ComputerName plex-01 -VMName hv-devops-01 -UserName lifailon даÑÑ Ð´Ð¾ÑÑÑп на подклÑÑение не админиÑÑÑаÑоÑÑ
Grant-VMConnectAccess -ComputerName huawei-book -VMName hv-devops-01 -UserName lifailon
Get-VMConnectAccess
Revoke-VMConnectAccess -VMName hv-devops-01 -UserName lifailon
Error: Unknown disconnection reason 3848 - добавиÑÑ ÐºÐ»ÑÑи ÑееÑÑÑа на ÑÑоÑоне клиенÑа
New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentialsDomain -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowDefaultCredentials -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentialsWhenNTLMOnlyDomain -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowDefaultCredentialsDomain -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentials -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentialsWhenNTLMOnly -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowSavedCredentialsWhenNTLMOnly -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowSavedCredentials -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowSavedCredentialsDomain -Name Hyper-V -PropertyType String -Value "Microsoft Virtual Console Service/*" -Force
VMWare/PowerCLI
Install-Module -Name VMware.PowerCLI # -AllowClobber ÑÑÑановиÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ (PackageProvider: nuget)
Get-Module -ListAvailable VMware* | Select Name,Version
Import-Module VMware.VimAutomation.Core импоÑÑиÑоваÑÑ Ð² ÑеÑÑиÑ
Get-PSProvider | format-list Name,PSSnapIn,ModuleName ÑпиÑок оÑнаÑÑок Windows PowerShell
Get-PowerCLIConfiguration конÑигÑÑаÑÐ¸Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑениÑ
Set-PowerCLIConfiguration -Scope AllUsers -InvalidCertificateAction ignore -confirm:$false eÑли иÑполÑзÑеÑÑÑ ÑамоподпиÑаннÑй ÑеÑÑиÑикаÑ, измениÑÑ Ð·Ð½Ð°Ñение паÑамеÑÑа InvalidCertificateAction Ñ Unset на Ignore/Warn
Set-PowerCLIConfiguration -Scope AllUsers -ParticipateInCeip $false оÑклÑÑиÑÑ Ñведомление ÑбоÑа даннÑÑ
ÑеÑез VMware Customer Experience Improvement Program (CEIP)
Read-Host âAsSecureString | ConvertFrom-SecureString | Out-File "$home\Documents\vcsa_password.txt" заÑиÑÑоваÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ð¸ ÑоÑ
ÑаниÑÑ Ð² Ñайл
$esxi = "vcsa.domain.local"
$user = "[email protected]"
$pass = Get-Content "$home\Documents\vcsa_password.txt" | ConvertTo-SecureString пÑоÑиÑаÑÑ Ð¿Ð°ÑолÑ
$pass = "password"
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user ,$pass
Connect-VIServer $esxi -User $Cred.Username -Password $Cred.GetNetworkCredential().password подклÑÑиÑÑÑÑ, иÑполÑзÑÑ PSCredential ($Cred)
Connect-VIServer $esxi -User $user -Password $pass подклÑÑиÑÑÑÑ, иÑполÑзÑÑ Ð»Ð¾Ð³Ð¸Ð½ и паÑолÑ
Get-Command âModule *vmware*
Get-Command âModule *vmware* -name *get*iscsi*
Get-IScsiHbaTarget
Get-Datacenter
Get-Cluster
Get-VMHost
Get-VMHost | select Name,Model,ProcessorType,MaxEVCMode,NumCpu,CpuTotalMhz,CpuUsageMhz,MemoryTotalGB,MemoryUsageGB
Get-VMHostDisk | select VMHost,ScsiLun,TotalSectors
Get-Datastore
Get-Datastore TNAS-vmfs-4tb-01
Get-Datastore TNAS-vmfs-4tb-01 | get-vm
Get-Datastore -RelatedObject vm-01
(Get-Datastore TNAS-vmfs-4tb-01).ExtensionData.Info.GetType()
(Get-Datastore TNAS-vmfs-4tb-01).ExtensionData.Info.Vmfs.Extent
Get-Command âModule *vmware* -name *disk*
Get-VM vm-01 | Get-Datastore
Get-VM vm-01 | Get-HardDisk
Get-VM | Get-HardDisk | select Parent,Name,CapacityGB,StorageFormat,FileName | ft
Copy-HardDisk
Get-VM | Get-Snapshot
Get-VM | where {$_.Powerstate -eq "PoweredOn"}
Get-VMHost esxi-05 | Get-VM | where {$_.Powerstate -eq "PoweredOff"} | Move-VM âDestination (Get-VMHost esxi-06)
Get-VM | select Name,VMHost,PowerState,NumCpu,MemoryGB,
@{Name="UsedSpaceGB"; Expression={[int32]($_.UsedSpaceGB)}},@{Name="ProvisionedSpaceGB"; Expression={[int32]($_.ProvisionedSpaceGB)}},
CreateDate,CpuHotAddEnabled,MemoryHotAddEnabled,CpuHotRemoveEnabled,Notes
Get-VMGuest vm-01 | Update-Tools
Get-VMGuest vm-01 | select OSFullName,IPAddress,HostName,State,Disks,Nics,ToolsVersion
Get-VMGuest * | select -ExpandProperty IPAddress
Restart-VMGuest -vm vm-01 -Confirm:$False
Start-VM -vm vm-01 -Confirm:$False
Shutdown-VMGuest -vm vm-01 -Confirm:$false
New-VM âName vm-01 -VMHost esxi-06 âResourcePool Production âDiskGB 60 âDiskStorageFormat Thin âDatastore TNAS-vmfs-4tb-01
Get-VM vm-01 | Copy-VMGuestFile -Source "\\$srv\Install\Soft\Btest.exe" -Destination "C:\Install\" -LocalToGuest -GuestUser USER -GuestPassword PASS -force
Get-VM -name vm-01 | Export-VApp -Destination C:\Install -Format OVF Export template (.ovf, .vmdk, .mf)
Get-VM -name vm-01 | Export-VApp -Destination C:\Install -Format OVA
Get-VMHostNetworkAdapter | select VMHost,Name,Mac,IP,@{Label="Port Group"; Expression={$_.ExtensionData.Portgroup}} | ft
Get-VM | Get-NetworkAdapter | select Parent,Name,Id,Type,MacAddress,ConnectionState,WakeOnLanEnabled | ft
Get-Command âModule *vmware* -name *event*
Get-VIEvent -MaxSamples 1000 | where {($_.FullFormattedMessage -match "power")} | select username,CreatedTime,FullFormattedMessage
Get-logtype | select Key,SourceEntityId,Filename,Creator,Info
(Get-Log vpxd:vpxd.log).Entries | select -Last 50
Get-Command âModule *vmware* -name *syslog*
Set-VMHostSysLogServer -VMHost esxi-05 -SysLogServer "tcp://192.168.3.100" -SysLogServerPort 3515
Get-VMHostSysLogServer -VMHost esxi-05
Exchange/EMShell
$srv_cas = "exchange-cas"
$session_exchange = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://$srv_cas/PowerShell/ -Credential $Cred -Authentication Kerberos
Get-PSSession
Import-PSSession $session_exchange -DisableNameChecking импоÑÑиÑоваÑÑ Ð² ÑекÑÑÑÑ ÑеÑÑиÑ
Get-ExchangeServer | select name,serverrole,admindisplayversion,Edition,OriginatingServer,WhenCreated,WhenChanged,DataPath | ft ÑпиÑок вÑеÑ
ÑеÑвеÑов
Get-ImapSettings наÑÑÑойки IMAP
Get-ExchangeCertificate ÑпиÑок ÑеÑÑиÑикаÑов
Get-ExchangeCertificate -Thumbprint "5CEC8544D4743BC279E5FEA1679F79F5BD0C2B3A" | Enable-ExchangeCertificate -Services IMAP, POP, IIS, SMTP
iisreset
Get-ClientAccessService | fl identity, *uri* наÑÑÑойки ÑлÑÐ¶Ð±Ñ Ð°Ð²ÑообнаÑÑÐ¶ÐµÐ½Ð¸Ñ Ð² Exchange 2016
Get-ClientAccessService -Identity $srv | Set-ClientAccessService -AutoDiscoverServiceInternalUri https://mail.domain.ru/Autodiscover/Autodiscover.xml измениÑÑ Ð½Ð° внеÑний адÑеÑ
Get-OutlookAnywhere OA позволÑÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñам Outlook подклÑÑаÑÑÑÑ Ðº Ñвоим поÑÑовÑм ÑÑикам за пÑеделами локалÑной ÑеÑи (без иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ VPN)
Get-WebServicesVirtualDirectory
Get-OwaVirtualDirectory
Get-ActiveSyncVirtualDirectory
Get-OabVirtualDirectory виÑÑÑалÑÐ½Ð°Ñ Ð´Ð¸ÑекÑоÑÐ¸Ñ Ð°Ð²Ñономной адÑеÑной книги
Get-OabVirtualDirectory -Server $srv | Set-OabVirtualDirectory -InternalUrl "https://mail.domain.ru/OAB" -ExternalUrl "https://mail.domain.ru/OAB"
Roles
MS (Mailbox) - ÑеÑÐ²ÐµÑ Ñ ÐРпоÑÑовÑÑ
ÑÑиков и обÑиÑ
папок, оÑвеÑÐ°ÐµÑ ÑолÑко за иÑ
ÑазмеÑение и не вÑполнÑÐµÑ Ð¼Ð°ÑÑÑÑÑизаÑÐ¸Ñ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
ÑообÑений.
CAS (Client Access Server) - обÑабоÑка клиенÑÑкиÑ
подклÑÑений к поÑÑовÑм ÑÑикам, коÑоÑÑе ÑоздаÑÑÑÑ ÐºÐ»Ð¸ÐµÐ½Ñами Outlook Web Access (HTTP Ð´Ð»Ñ Outlook Web App), Outlook Anywhere, ActiveSync (Ð´Ð»Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑнÑÑ
ÑÑÑÑойÑÑв), инÑеÑÐ½ÐµÑ Ð¿ÑоÑÐ¾ÐºÐ¾Ð»Ñ POP3 и IMAP4, MAPI Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñов Microsoft Outlook.
Hub Transort - оÑвеÑвеÑÐ°ÐµÑ Ð·Ð° маÑÑÑÑÑизаÑÐ¸Ñ ÑообÑений инÑеÑнеÑа и инÑÑаÑÑÑÑкÑÑÑой Exchange, а Ñакже Ð¼ÐµÐ¶Ð´Ñ ÑеÑвеÑами Exchange. СообÑÐµÐ½Ð¸Ñ Ð²Ñегда маÑÑÑÑÑизиÑÑÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ñоли ÑÑанÑпоÑÑного ÑеÑвеÑа-конÑенÑÑаÑоÑа, даже еÑли поÑÑовÑе ÑÑики иÑÑоÑника и назнаÑÐµÐ½Ð¸Ñ Ð½Ð°Ñ
одÑÑÑÑ Ð² одной базе даннÑÑ
поÑÑовÑÑ
ÑÑиков.
Relay - ÑÐ¾Ð»Ñ Ð¿Ð¾Ð³ÑаниÑного ÑÑанÑпоÑÑного ÑеÑвеÑа (ÑлÑз SMTP в пеÑимеÑÑе ÑеÑи).
SCP (Service Connection Point) - запиÑÑ Ð¿ÑопиÑÑваеÑÑÑ Ð² AD, пÑи Ñоздание ÑеÑвеÑа CAS. Outlook запÑаÑÐ¸Ð²Ð°ÐµÑ SCP, вÑбиÑÐ°ÐµÑ Ñе, коÑоÑÑе наÑ
одÑÑÑÑ Ð² одном ÑайÑе Ñ Ð½Ð¸Ð¼ и по паÑамеÑÑÑ WhenCreated â по даÑе ÑозданиÑ, вÑбиÑÐ°Ñ ÑамÑй ÑÑаÑÑй.
Autodiscover. Outlook вÑбиÑÐ°ÐµÑ Ð² каÑеÑÑве ÑеÑвеÑа Client Access ÑоÑ, коÑоÑÑй пÑопиÑан в аÑÑибÑÑе RPCClientAccessServer Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
полÑзоваÑелÑ. Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ базе даннÑÑ
и ÑеÑвеÑе mailbox, на коÑоÑом она лежиÑ, беÑÑÑÑÑ Ð¸Ð· AD.
MessageTrackingLog
Get-MessageTrackingLog -ResultSize Unlimited | select Timestamp,Sender,Recipients,RecipientCount,MessageSubject,Source,EventID,ClientHostname,ServerHostname,ConnectorId, @{Name="MessageSize"; Expression={[string]([int]($_.TotalBytes / 1024))+" KB"}},@{Name="MessageLatency"; Expression={$_.MessageLatency -replace "\.\d+$"}}
Get-MessageTrackingLog -Start (Get-Date).AddHours(-24) -ResultSize Unlimited | where {[string]$_.recipients -like "*@yandex.ru"} вÑвеÑÑи ÑообÑÐµÐ½Ð¸Ñ Ð·Ð° поÑледние 24 ÑаÑа, где полÑÑаÑелем бÑл ÑказаннÑй домен
-Start "04/01/2023 09:00:00" -End "04/01/2023 18:00:00" - поиÑк по ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑомежÑÑÐºÑ Ð²Ñемени
-MessageSubject "ТеÑÑ" - поиÑк по Ñеме пиÑÑма
-Recipients "[email protected]" - поиÑк по полÑÑаÑелÑ
-Sender - поиÑк по оÑпÑавиÑелÑ
-EventID â поиÑк по ÐºÐ¾Ð´Ñ ÑобÑÑÐ¸Ñ ÑеÑвеÑа (RECEIVE, SEND, FAIL, DSN, DELIVER, BADMAIL, RESOLVE, EXPAND, REDIRECT, TRANSFER, SUBMIT, POISONMESSAGE, DEFER)
-Server â поиÑк на опÑеделенном ÑÑанÑпоÑÑном ÑеÑвеÑе
-messageID â ÑÑекинг пиÑÑма по его ID
Mailbox
Get-Mailbox -Database "it2" ÑпиÑок поÑÑовÑÑ
ÑеÑвеÑов в базе даннÑÑ
Get-Mailbox -resultsize unlimited | ? Emailaddresses -like "support4" | format-list name,emailaddresses,database,servername какÑÑ ÐÐ, ÑеÑÐ²ÐµÑ Ð¸ smtp-адÑеÑа иÑполÑзÑÐµÑ Ð¿Ð¾ÑÑовÑй ÑÑик
Get-Mailbox -Database $db_name -Archive оÑобÑазиÑÑ Ð°ÑÑ
ивнÑе поÑÑовÑе ÑÑики
Get-MailboxFolderStatistics -Identity "support4" -FolderScope All | select Name,ItemsInFolder,FolderSize оÑобÑазиÑÑ ÐºÐ¾Ð»-во пиÑем и ÑÐ°Ð·Ð¼ÐµÑ Ð² каждой папке
Get-MailboxStatistics "support4" | select DisplayName,LastLoggedOnUserAccount,LastLogonTime,LastLogoffTime,ItemCount,TotalItemSize,DeletedItemCount,TotalDeletedItemSize,Database,ServerName обÑее кол-во пиÑем, иÑ
ÑазмеÑ, вÑÐµÐ¼Ñ Ð¿Ð¾Ñледнего вÑ
ода и вÑÑ
ода, Ð¸Ð¼Ñ ÑеÑвеÑа и ÐÐ
Get-Mailbox -Server s2 | Get-MailboxStatistics | where {$_.Lastlogontime -lt (get-date).AddDays(-30)} | Sort Lastlogontime -desc | ft displayname,Lastlogontime,totalitemsize ÑÑики, коÑоÑÑе не иÑполÑзовалиÑÑ 30 и более дней
Enable-Mailbox -Identity support9 -Database test_base ÑоздаÑÑ Ð¿Ð¾ÑÑовÑй ÑÑик Ð´Ð»Ñ ÑÑÑеÑÑвÑÑÑего полÑзоваÑÐµÐ»Ñ Ð² AD
New-Mailbox -Name $login -UserPrincipalName "$login@$domain" -Database $select_db -OrganizationalUnit $path -Password (ConvertTo-SecureString -String "$password" -AsPlainText -Force) ÑоздаÑÑ Ð½Ð¾Ð²Ñй поÑÑовÑй ÑÑик без пÑивÑзки к полÑзоваÑÐµÐ»Ñ AD
Get-MailboxDatabase -Database $db_name | Remove-MailboxDatabase ÑдалиÑÑ ÐÐ
Set-MailBox "support4" -PrimarySmtpAddress [email protected] -EmailAddressPolicyEnabled $false добавиÑÑ Ð¸ измениÑÑ Ð¾Ñновной SMTP-адÑÐµÑ ÑлекÑÑонной поÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ
Set-Mailbox -Identity "support4" -DeliverToMailboxAndForward $true -ForwardingSMTPAddress "[email protected]" вклÑÑиÑÑ Ð¿ÐµÑеадÑеÑаÑÐ¸Ñ Ð¿Ð¾ÑÑÑ (ÑлекÑÑÐ¾Ð½Ð½Ð°Ñ Ð¿Ð¾ÑÑа Ð¿Ð¾Ð¿Ð°Ð´Ð°ÐµÑ Ð² поÑÑовÑй ÑÑик полÑзоваÑÐµÐ»Ñ support4 и одновÑеменно пеÑеÑÑлаеÑÑÑ Ð¿Ð¾ адÑеÑÑ [email protected])
MoveRequest
Get-Mailbox -Database $db_in | New-MoveRequest -TargetDatabase $db_out пеÑемеÑÑиÑÑ Ð²Ñе поÑÑовÑе ÑÑики из одной ÐРв дÑÑгÑÑ
New-MoveRequest -Identity $db_in -TargetDatabase $db_out пеÑемеÑÑиÑÑ Ð¾Ð´Ð¸Ð½ поÑÑовÑй ÑÑик
Get-MoveRequest | Suspend-MoveRequest оÑÑановиÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð¿ÐµÑемеÑениÑ
Get-MoveRequest | Remove-MoveRequest ÑдалиÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð½Ð° пеÑемеÑение
Get-MoveRequest | Get-MoveRequestStatistics ÑÑаÑÑÑ Ð¿ÐµÑемеÑениÑ
Status:
Cleanup - нÑжно подождаÑÑ
Queued - в оÑеÑеди
InProgress - в пÑоÑеÑÑе
Percent Complete - пÑоÑÐµÐ½Ñ Ð²ÑполнениÑ
CompletionInProgress - завеÑÑение пÑоÑеÑÑа
Completed - завеÑÑено
Remove-MoveRequest -Identity $db_name завеÑÑиÑÑ Ð¿ÑоÑеÑÑ Ð¿ÐµÑемеÑÐµÐ½Ð¸Ñ (ÑбÑаÑÑ ÑÑаÑÑÑ Ð¿ÐµÑемеÑÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾ÑÑового ÑÑика и оÑиÑÑиÑÑ ÑпиÑок пеÑемеÑений)
Get-MailboxDatabase | Select Name, MailboxRetention поÑле пеÑемеÑÐµÐ½Ð¸Ñ ÑÑиков, ÑÐ°Ð·Ð¼ÐµÑ Ð±Ð°Ð·Ñ Ð½Ðµ измениÑÑÑ, полное Ñдаление из Ð±Ð°Ð·Ñ Ð¿ÑоизойдеÑ, как пÑÐ¾Ð¹Ð´ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво дней, вÑÑÑавленное в паÑамеÑÑе MailboxRetention
Set-MailboxDatabase -MailboxRetention '0.00:00:00' -Identity $db_name измениÑÑ Ð·Ð½Ð°Ñение
Archive
Enable-Mailbox -Identity $name -Archive вклÑÑиÑÑ Ð°ÑÑ
ив Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ
Get-Mailbox $name | New-MoveReques âArchiveOnly âArchiveTargetDatabase DBArch пеÑемеÑÑиÑÑ Ð°ÑÑ
ивнÑй поÑÑовÑй ÑÑик в дÑÑгÑÑ ÐÐ
Get-Mailbox $name | fl Name,Database,ArchiveDatabase меÑÑо ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÐРполÑзоваÑÐµÐ»Ñ Ð¸ ÐРего аÑÑ
ива
Disable-Mailbox -Identity $name -Archive оÑклÑÑиÑÑ Ð°ÑÑ
ив
Connect-Mailbox -Identity "8734c04e-981e-4ccf-a547-1c1ac7ebf3e2" -Archive -User $name -Database it2 подклÑÑение аÑÑ
ива полÑзоваÑÐµÐ»Ñ Ðº ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿Ð¾ÑÑÐ¾Ð²Ð¾Ð¼Ñ ÑÑикÑ
Get-Mailbox $name | Set-Mailbox -ArchiveQuota 20GB -ArchiveWarningQuota 19GB наÑÑÑоиÑÑ ÐºÐ²Ð¾ÑÑ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð°ÑÑ
ива
Quota
Get-Mailbox -Identity $mailbox | fl IssueWarningQuota, ProhibitSendQuota, ProhibitSendReceiveQuota, UseDatabaseQuotaDefaults оÑобÑазиÑÑ ÐºÐ²Ð¾ÑÑ Ð¿Ð¾ÑÑового ÑÑика
IssueWarningQuota â квоÑа, пÑи доÑÑижении коÑоÑой Exchange оÑпÑÐ°Ð²Ð¸Ñ Ñведомление
ProhibitSendQuota â пÑи доÑÑижении бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑеÑена оÑпÑавка
ProhibitSendReceiveQuota â пÑи доÑÑижении бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑеÑена оÑпÑавка и полÑÑение
UseDatabaseQuotaDefaults â иÑполÑзÑеÑÑÑ Ð»Ð¸ квоÑа ÐРили false - индвидиÑалÑнÑе
Set-Mailbox -Identity $mailbox -UseDatabaseQuotaDefaults $false -IssueWarningQuota "3 GB" -ProhibitSendQuota "4 GB" -ProhibitSendReceiveQuota "5 GB" задаÑÑ ÐºÐ²Ð¾ÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ
Get-MailboxDatabase $db_name | fl Name, *Quota оÑобÑазиÑÑ ÐºÐ²Ð¾ÑÑ Ð½Ð°Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе на ÐÐ
Set-MailboxDatabase $db -ProhibitSendReceiveQuota "5 GB" -ProhibitSendQuota "4 GB" -IssueWarningQuota "3 GB" наÑÑÑоиÑÑ ÐºÐ²Ð¾ÑÑ Ð½Ð° ÐÐ
Database
Get-MailboxDatabase -Status | select ServerName,Name,DatabaseSize ÑпиÑок и ÑÐ°Ð·Ð¼ÐµÑ Ð²ÑеÑ
ÐРна вÑеÑ
MX-ÑеÑвеÑаÑ
New-MailboxDatabase -Name it_2022 -EdbFilePath E:\Bases\it_2022\it_2022.edb -LogFolderPath G:\Logs\it_2022 -OfflineAddressBook "Default Offline Address List" -server exch-mx-01 ÑоздаÑÑ ÐÐ
Restart-Service MSExchangeIS
Get-Service | Where {$_ -match "exchange"} | Restart-Service
Get-MailboxDatabase -Server exch-01 ÑпиÑок баз даннÑÑ
на MX-ÑеÑвеÑе
New-MoveRequest -Identity "support4" -TargetDatabase it_2022 пеÑемеÑÑиÑÑ Ð¿Ð¾ÑÑовÑй ÑÑик в новÑÑ ÐÐ
Move-Databasepath $db_name âEdbFilepath "F:\DB\$db_name\$db_name.edb" âLogFolderpath "E:\DB\$db_name\logs\" пеÑемеÑÑиÑÑ ÐРи ÑÑанзакÑионнÑе логи на дÑÑгой диÑк
Set-MailboxDatabase -CircularLoggingEnabled $true -Identity $db_name вклÑÑиÑÑ ÑиклиÑеÑкое ведение жÑÑнала (Circular Logging), где поÑледоваÑелÑно пиÑÑÑÑÑ 4 Ñайла логов по 5 ÐÐ, поÑле Ñего пеÑвÑй лог-Ñайл пеÑезапиÑÑваеÑÑÑ
Set-MailboxDatabase -CircularLoggingEnabled $false -Identity $db_name оÑклÑÑиÑÑ ÑиклиÑеÑкое ведение жÑÑнала
Get-MailboxDatabase -Server "exch-mx-01" -Status | select EdbFilePath,LogFolderPath,LogFilePrefix пÑÑÑ Ðº ÐÐ, логам, Ð¸Ð¼Ñ ÑекÑÑего акÑÑалÑного лог-Ñайла
MailboxRepairRequest
New-MailboxRepairRequest -Database it2 -CorruptionType ProvisionedFolder, SearchFolder, AggregateCounts, Folderview запÑÑÑиÑÑ Ð¿Ð¾ÑледоваÑелÑнÑй ÑеÑÑ (в конкÑеÑнÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени не доÑÑÑпен один поÑÑовÑй ÑÑик) и иÑпÑавление оÑибок на пÑикладном ÑÑовне
Get-MailboxRepairRequest -Database it2 пÑогÑеÑÑ Ð²ÑполнениÑ
ÐозволÑÐµÑ Ð¸ÑпÑавиÑÑ:
ProvisionedFolder â наÑÑÑÐµÐ½Ð¸Ñ Ð»Ð¾Ð³Ð¸ÑеÑкой ÑÑÑÑкÑÑÑÑ Ð¿Ð°Ð¿Ð¾Ðº
SearchFolder â оÑибки в папкаÑ
поиÑка
AggregateCounts â пÑовеÑка и иÑпÑавление инÑоÑмаÑии о колиÑеÑÑве ÑлеменÑов в папкаÑ
и иÑ
ÑазмеÑе
FolderView â невеÑное ÑодеÑжимое, оÑобÑажаемое пÑедÑÑавлениÑми папок
eseutil
ÐÑи оÑпÑавке/полÑÑении лÑбого пиÑÑма Exchange ÑнаÑала вноÑÐ¸Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð² ÑÑанзакÑионнÑй лог, и ÑолÑко поÑом ÑÐ¾Ñ ÑанÑÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно в Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . Ð Ð°Ð·Ð¼ÐµÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ лог Ñайла - 1 Ðб. ÐÑÑÑ ÑÑи ÑпоÑоба ÑÑÐµÐ·Ð°Ð½Ð¸Ñ Ð»Ð¾Ð³Ð¾Ð²: DAG, Backup на базе Volume Shadow Copy, Circular Logging.
Ð ÑÑное Ñдаление жÑÑналов ÑÑанзакÑий:
cd E:\MS_Exchange_2010\MailBox\Reg_v1_MailBoxes\ пеÑейÑи в каÑалог Ñ Ð»Ð¾Ð³Ð°Ð¼Ð¸
ls E*.chk ÑзнаÑÑ Ð¸Ð¼Ñ Ñайла, в коÑоÑом наÑ
одиÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¸Ð· конÑÑолÑной ÑоÑки ÑикÑаÑии жÑÑналов
eseutil /mk .\E18.chk ÑзнаÑÑ Ð¿Ð¾Ñледний Ñайл жÑÑнала, дейÑÑÐ²Ð¸Ñ Ð¸Ð· коÑоÑого бÑли занеÑÐµÐ½Ñ Ð² ÐÐ Exchange
Checkpoint: (0x561299,8,16) 561299 Ð¸Ð¼Ñ Ñайла, коÑоÑÑй бÑл поÑледним заÑикÑиÑован (его инÑоÑмаÑÐ¸Ñ Ñже в базе даннÑÑ
)
ÐаÑ
одим в пÑоводнике Ñайл E0500561299.txt, можно ÑдалÑÑÑ Ð²Ñе ÑÐ°Ð¹Ð»Ñ Ð¶ÑÑналов, коÑоÑÑе ÑÑаÑÑе найденного Ñайла
ÐоÑÑÑановление ÐÐ (еÑли две копии ÐÐ Ñ Ð¾Ñибкой):
Get-MailboxDatabaseCopyStatus -Identity db_name\* | Format-List Name,Status,ContentIndexState
Status : FailedAndSuspended
ContentIndexState : Failed
Status : Dismounted
ContentIndexState : Failed
Get-MailboxDatabase -Server exch-mx-01 -Status | fl Name,EdbFilePath,LogFolderPath пÑовеÑиÑÑ ÑаÑположение Ð±Ð°Ð·Ñ Ð¸ ÑÑанзакÑионнÑÑ
логов
LogFolderPath - диÑекÑоÑÐ¸Ñ Ð»Ð¾Ð³Ð¾Ð²
E18 - Ð¸Ð¼Ñ ÑÑанкзакÑионного лога (из него ÑиÑаÑÑÑÑ Ð¾ÑÑалÑнÑе логи)
dismount-Database db_name оÑманÑиÑоваÑÑ ÐÐ
eseutil /mh D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb пÑовеÑиÑÑ Ð±Ð°Ð·Ñ
State: Dirty Shutdown - неÑоглаÑованное ÑоÑÑоÑние, ознаÑаеÑ, ÑÑо ÑаÑÑÑ ÑÑанзакÑий не пеÑенеÑена в базÑ, напÑимеÑ, поÑле Ñого, как бÑла оÑÑÑеÑÑвлена аваÑÐ¸Ð¹Ð½Ð°Ñ Ð¿ÐµÑезагÑÑзка ÑеÑвеÑа.
eseutil /ml E:\MS_Exchange_2010\MailBox\db_name\E18 пÑовеÑка ÑелоÑÑноÑÑи ÑÑанзакÑионнÑÑ
логи, еÑли еÑÑÑ Ð»Ð¾Ð³Ð¸ ÑÑанзакÑий и они не иÑпоÑÑенÑ, Ñо можно воÑÑÑановиÑÑ Ð¸Ð· ниÑ
, из Ñайла E18 ÑÑиÑÑваÑÑÑÑ Ð²Ñе логи, должен бÑÑÑ ÑÑаÑÑÑ - ÐÐ
Soft Recovery (мÑгкое воÑÑÑановление) - необÑ
одимо пеÑевеÑÑи Ð±Ð°Ð·Ñ Ð² ÑоÑÑоÑние коÑÑекÑного оÑклÑÑÐµÐ½Ð¸Ñ (Clear shutdown) пÑÑем запиÑи недоÑÑаÑÑиÑ
Ñайлов жÑÑналов ÑÑанзакÑий в ÐÐ.
eseutil /R E18 /l E:\MS_Exchange_2010\MailBox\db_name\ /d D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb
eseutil /R E18 /a /i /l E:\MS_Exchange_2010\MailBox\db_name\ /d D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb еÑли Ñ Ð»Ð¾Ð³Ð°Ð¼Ð¸ ÑÑо-Ñо не Ñак, можно попÑобоваÑÑ Ð²Ð¾ÑÑÑановиÑÑ Ð±Ð°Ð·Ñ Ð¸Ð³Ð½Ð¾ÑиÑÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð² логаÑ
eseutil /mk D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb cоÑÑоÑнии Ñайла конÑÑолÑнÑÑ
ÑоÑек
eseutil /g D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb пÑовеÑка ÑелоÑÑноÑÑи ÐÐ
eseutil /k D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb пÑовеÑка конÑÑолÑнÑÑ
ÑÑмм Ð±Ð°Ð·Ñ (CRC)
Hard Recovery - еÑли логи ÑодеÑÐ¶Ð°Ñ Ð¾Ñибки и база не воÑÑÑанавливаеÑÑÑ, Ñо воÑÑÑанавливаем Ð±Ð°Ð·Ñ Ð±ÐµÐ· логов.
eseutil /p D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb
/p - ÑÐ´Ð°Ð»Ð¸Ñ Ð¿Ð¾Ð²ÑежденнÑе ÑÑÑаниÑÑ, ÑÑа инÑоÑмаÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ñдалена из ÐРи воÑÑÑÐ°Ð½Ð¾Ð²Ð¸Ñ ÑелоÑÑноÑÑÑ
esetuil /d D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb вÑполниÑÑ Ð´ÐµÑÑагменÑаÑÐ¸Ñ (еÑли бÑл поÑеÑÑн болÑÑой обÑем даннÑÑ
, Ñо Ð¼Ð¾Ð¶ÐµÑ ÑилÑно ÑнизиÑÑÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ)
ÐоÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ необÑ
одимо вÑÑÑнÑÑ ÑдалиÑÑ Ð²Ñе ÑÐ°Ð¹Ð»Ñ Ñ ÑаÑÑиÑением log в папке MDBDATA, пеÑед попÑÑкой ÑмонÑиÑоваÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
.
isinteg -s "db_name.edb" -test alltests пÑовеÑÑÑе ÑелоÑÑноÑÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
isinteg -s "server_name" -fix -test -alltests еÑли пÑовеÑка бÑÐ´ÐµÑ Ð¿Ñовалена. ÐÑполнÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð´Ð¾ ÑеÑ
поÑ, пока Ñ Ð²ÑеÑ
оÑибок не ÑÑÐ°Ð½ÐµÑ ÑÑаÑÑÑ 0 или ÑÑаÑÑÑ Ð½Ðµ пеÑеÑÑÐ°Ð½ÐµÑ Ð¼ÐµÐ½ÑÑÑÑÑ, иногда необÑ
одимо 3 пÑоÑ
ода Ð´Ð»Ñ Ð´Ð¾ÑÑÐ¸Ð¶ÐµÐ½Ð¸Ñ ÑезÑлÑÑаÑа.
eseutil /mh D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb | Select-String -Pattern "State:","Log Required:" пÑовеÑиÑÑ ÑÑаÑÑÑ
State: Clear shutdown - ÑÑпеÑнÑй ÑÑаÑÑÑ
Log Required ÑÑебÑÑÑÑÑ Ð»Ð¸ ÑÐ°Ð¹Ð»Ñ Ð¶ÑÑналов, необÑ
одимÑе базе, ÑÑÐ¾Ð±Ñ Ð¿ÐµÑейÑи в ÑоглаÑованное ÑоÑÑоÑние. ÐÑли база ÑазмонÑиÑована коÑÑекÑно, Ñо ÑÑо знаÑение бÑÐ´ÐµÑ ÑавнÑÑÑÑÑ 0.
mount-Database -force db_name пÑимонÑиÑоваÑÑ ÐÐ
Get-MailboxDatabase âStatus db_name | fl Mounted ÑÑаÑÑÑ ÐÐ
New-MailboxRepairRequest -Database db_name -CorruptionType SearchFolder,AggregateCounts,ProvisionedFolder,FolderView воÑÑÑановление логиÑеÑкой ÑелоÑÑноÑÑи даннÑÑ
ÐоÑле ÑÑого воÑÑÑановиÑÑ Index.
ÐÑли индекÑÑ Ð½Ðµ воÑÑÑанавливаÑÑÑÑ, но ÐРмонÑиÑÑеÑÑÑ, Ñо пеÑенеÑÑи поÑÑовÑе ÑÑики в новÑÑ ÐÐ.
ÐоÑÑÑановление ÐРиз Backup:
1-й ваÑианÑ:
- ÐÑманÑиÑоваÑÑ ÑекÑÑÑÑ ÐРи ÑдалиÑÑ Ð¸Ð»Ð¸ пеÑеименоваÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ Ñ Ñайлами ÑекÑÑей ÐÐ.
- ÐоÑÑÑановиÑÑ Ð² ÑÑ Ð¶Ðµ диÑекÑоÑÐ¸Ñ Ð¸Ð· Backup Ð±Ð°Ð·Ñ Ñ Ð»Ð¾Ð³Ð°Ð¼Ð¸.
- ÐапÑÑÑиÑÑ Ð¼Ñгкое воÑÑÑановление ÐÐ (Soft Recovery).
- ÐÑимониÑоÑваÑÑ.
2-й ваÑианÑ:
- ÐÑманÑиÑоваÑÑ Ð¸ ÑдалиÑÑ ÑекÑÑÑÑ ÐÐ.
- ÐоÑÑÑановиÑÑ ÐÐ Ñ Ð»Ð¾Ð³Ð°Ð¼Ð¸ из Backup в лÑбое меÑÑо.
- ÐапÑÑÑиÑÑ Ð¼Ñгкое воÑÑÑановление ÐÐ (Soft Recovery).
- СоздаÑÑ Ð½Ð¾Ð²ÑÑ ÐÐ.
- СоздаÑÑ Recovery Database и ÑмонÑиÑоваÑÑ Ð² нее воÑÑÑановленнÑÑ Ð¸Ð· бÑкапа ÐÐ, ÑкопиÑоваÑÑ Ð¸Ð· Ð½ÐµÑ Ð¿Ð¾ÑÑовÑе ÑÑики в новÑÑ ÐРи пеÑеклÑÑиÑÑ Ð½Ð° Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелей.
- ÐÑли иÑполÑзоваÑÑ Dial Tone Recovery, Ñо Ñак же пеÑенеÑÑи из вÑеменной ÐРпÑомежÑÑоÑнÑе даннÑе поÑÑовÑÑ ÑÑиков.
3-й ваÑианÑ:
- ÐоÑÑÑановиÑÑ ÑелоÑÑноÑÑÑ Soft Repair или Hard Recovery.
- СоздаÑÑ Ð½Ð¾Ð²ÑÑ ÐÐ. УказÑваÑÑ Ð² ÑвойÑÑÐ²Ð°Ñ : «база Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑезапиÑана пÑи воÑÑÑановлении».
- ÐÑли база бÑла ÑолÑко ÑÑо оздана и еÑе не бÑла подмонÑиÑована, Ñо ÑÑа папка бÑÐ´ÐµÑ Ð¿ÑÑÑа, ÑÑда пеÑемеÑаем Ð±Ð°Ð·Ñ Ð¸Ð· Backup, коÑоÑÐ°Ñ Ð±Ñла обÑабоÑана ESEUTIL вмеÑÑе Ñо вÑеми Ñайлами. УказаÑÑ Ð¸Ð¼Ñ .edb Ñакое же, коÑоÑое бÑло пÑи Ñоздании новой базÑ.
- ÐонÑиÑÑем базÑ.
- ÐеÑенаÑеливаем ÑÑики Ñо ÑÑаÑой (Mailbox_DB_02), неиÑпÑавной базÑ, на новÑÑ Ð±Ð°Ð·Ñ (Mailbox_DB_02_02):
Get-Mailbox -Database Mailbox_DB_02 | where {$_.ObjectClass -NotMatch '(SystemAttendantMailbox|ExOleDbSystemMailbox)'} | Set-Mailbox -Database Mailbox_DB_02_02 - ÐоÑÑÑановление логиÑеÑкой ÑелоÑÑноÑÑи даннÑÑ
:
New-MailboxRepairRequest -Database "Mailbox_DB_02_02" -CorruptionType ProvisionedFolder, SearchFolder, AggregateCounts, Folderview
Dial Tone Recovery
Get-Mailbox -Database "MailboxDB" | Set-Mailbox -Database "TempDB" пеÑенаÑелиÑÑ ÑÑики Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÐÐ (неÑабоÑей) на дÑÑгÑÑ (пÑÑÑÑÑ)
Get-Mailbox -Database TempDB оÑобÑазиÑÑ Ð¿Ð¾ÑÑовÑе ÑÑики в ÐÐ TempDB
Restart-Service MSExchangeIS пеÑезапÑÑÑиÑÑ ÑлÑÐ¶Ð±Ñ Mailbox Information Store (банка даннÑÑ
), инаÑе полÑзоваÑели бÑдÑÑ Ð¿Ð¾-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð¿ÑÑаÑÑÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑиÑÑÑÑ Ðº ÑÑаÑой ÐÐ
iisreset
Get-Mailbox -Database "TempDB" | Set-Mailbox -Database "MailboxDB" поÑле воÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑаÑой ÐÐ, нÑжно пеÑеклÑÑиÑÑ Ð¿Ð¾Ð»ÑзоваÑелей Ñ Ð²Ñеменной ÐРобÑаÑно
ÐоÑле ÑÑого ÑделаÑÑ ÑлиÑние Ñ Ð²Ñеменной ÐÐ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Recovery.
Recovery database (RDB)
New-MailboxDatabase âRecovery âName RecoveryDB âServer $exch_mx âEdbFilePath "D:\TempDB\TempDB.edb" -LogFolderPath "D:\TempDB" Ð´Ð»Ñ Ð¿ÐµÑеноÑа новÑÑ
пиÑем из вÑеменной ÐРв оÑновнÑÑ Ð½ÐµÐ¾Ð±Ñ
одим ÑолÑко Ñам Ñайл TempDB.edb Ñо ÑÑаÑÑÑом Clean Shutdown, из нее необÑ
одимо ÑоздаÑÑ ÑлÑжебнÑÑ ÐÐ (клÑÑ -Recovery)
Mount-Database "D:\TempDB\TempDB.edb" пÑимонÑиÑоваÑÑ ÐÐ
Get-MailboxStatistics -Database RecoveryDB
New-MailboxRestoreRequest âSourceDatabase RecoveryDB âSourceStoreMailbox support âTargetMailbox support ÑкопиÑоваÑÑ Ð´Ð°Ð½Ð½Ñе поÑÑового ÑÑика Ñ DisplayName: support из RecoveryDB в поÑÑовÑй ÑÑик Ñ Ð¿Ñевдонимом support ÑÑÑеÑÑвÑÑÑей базÑ. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ÑÐµÑ Ð² поÑÑовой базе ÑовпадаÑÑие LegacyExchangeDN либо пÑовеÑÑÐµÑ Ñовпадение адÑеÑа X500, еÑли нÑжно воÑÑÑановиÑÑ Ð´Ð°Ð½Ð½Ñе в дÑÑгой ÑÑик, нÑжно ÑказÑваÑÑ ÐºÐ»ÑÑ -AllowLegacyDNMisMatch
New-MailboxRestoreRequest âSourceDatabase RecoveryDB âSourceStoreMailbox support âTargetMailbox support âTargetRootFolder "Restore" ÑкопиÑоваÑÑ Ð¿Ð¸ÑÑма в оÑделÑнÑÑ Ð¿Ð°Ð¿ÐºÑ Ð² ÑÑике назнаÑÐµÐ½Ð¸Ñ (ÑоздаеÑÑÑ Ð°Ð²ÑомаÑиÑеÑки), возможно воÑÑÑановиÑÑ ÑодеÑжимое конкÑеÑной папки -IncludeFolders "#Inbox#"
Get-MailboxRestoreRequest | Get-MailboxRestoreRequestStatistics ÑÑаÑÑÑ Ð·Ð°Ð¿ÑоÑа воÑÑÑановлениÑ
Get-MailboxRestoreRequestStatistics -Identity support
Get-MailboxRestoreRequest -Status Completed | Remove-MailboxRestoreRequest ÑдалиÑÑ Ð²Ñе ÑÑпеÑнÑе запÑоÑÑ
Transport
Get-TransportServer $srv_cas | select MaxConcurrentMailboxDeliveries,MaxConcurrentMailboxSubmissions,MaxConnectionRatePerMinute,MaxOutboundConnections,MaxPerDomainOutboundConnections,PickupDirectoryMaxMessagesPerMinute наÑÑÑойки пÑопÑÑкной ÑпоÑобноÑÑи ÑÑанÑпоÑÑного ÑеÑвеÑа
MaxConcurrentMailboxDeliveries â макÑималÑное колиÑеÑÑво одновÑеменнÑÑ
поÑоков, коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑкÑÑÑÑ ÑеÑÐ²ÐµÑ Ð´Ð»Ñ Ð¾ÑпÑавки пиÑем.
MaxConcurrentMailboxSubmissions â макÑималÑное колиÑеÑÑво одновÑеменнÑÑ
поÑоков, коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑкÑÑÑÑ ÑеÑÐ²ÐµÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¿Ð¸Ñем.
MaxConnectionRatePerMinute â макÑималÑное Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ ÑкоÑоÑÑÑ Ð¾ÑкÑÑÑÐ¸Ñ Ð²Ñ
одÑÑиÑ
Ñоединений в минÑÑÑ.
MaxOutboundConnections â макÑималÑное возможное колиÑеÑÑво Ñоединений, коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑкÑÑÑÑ Exchange Ð´Ð»Ñ Ð¾ÑпÑавки.
MaxPerDomainOutboundConnections â макÑималÑное возможное колиÑеÑÑво иÑÑ
одÑÑиÑ
Ñоединений, коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑкÑÑÑÑ Exchange Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñдаленного домена.
PickupDirectoryMaxMessagesPerMinute â ÑкоÑоÑÑÑ Ð²Ð½ÑÑÑенней обÑабоÑки ÑообÑений в минÑÑÑ (ÑаÑпÑеделение пиÑем по папкам).
Set-TransportServer exchange-cas -MaxConcurrentMailboxDeliveries 21 -MaxConcurrentMailboxSubmissions 21 -MaxConnectionRatePerMinute 1201 -MaxOutboundConnections 1001 -MaxPerDomainOutboundConnections 21 -PickupDirectoryMaxMessagesPerMinute 101 измениÑÑ Ð·Ð½Ð°ÑениÑ
Get-TransportConfig | select MaxSendSize, MaxReceiveSize огÑаниÑение ÑазмеÑа ÑообÑÐµÐ½Ð¸Ñ Ð½Ð° ÑÑовне ÑÑаÑпоÑÑа (наименÑÑий пÑиоÑиÑеÑ, поÑле коннекÑоÑа и поÑÑового ÑÑика).
New-TransportRule -Name AttachmentLimit -AttachmentSizeOver 15MB -RejectMessageReasonText "Sorry, messages with attachments over 15 MB are not accepted" ÑоздаÑÑ ÑÑанÑпоÑÑное пÑавило Ð´Ð»Ñ Ð¿ÑовеÑки ÑазмеÑа вложениÑ
Connector
Get-ReceiveConnector | select Name,MaxMessageSize,RemoteIPRanges,WhenChanged огÑаниÑÐµÐ½Ð¸Ñ ÑазмеÑа ÑообÑÐµÐ½Ð¸Ñ Ð½Ð° ÑÑовне коннекÑоÑа (пÑиоÑиÑÐµÑ Ð½Ð¸Ð¶Ðµ, Ñем Ñ Ð¿Ð¾ÑÑового ÑÑика)
Set-ReceiveConnector ((Get-ReceiveConnector).Identity)[-1] -MaxMessageSize 30Mb измениÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ñ Ð¿Ð¾Ñледнего коннекÑоÑа в ÑпиÑке (пÑиоÑиÑÐµÑ Ð²ÑÑе, Ñем Ñ ÑÑаÑпоÑÑа)
Get-Mailbox "support4" | select MaxSendSize, MaxReceiveSize наивÑÑÑий пÑиоÑиÑеÑ
Set-Mailbox "support4" -MaxSendSize 30MB -MaxReceiveSize 30MB измениÑÑ ÑазмеÑ
Set-SendConnector -Identity "ConnectorName" -Port 26 измениÑÑ Ð¿Ð¾ÑÑ ÐºÐ¾Ð½Ð½ÐµÐºÑоÑа оÑпÑавки
Get-SendConnector "proxmox" | select port
Get-ReceiveConnector | select Name,MaxRecipientsPerMessage по ÑмолÑÐ°Ð½Ð¸Ñ Exchange пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ð³ÑаниÑенное колиÑеÑÑво адÑеÑаÑов в одном пиÑÑме (200)
Set-ReceiveConnector ((Get-ReceiveConnector).Identity)[-1] -MaxRecipientsPerMessage 50 измениÑÑ Ð·Ð½Ð°Ñение
Set-ReceiveConnector ((Get-ReceiveConnector).Identity)[-1] -MessageRateLimit 1000 задаÑÑ Ð»Ð¸Ð¼Ð¸Ñ Ð¾Ð±ÑабоÑки ÑообÑений в минÑÑÑ Ð´Ð»Ñ ÐºÐ¾Ð½Ð½ÐµÐºÑоÑа
Get-OfflineAddressbook | Update-OfflineAddressbook обновиÑÑ OAB
Get-ClientAccessServer | Update-FileDistributionService
PST
New-MailboxExportRequest -Mailbox $name -filepath "\\$srv\pst\$name.PST" # -ContentFilter {(Received -lt "01/01/2021")} -Priority Highest/Lower # -IsArchive вÑполниÑÑ ÑкÑпоÑÑ Ð¸Ð· аÑÑ
ива полÑзоваÑелÑ
New-MailboxExportRequest -Mailbox $name -IncludeFolders "#Inbox#" -FilePath "\\$srv\pst\$name.PST" ÑолÑко Ð¿Ð°Ð¿ÐºÑ Ð²Ñ
одÑÑие
New-MailboxImportRequest -Mailbox $name "\\$srv\pst\$name.PST" импоÑÑ Ð¸Ð· PST
Get-MailboxExportRequest ÑÑаÑÑÑ Ð·Ð°Ð¿ÑоÑов
Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest ÑдалиÑÑ ÑÑпеÑно завеÑÑеннÑе запÑоÑÑ
Remove-MailboxExportRequest -RequestQueue MBXDB01 -RequestGuid 25e0eaf2-6cc2-4353-b83e-5cb7b72d441f оÑмениÑÑ ÑкÑпоÑÑ
DistributionGroup
Get-DistributionGroup ÑпиÑок гÑÑпп ÑаÑÑÑлки
Get-DistributionGroupMember "!_ÐÑиÑ" ÑпиÑок полÑзоваÑелей в гÑÑппе
Add-DistributionGroupMember -Identity "!_ÐÑиÑ" -Member "$name@$domain" добавиÑÑ Ð² гÑÑÐ¿Ð¿Ñ ÑаÑÑÑлки
Remove-DistributionGroupMember -Identity "!_ÐÑиÑ" -Member "$name@$domain"
New-DistributionGroup -Name "!_ТеÑÑ" -Members "$name@$domain" ÑоздаÑÑ Ð³ÑÑппÑ
Set-DistributionGroup -Identity "support4" -HiddenFromAddressListsEnabled $true (или Set-Mailbox) ÑкÑÑÑÑ Ð¸Ð· ÑпиÑка адÑеÑов Exchange
Search
Search-Mailbox -Identity "support4" -SearchQuery 'Тема:"Mikrotik DOWN"' поиÑк пиÑем по Ñеме
Search-Mailbox -Identity "support4" -SearchQuery 'Subject:"Mikrotik DOWN"'
Search-Mailbox -Identity "support4" -SearchQuery 'attachment -like:"*.rar"'
Search-Mailbox -Identity "support4" -SearchQuery "оÑпÑавлено: < 01/01/2020" -DeleteContent -Force Ñдаление пиÑем по даÑе
ФоÑÐ¼Ð°Ñ Ð´Ð°ÑÑ Ð² завиÑимоÑÑи Ð¾Ñ ÑегионалÑнÑÑ
наÑÑÑоек ÑеÑвеÑа:
20/07/2018
07/20/2018
20-Jul-2018
20/July/2018
AuditLog
Get-AdminAuditLogConfig наÑÑÑойки аÑдиÑа
Set-Mailbox -Identity "support4" -AuditOwner HardDelete добавиÑÑ Ð»Ð¾Ð³Ð¸Ñование HardDelete пиÑем
Set-mailbox -identity "support4" -AuditlogAgelimit 120 ÑказаÑÑ Ð²ÑÐµÐ¼Ñ Ñ
ÑанениÑ
Get-mailbox -identity "support4" | Format-list Audit* даннÑе аÑдиÑа
Search-MailboxAuditLog -Identity "support4" -LogonTypes Delegate -ShowDetails -Start "2022-02-22 18:00" -End "2022-03-22 18:00" пÑоÑмоÑÑ Ð»Ð¾Ð³Ð¾Ð²
Search-AdminAuditLog -StartDate "02/20/2022" | ft CmdLetName,Caller,RunDate,ObjectModified -Autosize поиÑк ÑобÑÑий иÑÑоÑии вÑполненÑÑ
команд в жÑÑнале аÑдиÑа Exchange
Test
Test-ServiceHealth пÑовеÑиÑÑ Ð´Ð¾ÑÑÑпноÑÑÑ Ñолей ÑеÑвеÑа: поÑÑовÑÑ
ÑÑиков, клиенÑÑкого доÑÑÑпа, единой ÑиÑÑÐµÐ¼Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° ÑообÑениÑми, ÑÑаÑпоÑÑного ÑеÑвеÑа
$mx_srv_list | %{Test-MapiConnectivity -Server $_} пÑовеÑка подклÑÑÐµÐ½Ð¸Ñ MX-ÑеÑвеÑов к ÐÐ
Test-MAPIConnectivity -Database $db пÑовеÑка возможноÑÑи логина в базÑ
Test-MAPIConnectivity âIdentity $user@$domain пÑовеÑка возможноÑÑи логина в поÑÑовÑй ÑÑик
Test-ComputerSecureChannel пÑовеÑка ÑабоÑÑ ÑлÑÐ¶Ð±Ñ AD
Test-MailFlow ÑезÑлÑÑÐ°Ñ ÑеÑÑового поÑока поÑÑÑ
Queue
Get-TransportServer | %{Get-Queue -Server $_.Name} оÑобÑазиÑÑ Ð¾ÑеÑеди на вÑеÑ
ÑÑанÑпоÑÑнÑÑ
ÑеÑвеÑаÑ
Get-Queue -Identity EXCHANGE-CAS\155530 | Format-List подÑÐ¾Ð±Ð½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± оÑеÑеди
Get-Queue -Identity EXCHANGE-CAS\155530 | Get-Message -ResultSize Unlimited | Select FromAddress,Recipients оÑобÑазиÑÑ ÑпиÑок оÑпÑавиÑелей (FromAddress) и ÑпиÑок полÑÑаÑелей в оÑеÑеди (Recipients)
Get-Message -Queue EXCHANGE-CAS\155530 оÑобÑазиÑÑ Ð¸Ð½Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ ÑообÑений в конкÑеÑной оÑеÑеди (ÑеÑвеÑ\оÑеÑедÑ\иденÑиÑикаÑÐ¾Ñ Ð¿Ð¸ÑÑма)
Resume-Message EXCHANGE-CAS\155530\444010 повÑоÑиÑÑ Ð¾ÑпÑÐ°Ð²ÐºÑ Ð¿Ð¸ÑÑма из оÑеÑеди
Retry-Queue -Filter {Status -eq "Retry"} пÑинÑдиÑелÑно повÑоÑиÑÑ Ð¾ÑпÑÐ°Ð²ÐºÑ Ð²ÑеÑ
ÑообÑений c ÑÑаÑÑÑом "ÐовÑоÑиÑÑ"
Get-Queue -Identity EXCHANGE-CAS\155530 | Get-Message -ResultSize unlimited | Remove-Message -WithNDR $False оÑиÑÑиÑÑ Ð¾ÑеÑедÑ
Get-transportserver EXCHANGE-CAS | Select MessageExpirationTimeout оÑобÑазиÑÑ Ð²ÑÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ ÑообÑений в оÑеÑеди (по ÑмолÑаниÑ, 2 днÑ)
Error Exchange 452 4.3.1 Insufficient system resources - оконÑание Ñвободного меÑÑа на диÑке, на коÑоÑом наÑ
одÑÑÑÑ Ð¾ÑеÑеди ÑлÑÐ¶Ð±Ñ Exchange Hub Transport, за мониÑоÑинг оÑвеÑÐ°ÐµÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ð´Ð¾ÑÑÑпнÑÑ
ÑеÑÑÑÑов Back Pressure, коÑоÑÑй в Ñом ÑиÑле оÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°ÐµÑ Ñвободное меÑÑо на диÑке
ÐоÑог Medium (90%) â пеÑеÑÑаÑÑ Ð¿ÑинимаÑÑ Ð¿Ð¾ SMTP поÑÑÑ Ð¾Ñ Ð²Ð½ÐµÑниÑ
оÑпÑавиÑелей (поÑÑа Ð¾Ñ MAPI клиенÑов пÑи ÑÑом обÑабаÑÑваеÑÑÑ)
ÐоÑог High (99%) â обÑабоÑка поÑока поÑÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð¿ÑекÑаÑаеÑÑÑ
РеÑение: оÑиÑÑиÑÑ, напÑÐ¸Ð¼ÐµÑ Ð»Ð¾Ð³Ð¸ IIS (C:\inetpub\logs\LogFiles\W3SVC1), ÑвелиÑиÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð´Ð¸Ñка, оÑклÑÑиÑÑ Ð¼Ð¾Ð½Ð¸ÑоÑинг Back Pressure (плоÑ
ой ваÑианÑ) или пеÑенеÑÑи ÑÑанÑпоÑÑнÑе оÑеÑÐµÐ´Ñ Ð½Ð° дÑÑгой диÑк доÑÑаÑоÑного обÑÑма.
Get-Service | ? name -like "MSExchangeTransport" | Stop-Service оÑÑановиÑÑ ÑлÑÐ¶Ñ Ð¾ÑеÑеди
Rename-Item "C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\data\Queue" "C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\data\Queue_old" оÑиÑÑиÑÑ Ð±Ð°Ð·Ñ Ð¾ÑеÑеди
C:\Program Files\Microsoft\Exchange Server\V15\Bin\EdgeTransport.exe.config конÑигÑÑаÑионнÑй Ñайл, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ Ð¿ÑÑÑ Ðº бд Ñ Ð¾ÑеÑедÑÑ (блок <appSettings> клÑÑи
ÐÐ»Ñ Ð¿ÐµÑеноÑа ÐÐ, необÑ
одимо пеÑемеÑÑиÑÑ ÑÑÑеÑÑвÑÑÑие ÑÐ°Ð¹Ð»Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
Mail.que и Trn.chk (конÑÑолÑнÑе ÑоÑки Ð´Ð»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи в логаÑ
) из иÑÑ
одного меÑÑÐ¾Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² новое. ÐеÑемеÑÑиÑе ÑÑÑеÑÑвÑÑÑие ÑÐ°Ð¹Ð»Ñ Ð¶ÑÑнала ÑÑанзакÑий Trn.log, Trntmp.log, Trn nnnn.log , Trnres00001.jrs, Trnres00002.jrs и Temp.edb из ÑÑаÑого ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² новое. tmp.edb â вÑеменнÑй Ñайл Ð´Ð»Ñ Ð¿ÑовеÑки ÑÑ
ÐµÐ¼Ñ Ñамой базÑ, пеÑеноÑÑи не нÑжно.
ÐоÑле запÑÑка ÑлÑÐ¶Ð±Ñ ÑÑанÑпоÑÑа ÑдалиÑÑ ÑÑаÑÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
оÑеÑеди и ÑÐ°Ð¹Ð»Ñ Ð¶ÑÑнала ÑÑанзакÑий из ÑÑаÑого ÑаÑположениÑ.
Defrag
Get-MailboxDatabase -Status | ft Name, DatabaseSize, AvailableNewMailboxSpace
DatabaseSize - ÑекÑÑий ÑÐ°Ð·Ð¼ÐµÑ Ð±Ð°Ð·Ñ
AvailableNewMailboxSpace - обÑÑм пÑÑÑÑÑ
ÑÑÑаниÑ, пÑоÑÑÑанÑÑво, коÑоÑое можно оÑвободиÑÑ Ð¿Ñи деÑÑагменÑаÑии
(DatabaseSize â AvailableNewMailboxSpace) x 1,1 - необÑ
одимо дополниÑелÑно имеÑÑ Ñвободного меÑÑа не менее 110% Ð¾Ñ ÑекÑÑего ÑазмеÑа Ð±Ð°Ð·Ñ (без ÑÑеÑа пÑÑÑÑÑ
ÑÑÑаниÑ)
cd $path
Dismount-Database "$path\$db_name" оÑмонÑиÑоваÑÑ ÐÐ
eseutil /d "$path\$db_name.edb"
Mount-Database "$path\$db" пÑимонÑиÑоваÑÑ ÐÐ
DAG (Database Availability Group)
Install-WindowsFeature -Name Failover-Clustering -ComputerName EXCH-MX-01 оÑновÑваеÑÑÑ Ð½Ð° ÑеÑ
нологии Windows Server Failover Cluster
New-DatabaseAvailabilityGroup -Name dag-01 -WitnessServer fs-05 -WitnessDirectory C:\witness_exchange1 ÑоздаÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ñ Ñказанием Ñайлового ÑвидеÑÐµÐ»Ñ Ð´Ð»Ñ ÐºÐ²Ð¾ÑÑма
Quorum - ÑÑо пÑоÑеÑÑ Ð³Ð¾Ð»Ð¾ÑованиÑ, в коÑоÑом Ð´Ð»Ñ Ð¿ÑинÑÑÐ¸Ñ ÑеÑÐµÐ½Ð¸Ñ Ð½Ñжно имеÑÑ Ð±Ð¾Ð»ÑÑинÑÑво голоÑов, ÑÑо Ð±Ñ ÑделаÑÑ ÑекÑÑÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
акÑивной.
WitnessDirectory â иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
Ñайлового ÑеÑÑÑÑа-ÑвидеÑелÑ.
Set-DatabaseAvailabilityGroup dag-01 âDatabaseAvailabilityGroupIPAdress $ip измениÑÑ ip-адÑÐµÑ Ð³ÑÑппÑ
Get-DatabaseAvailabilityGroup ÑпиÑок вÑеÑ
гÑÑпп
Get-DatabaseAvailabilityGroup -Identity dag-01
Add-DatabaseAvailabilityGroupServer -Identity dag-01 -MailboxServer EXCH-MX-01 добавиÑÑ Ð¿ÐµÑвÑй ÑеÑÐ²ÐµÑ (вÑе ÐРна ÑеÑвеÑаÑ
в DAG Ð´Ð¾Ð»Ð¶Ð½Ñ Ñ
ÑаниÑÑÑÑ Ð¿Ð¾ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾Ð¼Ñ Ð¿ÑÑи)
Add-MailboxDatabaseCopy -Identity db_name -MailboxServer EXCH-MX-04 добавиÑÑ ÐºÐ¾Ð¿Ð¸Ñ ÐÐ
Get-MailboxDatabaseCopyStatus -Identity db_name\* | select Name,Status,LastInspectedLogTime ÑÑаÑÑÑ Ð¸ вÑÐµÐ¼Ñ Ð¿Ð¾Ñледнего копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¶ÑÑнала ÑÑанзакий
Status:
Mounted - ÑабоÑÐ°Ñ Ð±Ð°Ð·Ð°
Suspended - пÑиоÑÑановлено копиÑование
Healthy - ÑабоÑÐ°Ñ Ð¿Ð°ÑÑÐ¸Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ
ServiceDown - недоÑÑÑпна (вÑклÑÑен ÑеÑвеÑ)
Dismounted - оÑмонÑиÑована
FailedAndSuspended - оÑибка и пÑиоÑÑановка копиÑованиÑ
Resynchronizing - пÑоÑеÑÑ ÑинÑ
ÑонизаÑиÑ, где бÑÐ´ÐµÑ Ð¿Ð¾ÑÑепенно ÑменÑÑаÑÑÑÑ Ð´Ð»Ð¸Ð½Ð° оÑеÑеди
CopyQueue Length - длина ÑепликаÑионной оÑеÑеди копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ (0 - знаÑÐ¸Ñ Ð²Ñе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· акÑивной Ð±Ð°Ð·Ñ ÑеплиÑиÑÐ¾Ð²Ð°Ð½Ñ Ð² паÑÑивнÑÑ ÐºÐ¾Ð¿Ð¸Ñ)
Resume-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04 возобновиÑÑ (Resume) или запÑÑÑиÑÑ ÐºÐ¾Ð¿Ð¸Ñование бд на EXCH-MX-04 (из ÑÑаÑÑÑа Suspended в Healthy)
Suspend-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04 оÑÑановиÑÑ ÐºÐ¾Ð¿Ð¸Ñование (в ÑÑаÑÑÑ Suspended)
Update-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04 -DeleteExistingFiles обновиÑÑ ÐºÐ¾Ð¿Ð¸Ñ ÐÐ (ÑделаÑÑ Full Backup)
Set-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04 -ActivationPreference 1 измениÑÑ Ð¿ÑиоÑиÑÐµÑ Ð´Ð»Ñ Ð°ÐºÑиваÑии копий ÐÐ (какÑÑ Ð¸ÑполÑзоваÑÑ, 1 â Ñамое вÑÑокое знаÑение)
Move-ActiveMailboxDatabase db_name -ActivateOnServer EXCH-MX-04 -MountDialOverride:None -Confirm:$false вклÑÑиÑÑ ÐºÐ¾Ð¿Ð¸Ñ ÐРв DAG (пеÑеклÑÑиÑÑÑÑ Ð½Ð° акÑивнÑÑ ÐºÐ¾Ð¿Ð¸Ñ)
Remove-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04 -Confirm:$False ÑдалиÑÑ ÐºÐ¾Ð¿Ð¸Ð¸ паÑÑивной Ð±Ð°Ð·Ñ Ð² DAG-гÑÑппе (Ñ ÐРдолжно бÑÑÑ Ð¾ÑклÑÑено ведение ÑиклиÑеÑкого жÑÑнала)
Remove-DatabaseAvailabilityGroupServer -Identity dag-01 -MailboxServer EXCH-MX-04 -ConfigurationOnly ÑдалиÑÑ MX ÑеÑÐ²ÐµÑ Ð¸Ð· гÑÑÐ¿Ð¿Ñ DAG
Import-Module FailoverClusters
Get-ClusterNode EXCH-MX-04 | Remove-ClusterNode -Force ÑдалиÑÑ Ð¾ÑказавÑий Ñзел из Windows Failover Cluster
Get-DatabaseAvailabilityGroup | Get-DatabaseAvailabilityGroupHealth мониÑоÑинг
Index
Get-MailboxDatabaseCopyStatus * | select name,status,ContentIndexState,ContentIndexErrorMessage,ActiveDatabaseCopy,LatestCopyBackupTime,CopyQueueLength ÑзнаÑÑ ÑоÑÑоÑние ÑабоÑÑ Ð¸Ð½Ð´ÐºÑов ÐРи ÑекÑÑ Ð¾Ñибки, на каком ÑеÑвеÑе акÑÐ¸Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ ÐÐ, даÑа поÑледней копии и ÑекÑÑÐ°Ñ Ð¾ÑеÑедÑ
Get-MailboxDatabaseCopyStatus -Identity $db_name\* | Format-List Name,ContentIndexState оÑобÑазиÑÑ ÑпиÑок вÑеÑ
копий конкÑеÑной ÐРна вÑеÑ
ÑеÑвеÑаÑ
, и ÑÑаÑÑÑ Ð¸Ñ
индекÑов, еÑли Ñ Ð²ÑоÑого ÑеÑвеÑа ÑÑаÑÑÑ Healthy, можно воÑÑÑановиÑÑ Ð¸Ð· него
Get-MailboxDatabaseCopyStatus -Identity $db_name\EXCH-MX-04 | Update-MailboxDatabaseCopy -SourceServer EXCH-MX-01 -CatalogOnly воÑÑÑановиÑÑ ÐРиз копии
cd %PROGRAMFILES%\Microsoft\Exchange Server\V14\Scripts или v15 Ð´Ð»Ñ Exchange 2016
.\ResetSearchIndex.ps1 $db_name ÑкÑÐ¸Ð¿Ñ Ð²Ð¾ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа
Get-MailboxDatabaseCopyStatus * | where {$_.ContentIndexState -eq "Failed" -or $_.ContentIndexState -eq "FailedAndSuspended"} оÑобÑазиÑÑ Ñ ÐºÐ°ÐºÐ¾Ð¹ ÐРпÑоизоÑел Ñбой ÑабоÑÑ (FailedAndSuspended) или индекÑа (ContentIndexState)
TrueNAS
import-Module TrueNas
(Get-Module TrueNas).ExportedCommands
Connect-TrueNasServer -Server tnas-01 -SkipCertificateCheck
Get-TrueNasCertificate наÑÑÑойки ÑеÑÑиÑикаÑа
Get-TrueNasSetting наÑÑÑойки ÑзÑка, time zone, syslog level и server, https port
Get-TrueNasUser ÑпиÑок полÑзоваÑелей
Get-TrueNasSystemVersion Ñ
аÑакÑеÑиÑÑики (Physical Memory, Model, Cores) и Uptime
Get-TrueNasSystemAlert snmp Ð´Ð»Ñ Ð¾Ð¿Ð¾Ð²ÐµÑений
Get-TrueNasSystemNTP ÑпиÑок иÑполÑзÑемÑÑ
NTP ÑеÑвеÑов
Get-TrueNasDisk ÑпиÑок Ñазделов ÑизиÑеÑкого диÑка
Get-TrueNasInterface ÑеÑевÑе инÑеÑÑейÑÑ
Get-TrueNasGlobalConfig ÑеÑевÑе наÑÑÑойки
Get-TrueNasDnsServer наÑÑÑоеннÑе DNS-ÑеÑвеÑа
Get-TrueNasIscsiTarget оÑобÑазиÑÑ ID гÑÑÐ¿Ð¿Ñ Ð¸Ð½Ð¸ÑиаÑоÑов иÑполÑзÑÑÑиÑ
ÑаÑгеÑ, иÑполÑзÑемÑй portal, authentification и authen-method
Get-TrueNasIscsiInitiator оÑобÑазиÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ð¸Ð½Ð¸ÑиаÑоÑов
Get-TrueNasIscsiPortal ÑлÑÑаÑÐµÐ»Ñ (Listen) и поÑÑ
Get-TrueNasIscsiExtent ÑпиÑок ISCSi Target (ÑÑаÑÑÑ ÑабоÑÑ, пÑÑÑ)
Get-TrueNasPool ÑпиÑок pool (Id, Path, Status, Healthy)
Get-TrueNasVolume -Type FILESYSTEM ÑпиÑок pool ÑайловÑÑ
ÑиÑÑем
Get-TrueNasVolume -Type VOLUME ÑпиÑок Ñазделов в pool и иÑ
ÑазмеÑ
Get-TrueNasService | ft ÑпиÑок ÑлÑжб и иÑ
ÑÑаÑÑÑ
Start-TrueNasService ssh запÑÑÑиÑÑ ÑлÑжбÑ
Stop-TrueNasService ssh оÑÑановиÑÑ ÑлÑжбÑ
Veeam
Set-ExecutionPolicy AllSigned or Set-ExecutionPolicy Bypass -Scope Process
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
choco install veeam-backup-and-replication-console
Get-Module Veeam.Backup.PowerShell
Get-Command -Module Veeam.Backup.PowerShell or Get-VBRCommand
Connect-VBRServer -Server $srv -Credential $cred or -User and -Password - Port 9392 default
Get-VBRJob
Get-VBRCommand *get*backup*
Get-VBRComputerBackupJob
Get-VBRBackup
Get-VBRBackupRepository
Get-VBRBackupSession
Get-VBRBackupServerCertificate
Get-VBRRestorePoint
Get-VBRViProxy
REST API
$url = "https://habr.com/ru/rss/users/Lifailon/publications/articles/?fl=ru" RSS ленÑа пÑбликаÑий на Habr
Invoke-RestMethod $url
$iwr = Invoke-WebRequest -Uri $url
$iwr | Get-Member
$iwr.Content
$iwr.StatusCode -eq 200
$iwr.Headers
$iwr.ParsedHtml | Select lastModified
$iwr.Links | fl title,innerText,href
$iwr.Images.src
Methods
GET - Read
POST - Create
PATCH - Partial update/modify
PUT - Update/replace
DELETE - Remove
Download Image
function Download-Image {
param (
[Parameter(Mandatory = $True)]$url
)
$folder = $url -replace "http.+://" -replace "/","-" -replace "-$"
$path = "$home\Pictures\$folder"
if (Test-Path $path) {
Remove-Item $path -Recurse -Force
New-Item -ItemType Directory $path > $null
} else {
New-Item -ItemType Directory $path > $null
}
$irm = Invoke-WebRequest -Uri $url
foreach ($img in $irm.Images.src) {
$name = $img -replace ".+/"
Start-Job {
Invoke-WebRequest $using:img -OutFile "$using:path\$using:name"
} > $null
}
while ($True){
$status_job = (Get-Job).State[-1]
if ($status_job -like "Completed"){
Get-Job | Remove-Job -Force
break
}}
$count_all = $irm.Images.src.Count
$count_down = (Get-Item $path\*).count
"Downloaded $count_down of $count_all files to $path"
}
Download-Image -url https://losst.pro/
Token
https://veeam-11:9419/swagger/ui/index.html
$Header = @{
"x-api-version" = "1.0-rev2"
}
$Body = @{
"grant_type" = "password"
"username" = "$login"
"password" = "$password"
}
$vpost = iwr "https://veeam-11:9419/api/oauth2/token" -Method POST -Headers $Header -Body $Body -SkipCertificateCheck
$vtoken = (($vpost.Content) -split '"')[3]
GET
$token = $vtoken | ConvertTo-SecureString -AsPlainText âForce
$vjob = iwr "https://veeam-11:9419/api/v1/jobs" -Method GET -Headers $Header -Authentication Bearer -Token $token -SkipCertificateCheck
$Header = @{
"x-api-version" = "1.0-rev1"
"Authorization" = "Bearer $vtoken"
}
$vjob = iwr "https://veeam-11:9419/api/v1/jobs" -Method GET -Headers $Header -SkipCertificateCheck
$vjob = $vjob.Content | ConvertFrom-Json
$vjob = Invoke-RestMethod "https://veeam-11:9419/api/v1/jobs" -Method GET -Headers $Header -SkipCertificateCheck
$vjob.data.virtualMachines.includes.inventoryObject
Pode
Start-PodeServer {
Add-PodeEndpoint -Address localhost -Port "8080" -Protocol "HTTP"
### Get info endpoints
Add-PodeRoute -Path "/" -Method "GET" -ScriptBlock {
Write-PodeJsonResponse -Value @{
"service"="/api/service";
"process"="/api/process"
}
}
### GET
Add-PodeRoute -Path "/api/service" -Method "GET" -ScriptBlock {
Write-PodeJsonResponse -Value $(
Get-Service | Select-Object Name,@{
Name="Status"; Expression={[string]$_.Status}
},@{
Name="StartType"; Expression={[string]$_.StartType}
} | ConvertTo-Json
)
}
Add-PodeRoute -Path "/api/process" -Method "GET" -ScriptBlock {
Write-PodeJsonResponse -Value $(
Get-Process | Sort-Object -Descending CPU | Select-Object -First 15 ProcessName,
@{Name="ProcessorTime"; Expression={$_.TotalProcessorTime -replace "\.\d+$"}},
@{Name="Memory"; Expression={[string]([int]($_.WS / 1024kb))+"MB"}},
@{Label="RunTime"; Expression={((Get-Date) - $_.StartTime) -replace "\.\d+$"}}
)
}
Add-PodeRoute -Path "/api/process-html" -Method "GET" -ScriptBlock {
Write-PodeHtmlResponse -Value (
Get-Process | Sort-Object -Descending CPU | Select-Object -First 15 ProcessName,
@{Name="ProcessorTime"; Expression={$_.TotalProcessorTime -replace "\.\d+$"}},
@{Name="Memory"; Expression={[string]([int]($_.WS / 1024kb))+"MB"}},
@{Label="RunTime"; Expression={((Get-Date) - $_.StartTime) -replace "\.\d+$"}} # Auto ConvertTo-Html
)
}
### POST
Add-PodeRoute -Path "/api/service" -Method "POST" -ScriptBlock {
# https://pode.readthedocs.io/en/latest/Tutorials/WebEvent/
# $WebEvent | Out-Default
$Value = $WebEvent.Data["ServiceName"]
$Status = (Get-Service -Name $Value).Status
Write-PodeJsonResponse -Value @{
"Name"="$Value";
"Status"="$Status";
}
}
}
irm http://localhost:8080/api/service -Method Get
irm http://localhost:8080/api/process -Method Get
http://localhost:8080/api/process-html иÑполÑзоваÑÑ Ð±ÑаÑзеÑ
irm http://localhost:8080/api/service -Method Post -Body @{"ServiceName" = "AnyDesk"}
Selenium
Invoke-Expression(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/Lifailon/Deploy-Selenium/rsa/Deploy-Selenium-Drivers.ps1") ÑÑÑановка вÑеÑ
дÑайвеÑов и Chromium ÑооÑвеÑÑÑвÑÑÑий веÑÑии Ð´Ð»Ñ Ð´ÑайвеÑа
$path = "$home\Documents\Selenium\"
$log = "$path\ChromeDriver.log"
$ChromeDriver = "$path\ChromeDriver.exe"
$WebDriver = "$path\WebDriver.dll"
$SupportDriver = "$path\WebDriver.Support.dll"
$Chromium = (Get-ChildItem $path -Recurse | Where-Object Name -like chrome.exe).FullName
Add-Type -Path $WebDriver
Add-Type -Path $SupportDriver
try {
$ChromeOptions = New-Object OpenQA.Selenium.Chrome.ChromeOptions # Ñоздаем обÑÐµÐºÑ Ñ Ð½Ð°ÑÑÑойками запÑÑка бÑаÑзеÑа
$ChromeOptions.BinaryLocation = $Chromium # пеÑедаем пÑÑÑ Ð´Ð¾ иÑполнÑемого Ñайла, коÑоÑÑй оÑвеÑÐ°ÐµÑ Ð·Ð° запÑÑк бÑаÑзеÑа
$ChromeOptions.AddArgument("start-maximized") # добавлÑем аÑгÑменÑ, коÑоÑÑй позволÑÐµÑ Ð·Ð°Ð¿ÑÑÑиÑÑ Ð±ÑаÑÐ·ÐµÑ Ð½Ð° веÑÑ ÑкÑан
#$ChromeOptions.AddArgument("start-minimized") # запÑÑкаем бÑаÑÐ·ÐµÑ Ð² окне
#$ChromeOptions.AddArgument("window-size=400,800") # запÑÑкаем бÑаÑÐ·ÐµÑ Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñми ÑазмеÑам окна в пикÑелÑÑ
$ChromeOptions.AcceptInsecureCertificates = $True # игноÑиÑоваÑÑ Ð¿ÑедÑпÑеждение на ÑайÑаÑ
Ñ Ð½Ðµ валиднÑм ÑеÑÑиÑикаÑом
#$ChromeOptions.AddArgument("headless") # ÑкÑÑваÑÑ Ð¾ÐºÐ½Ð¾ бÑаÑзеÑа пÑи запÑÑке
$ChromeDriverService = [OpenQA.Selenium.Chrome.ChromeDriverService]::CreateDefaultService($ChromeDriver) # Ñоздаем обÑÐµÐºÑ Ð½Ð°ÑÑÑоек ÑлÑÐ¶Ð±Ñ Ð´ÑайвеÑа
$ChromeDriverService.HideCommandPromptWindow = $True # оÑклÑÑаем веÑÑ Ð²Ñвод логиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´ÑайвеÑа в конÑÐ¾Ð»Ñ (ÑÑÐ¾Ñ Ð²Ñвод нелÑÐ·Ñ Ð¿ÐµÑенапÑавиÑÑ)
$ChromeDriverService.LogPath = $log # ÑказаÑÑ Ð¿ÑÑÑ Ð´Ð¾ Ñайла Ñ Ð¶ÑÑналом
$ChromeDriverService.EnableAppendLog = $True # не пеÑезапиÑÑваÑÑ Ð¶ÑÑнал пÑи каждом новом запÑÑке
#$ChromeDriverService.EnableVerboseLogging = $True # кÑоме INFO и оÑибок, запиÑÑваÑÑ DEBUG ÑообÑениÑ
$Selenium = New-Object OpenQA.Selenium.Chrome.ChromeDriver($ChromeDriverService, $ChromeOptions) # иниÑиализиÑÑем запÑÑк Ñ ÑказаннÑми наÑÑÑойками
$Selenium.Navigate().GoToUrl("https://google.com") # пеÑеÑ
одим по Ñказанной ÑÑÑлке в бÑаÑзеÑе
#$Selenium.Manage().Window.Minimize() # ÑвеÑнÑÑÑ Ð¾ÐºÐ½Ð¾ бÑаÑзеÑа поÑле запÑÑка и пеÑеÑ
ода по нÑÐ¶Ð½Ð¾Ð¼Ñ url (ÑÑо Ð±Ñ ÑÑиÑаÑÑ ÑÑÑаниÑÑ ÐºÐ¾ÑÑекÑно)
# ÐÑем поле Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° ÑекÑÑа:
$Search = $Selenium.FindElements([OpenQA.Selenium.By]::Id('APjFqb'))
$Search = $Selenium.FindElements([OpenQA.Selenium.By]::XPath('//*[@id="APjFqb"]'))
$Search = $Selenium.FindElements([OpenQA.Selenium.By]::Name('q'))
$Search = $Selenium.FindElements([OpenQA.Selenium.By]::XPath('//*[@name="q"]'))
$Search = $Selenium.FindElements([OpenQA.Selenium.By]::ClassName('gLFyf'))
$Search = $Selenium.FindElements([OpenQA.Selenium.By]::CssSelector('[jsname="yZiJbe"]'))
$Search = $Selenium.FindElements([OpenQA.Selenium.By]::TagName('textarea')) | Where-Object ComputedAccessibleRole -eq combobox
$Search.SendKeys("calculator online") # пеÑедаем ÑекÑÑ Ð²ÑбÑÐ°Ð½Ð½Ð¾Ð¼Ñ ÑлеменÑÑ
$Search.SendKeys([OpenQA.Selenium.Keys]::Enter) # нажимаем Enter Ð´Ð»Ñ Ð²Ñзова ÑÑнкÑии поиÑка
Start-Sleep 1
$div = $Selenium.FindElements([OpenQA.Selenium.By]::TagName("div"))
$2 = $div | Where-Object {($_.ComputedAccessibleRole -eq "button") -and ($_.ComputedAccessibleLabel -eq "2")}
$2.Click()
$2.Click()
$plus = $div | Where-Object {($_.ComputedAccessibleRole -eq "button") -and ($_.Text -eq "+")}
$plus.Click()
$3 = $Selenium.FindElement([OpenQA.Selenium.By]::CssSelector('[jsname="KN1kY"]'))
$3.Click()
$3.Click()
$sum = $Selenium.FindElement([OpenQA.Selenium.By]::CssSelector('[jsname="Pt8tGc"]'))
$sum.Click()
$result = $Selenium.FindElement([OpenQA.Selenium.By]::CssSelector('[jsname="VssY5c"]')).Text
Write-Host "Result: $result" -ForegroundColor Green
}
finally {
$Selenium.Close()
$Selenium.Quit()
}
Selenium modules
Invoke-RestMethod https://raw.githubusercontent.com/Lifailon/Selenium-Modules/rsa/Modules/Get-GPT/Get-GPT.psm1 | Out-File -FilePath "$(New-Item -Path "$($($Env:PSModulePath -split ";")[0])\Get-GPT" -ItemType Directory -Force)\Get-GPT.psm1" -Force
Get-GPT "ÐÑполнÑй ÑÐ¾Ð»Ñ ÐºÐ°Ð»ÑкÑлÑÑоÑа. ÐоÑÑиÑай ÑÑÐ¼Ð¼Ñ ÑиÑел: 22+33"
Invoke-RestMethod https://raw.githubusercontent.com/Lifailon/Selenium-Modules/rsa/Modules/Get-Translation/Get-Translation.psm1 | Out-File -FilePath "$(New-Item -Path "$($($Env:PSModulePath -split ";")[0])\Get-Translation" -ItemType Directory -Force)\Get-Translation.psm1" -Force
Get-Translation -Provider DeepL -Text "I translating the text"
Get-Translation -Provider DeepL -Text "Я пеÑÐµÐ²Ð¾Ð¶Ñ ÑекÑÑ"
Get-Translation -Provider Google -Text "I translating the text"
Get-Translation -Provider Google -Text "Я пеÑÐµÐ²Ð¾Ð¶Ñ ÑекÑÑ" -Language en
Invoke-RestMethod https://raw.githubusercontent.com/Lifailon/Selenium-Modules/rsa/Modules/Get-SpeedTest/Get-SpeedTest.psm1 | Out-File -FilePath "$(New-Item -Path "$($($Env:PSModulePath -split ";")[0])\Get-SpeedTest" -ItemType Directory -Force)\Get-SpeedTest.psm1" -Force
Get-SpeedTest -Provider Libre
Get-SpeedTest -Provider Open
Get-SpeedTest -Provider Ookla
IE
$ie.document.IHTMLDocument3_getElementsByTagName("input") | select name полÑÑиÑÑ Ð¸Ð¼ÐµÐ½Ð° вÑеÑ
Input Box
$ie.document.IHTMLDocument3_getElementsByTagName("button") | select innerText полÑÑиÑÑ Ð¸Ð¼ÐµÐ½Ð° вÑеÑ
Button
$ie.Document.documentElement.innerHTML пÑоÑиÑаÑÑ ÑÑÑой Web Content (<input name="login" tabindex="100" class="input__control input__input" id="uniq32005644019429136" spellcheck="false" placeholder="Ðогин")
$All_Elements = $ie.document.IHTMLDocument3_getElementsByTagName("*") забÑаÑÑ Ð²Ñе ÑлеменÑÑ
$Go_Button = $All_Elements | ? innerText -like "go" поиÑк ÑлеменÑа по имени
$Go_Button | select ie9_tagName полÑÑиÑÑ TagName (SPAN) Ð´Ð»Ñ Ð±ÑÑÑÑого далÑнейÑего поиÑка
$SPAN_Elements = $ie.document.IHTMLDocument3_getElementsByTagName("SPAN")
$ie = New-Object -ComObject InternetExplorer.Application
$ie.navigate("https://yandex.ru")
$ie.visible = $true
$ie.document.IHTMLDocument3_getElementByID("login").value = "Login"
$ie.document.IHTMLDocument3_getElementByID("passwd").value = "Password"
$Button_Auth = ($ie.document.IHTMLDocument3_getElementsByTagName("button")) | ? innerText -match "ÐойÑи"
$Button_Auth.Click()
$Result = $ie.Document.documentElement.innerHTML
$ie.Quit()
COM
$wshell = New-Object -ComObject Wscript.Shell
$wshell | Get-Member
$link = $wshell.CreateShortcut("$Home\Desktop\Yandex.lnk") ÑоздаÑÑ ÑÑлÑк
$link | Get-Member
$link.TargetPath = "https://yandex.ru" кÑда ÑÑÑлаеÑÑÑ (меÑод TargetPath обÑекÑа $link где Ñ
ÑаниÑÑÑ Ð¾Ð±ÑÐµÐºÑ CreateShortcut)
$link.Save() ÑоÑ
ÑаниÑÑ
Set-WinUserLanguageList -LanguageList en-us,ru -Force измениÑÑ ÑзÑковÑÑ ÑаÑÐºÐ»Ð°Ð´ÐºÑ ÐºÐ»Ð°Ð²Ð¸Ð°ÑÑÑÑ
Wscript.Shell.SendKeys
(New-Object -ComObject Wscript.shell).SendKeys([char]173) вклÑÑиÑÑ/вÑклÑÑиÑÑ Ð·Ð²Ñк
$wshell.Exec("notepad.exe") запÑÑÑиÑÑ Ð¿Ñиложение
$wshell.AppActivate("ÐлокноÑ") ÑазвеÑнÑÑÑ Ð·Ð°Ð¿ÑÑенное пÑиложение
$wshell.SendKeys("Login") ÑекÑÑ
$wshell.SendKeys("{A 5}") напеÑаÑаÑÑ Ð±ÑÐºÐ²Ñ 5 Ñаз подÑÑд
$wshell.SendKeys("%{TAB}") ALT+TAB
$wshell.SendKeys("^") CTRL
$wshell.SendKeys("%") ALT
$wshell.SendKeys("+") SHIFT
$wshell.SendKeys("{DOWN}") вниз
$wshell.SendKeys("{UP}") ввеÑÑ
$wshell.SendKeys("{LEFT}") влево
$wshell.SendKeys("{RIGHT}") впÑаво
$wshell.SendKeys("{PGUP}") PAGE UP
$wshell.SendKeys("{PGDN}") PAGE DOWN
$wshell.SendKeys("{BACKSPACE}") BACKSPACE/BKSP/BS
$wshell.SendKeys("{DEL}") DEL/DELETE
$wshell.SendKeys("{INS}") INS/INSERT
$wshell.SendKeys("{PRTSC}") PRINT SCREEN
$wshell.SendKeys("{ENTER}")
$wshell.SendKeys("{ESC}")
$wshell.SendKeys("{TAB}")
$wshell.SendKeys("{END}")
$wshell.SendKeys("{HOME}")
$wshell.SendKeys("{BREAK}")
$wshell.SendKeys("{SCROLLLOCK}")
$wshell.SendKeys("{CAPSLOCK}")
$wshell.SendKeys("{NUMLOCK}")
$wshell.SendKeys("{F1}")
$wshell.SendKeys("{F12}")
$wshell.SendKeys("{+}{^}{%}{~}{(}{)}{[}{]}{{}{}}")
function Get-AltTab {
(New-Object -ComObject wscript.shell).SendKeys("%{Tab}")
Start-Sleep $(Get-Random -Minimum 30 -Maximum 180)
Get-AltTab
}
Get-AltTab
Wscript.Shell.Popup
$wshell = New-Object -ComObject Wscript.Shell
$output = $wshell.Popup("ÐÑбеÑиÑе дейÑÑвие?",0,"Ðаголовок",4)
if ($output -eq 6) {"yes"} elseif ($output -eq 7) {"no"} else {"no good"}
Type:
0 ÐÐ
1 ÐРи ÐÑмена
2 СÑоп, ÐовÑоÑ, ÐÑопÑÑÑиÑÑ
3 Ðа, ÐеÑ, ÐÑмена
4 Ðа и ÐеÑ
5 ÐовÑÐ¾Ñ Ð¸ ÐÑмена
16 Stop
32 Question
48 Exclamation
64 Information
Output:
-1 Timeout
1 ÐÐ
2 ÐÑмена
3 СÑоп
4 ÐовÑоÑ
5 ÐÑопÑÑÑиÑÑ
6 Ðа
7 ÐеÑ
WScript.Network
$wshell = New-Object -ComObject WScript.Network
$wshell | Get-Member
$wshell.UserName
$wshell.ComputerName
$wshell.UserDomain
Shell.Application
$wshell = New-Object -ComObject Shell.Application
$wshell | Get-Member
$wshell.Explore("C:\")
$wshell.Windows() | Get-Member полÑÑиÑÑ Ð´Ð¾ÑÑÑп к оÑкÑÑÑÑм в пÑоводнике или бÑаÑзеÑе Internet Explorer окон
$shell = New-Object -Com Shell.Application
$RecycleBin = $shell.Namespace(10)
$RecycleBin.Items()
Outlook
$Outlook = New-Object -ComObject Outlook.Application
$Outlook | Get-Member
$Outlook.Version
$Outlook = New-Object -ComObject Outlook.Application
$Namespace = $Outlook.GetNamespace("MAPI")
$Folder = $namespace.GetDefaultFolder(4)` иÑÑ
одÑÑие
$Folder = $namespace.GetDefaultFolder(6)` вÑ
одÑÑие
$Explorer = $Folder.GetExplorer()
$Explorer.Display()
$Outlook.Quit()
Microsoft.Update
(New-Object -com 'Microsoft.Update.AutoUpdate').Settings
(New-Object -com 'Microsoft.Update.AutoUpdate').Results
(New-Timespan -Start ((New-Object -com 'Microsoft.Update.AutoUpdate').Results|Select -ExpandProperty LastInstallationSuccessDate) -End (Get-Date)).hours кол-во ÑаÑов, пÑоÑедÑиÑ
Ñ Ð¿Ð¾Ñледней даÑÑ ÑÑÑановки Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи в Windows.
dotNET
[System.Diagnostics.EventLog] | select Assembly,Module
$EventLog = [System.Diagnostics.EventLog]::new("Application")
$EventLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application,192.168.3.100
$EventLog | Get-Member -MemberType Method
$EventLog.MaximumKilobytes макÑималÑнÑй ÑÐ°Ð·Ð¼ÐµÑ Ð¶ÑÑнала
$EventLog.Entries пÑоÑмоÑÑеÑÑ Ð¶ÑÑнал
$EventLog.Clear() оÑиÑÑиÑÑ Ð¶ÑÑнал
Join-Path C: Install Test
[System.IO.Path]::Combine("C:", "Install", "Test")
Match
[System.Math] | Get-Member -Static -MemberType Methods
[System.Math]::Max(2,7)
[System.Math]::Min(2,7)
[System.Math]::Floor(3.9)
[System.Math]::Truncate(3.9)
GeneratePassword
Add-Type -AssemblyName System.Web
[System.Web.Security.Membership]::GeneratePassword(10,2)
SoundPlayer
$CriticalSound = New-Object System.Media.SoundPlayer
$CriticalSound.SoundLocation = "C:\WINDOWS\Media\Windows Critical Stop.wav"
$CriticalSound.Play()
$GoodSound = New-Object System.Media.SoundPlayer
$GoodSound.SoundLocation = "C:\WINDOWS\Media\tada.wav"
$GoodSound.Play()
Static Class
[System.Environment] | Get-Member -Static
[System.Environment]::OSVersion
[System.Environment]::Version
[System.Environment]::MachineName
[System.Environment]::UserName
[System.Diagnostics.Process] | Get-Member -Static
[System.Diagnostics.Process]::Start('notepad.exe')
[Clicker]
$cSource = @'
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class Clicker
{
//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx
[StructLayout(LayoutKind.Sequential)]
struct INPUT
{
public int type; // 0 = INPUT_MOUSE,
// 1 = INPUT_KEYBOARD
// 2 = INPUT_HARDWARE
public MOUSEINPUT mi;
}
//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646273(v=vs.85).aspx
[StructLayout(LayoutKind.Sequential)]
struct MOUSEINPUT
{
public int dx ;
public int dy ;
public int mouseData ;
public int dwFlags;
public int time;
public IntPtr dwExtraInfo;
}
//This covers most use cases although complex mice may have additional buttons
//There are additional constants you can use for those cases, see the msdn page
const int MOUSEEVENTF_MOVED = 0x0001 ;
const int MOUSEEVENTF_LEFTDOWN = 0x0002 ;
const int MOUSEEVENTF_LEFTUP = 0x0004 ;
const int MOUSEEVENTF_RIGHTDOWN = 0x0008 ;
const int MOUSEEVENTF_RIGHTUP = 0x0010 ;
const int MOUSEEVENTF_MIDDLEDOWN = 0x0020 ;
const int MOUSEEVENTF_MIDDLEUP = 0x0040 ;
const int MOUSEEVENTF_WHEEL = 0x0080 ;
const int MOUSEEVENTF_XDOWN = 0x0100 ;
const int MOUSEEVENTF_XUP = 0x0200 ;
const int MOUSEEVENTF_ABSOLUTE = 0x8000 ;
const int screen_length = 0x10000 ;
//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
public static void LeftClickAtPoint(int x, int y)
{
//Move the mouse
INPUT[] input = new INPUT[3];
input[0].mi.dx = x*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width);
input[0].mi.dy = y*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height);
input[0].mi.dwFlags = MOUSEEVENTF_MOVED | MOUSEEVENTF_ABSOLUTE;
//Left mouse button down
input[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
//Left mouse button up
input[2].mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput(3, input, Marshal.SizeOf(input[0]));
}
}
'@
Add-Type -TypeDefinition $cSource -ReferencedAssemblies System.Windows.Forms,System.Drawing
[Clicker]::LeftClickAtPoint(1900,1070)
[Audio]
Add-Type -Language CsharpVersion3 -TypeDefinition @"
using System.Runtime.InteropServices;
[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IAudioEndpointVolume {
// f(), g(), ... are unused COM method slots. Define these if you care
int f(); int g(); int h(); int i();
int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext);
int j();
int GetMasterVolumeLevelScalar(out float pfLevel);
int k(); int l(); int m(); int n();
int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext);
int GetMute(out bool pbMute);
}
[Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDevice {
int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev);
}
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDeviceEnumerator {
int f(); // Unused
int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint);
}
[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { }
public class Audio {
static IAudioEndpointVolume Vol() {
var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;
IMMDevice dev = null;
Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev));
IAudioEndpointVolume epv = null;
var epvid = typeof(IAudioEndpointVolume).GUID;
Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv));
return epv;
}
public static float Volume {
get {float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v;}
set {Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty));}
}
public static bool Mute {
get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; }
set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); }
}
}
"@
[Audio]::Volume = 0.50
[Audio]::Mute = $true
NetSessionEnum
function Invoke-NetSessionEnum {
param (
[Parameter(Mandatory = $True)][string]$HostName
)
Add-Type -TypeDefinition @"
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct SESSION_INFO_10
{
[MarshalAs(UnmanagedType.LPWStr)]public string OriginatingHost;
[MarshalAs(UnmanagedType.LPWStr)]public string DomainUser;
public uint SessionTime;
public uint IdleTime;
}
public static class Netapi32
{
[DllImport("Netapi32.dll", SetLastError=true)]
public static extern int NetSessionEnum(
[In,MarshalAs(UnmanagedType.LPWStr)] string ServerName,
[In,MarshalAs(UnmanagedType.LPWStr)] string UncClientName,
[In,MarshalAs(UnmanagedType.LPWStr)] string UserName,
Int32 Level,
out IntPtr bufptr,
int prefmaxlen,
ref Int32 entriesread,
ref Int32 totalentries,
ref Int32 resume_handle);
[DllImport("Netapi32.dll", SetLastError=true)]
public static extern int NetApiBufferFree(
IntPtr Buffer);
}
"@
# Create SessionInfo10 Struct
$SessionInfo10 = New-Object SESSION_INFO_10
$SessionInfo10StructSize = [System.Runtime.InteropServices.Marshal]::SizeOf($SessionInfo10)` Grab size to loop bufptr
$SessionInfo10 = $SessionInfo10.GetType()` Hacky, but we need this ;))
# NetSessionEnum params
$OutBuffPtr = [IntPtr]::Zero` Struct output buffer
$EntriesRead = $TotalEntries = $ResumeHandle = 0` Counters & ResumeHandle
$CallResult = [Netapi32]::NetSessionEnum($HostName, "", "", 10, [ref]$OutBuffPtr, -1, [ref]$EntriesRead, [ref]$TotalEntries, [ref]$ResumeHandle)
if ($CallResult -ne 0){
echo "Mmm something went wrong!`nError Code: $CallResult"
}
else {
if ([System.IntPtr]::Size -eq 4) {
echo "`nNetapi32::NetSessionEnum Buffer Offset --> 0x$("{0:X8}" -f $OutBuffPtr.ToInt32())"
}
else {
echo "`nNetapi32::NetSessionEnum Buffer Offset --> 0x$("{0:X16}" -f $OutBuffPtr.ToInt64())"
}
echo "Result-set contains $EntriesRead session(s)!"
# Change buffer offset to int
$BufferOffset = $OutBuffPtr.ToInt64()
# Loop buffer entries and cast pointers as SessionInfo10
for ($Count = 0; ($Count -lt $EntriesRead); $Count++){
$NewIntPtr = New-Object System.Intptr -ArgumentList $BufferOffset
$Info = [system.runtime.interopservices.marshal]::PtrToStructure($NewIntPtr,[type]$SessionInfo10)
$Info
$BufferOffset = $BufferOffset + $SessionInfo10StructSize
}
echo "`nCalling NetApiBufferFree, no memleaks here!"
[Netapi32]::NetApiBufferFree($OutBuffPtr) |Out-Null
}
}
Invoke-NetSessionEnum localhost
CopyFile
$MethodDefinition = @"
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
public static extern bool CopyFile(string lpExistingFileName, string lpNewFileName, bool bFailIfExists);
"@
$Kernel32 = Add-Type -MemberDefinition $MethodDefinition -Name "Kernel32" -Namespace "Win32" -PassThru
$Kernel32::CopyFile("$($Env:SystemRoot)\System32\calc.exe", "$($Env:USERPROFILE)\Desktop\calc.exe", $False)
ShowWindowAsync
$Signature = @"
[DllImport("user32.dll")]public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
"@
$ShowWindowAsync = Add-Type -MemberDefinition $Signature -Name "Win32ShowWindowAsync" -Namespace Win32Functions -PassThru
$ShowWindowAsync | Get-Member -Static
$ShowWindowAsync::ShowWindowAsync((Get-Process -Id $pid).MainWindowHandle, 2)
$ShowWindowAsync::ShowWindowAsync((Get-Process -Id $Pid).MainWindowHandle, 3)
$ShowWindowAsync::ShowWindowAsync((Get-Process -Id $Pid).MainWindowHandle, 4)
GetAsyncKeyState
Add-Type -AssemblyName System.Windows.Forms
[int][System.Windows.Forms.Keys]::F1 опÑеделиÑÑ Ð½Ð¾Ð¼ÐµÑ [Int] клавиÑи по ее названиÑ
65..90 | % {"{0} = {1}" -f $_, [System.Windows.Forms.Keys]$_} поÑÑдковÑй Ð½Ð¾Ð¼ÐµÑ Ð±Ñкв (A..Z)
function Get-ControlKey {
$key = 112
$Signature = @'
[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
public static extern short GetAsyncKeyState(int virtualKeyCode);
'@
Add-Type -MemberDefinition $Signature -Name Keyboard -Namespace PsOneApi
[bool]([PsOneApi.Keyboard]::GetAsyncKeyState($key) -eq -32767)
}
Write-Warning 'Press F1 to exit'
while ($true) {
Write-Host '.' -NoNewline
if (Get-ControlKey) {
break
}
Start-Sleep -Seconds 0.5
}
Console API
[Console] | Get-Member -Static
[Console]::BackgroundColor = "Blue"
[Console]::OutputEncoding иÑполÑзÑÐµÐ¼Ð°Ñ ÐºÐ¾Ð´Ð¸Ñовка в ÑекÑÑей ÑеÑÑии
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("utf-8") измениÑÑ ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²ÐºÑ Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÐºÐ¸ÑиллиÑÑ
[Console]::outputEncoding = [System.Text.Encoding]::GetEncoding("cp866") Ð´Ð»Ñ ISE
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("windows-1251") Ð´Ð»Ñ ps2exe
Get-Service | Out-File $home\Desktop\Service.txt -Encoding oem >
Get-Service | Out-File $home\Desktop\Service.txt -Append >>
do {
if ([Console]::KeyAvailable) {
$keyInfo = [Console]::ReadKey($true)
break
}
Write-Host "." -NoNewline
sleep 1
} while ($true)
Write-Host
$keyInfo
function Get-KeyPress {
param (
[Parameter(Mandatory)][ConsoleKey]$Key,
[System.ConsoleModifiers]$ModifierKey = 0
)
if ([Console]::KeyAvailable) {
$pressedKey = [Console]::ReadKey($true)
$isPressedKey = $key -eq $pressedKey.Key
if ($isPressedKey) {
$pressedKey.Modifiers -eq $ModifierKey
} else {
[Console]::Beep(1800, 200)
$false
}}}
Write-Warning 'Press Ctrl+Shift+Q to exit'
do {
Write-Host "." -NoNewline
$pressed = Get-KeyPress -Key Q -ModifierKey 'Control,Shift'
if ($pressed) {break}
sleep 1
} while ($true)
Drawing
Add-Type -AssemblyName System.Drawing
$Width = 800
$Height = 400
$image = New-Object System.Drawing.Bitmap($Width,$Height)
$graphic = [System.Drawing.Graphics]::FromImage($image)
$background_color = [System.Drawing.Brushes]::Blue # задаÑÑ ÑÐ²ÐµÑ Ñона (Ñиний)
$graphic.FillRectangle($background_color, 0, 0, $image.Width, $image.Height)
$text_color = [System.Drawing.Brushes]::White # задаÑÑ ÑÐ²ÐµÑ ÑекÑÑа (белÑй)
$font = New-Object System.Drawing.Font("Arial", 20, [System.Drawing.FontStyle]::Bold) # задаÑÑ ÑÑиÑÑ
$text = "PowerShell" # ÑказаÑÑ ÑекÑÑ
$text_position = New-Object System.Drawing.RectangleF(320, 180, 300, 100) # задаÑÑ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ ÑекÑÑа (x, y, width, height)
$graphic.DrawString($text, $font, $text_color, $text_position) # нанеÑÑи ÑекÑÑ Ð½Ð° изобÑажение
$image.Save("$home\desktop\powershell_image.bmp", [System.Drawing.Imaging.ImageFormat]::Bmp) # ÑоÑ
ÑаниÑÑ Ð¸Ð·Ð¾Ð±Ñажение
$image.Dispose() # оÑвобождение ÑеÑÑÑÑов
$path = "$home\desktop\powershell_image.bmp"
Invoke-Item $path
$src_image = [System.Drawing.Image]::FromFile($path)
$Width = 400
$Height = 200
$dst_image = New-Object System.Drawing.Bitmap -ArgumentList $src_image, $Width, $Height # измениÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð¸Ð·Ð¾Ð±ÑажениÑ
$dst_image.Save("$home\desktop\powershell_image_resize.bmp", [System.Drawing.Imaging.ImageFormat]::Bmp)
$rotated_image = $src_image.Clone() # ÑоздаÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð¸ÑÑ
одного изобÑажениÑ
$rotated_image.RotateFlip([System.Drawing.RotateFlipType]::Rotate180FlipNone) # пеÑевеÑнÑÑÑ Ð¸Ð·Ð¾Ð±Ñажение на 180 гÑадÑÑов
$rotated_image.Save("$home\desktop\powershell_image_rotated.bmp", [System.Drawing.Imaging.ImageFormat]::Bmp)
$src_image.Dispose() # закÑÑÑÑ (оÑпÑÑÑиÑÑ) иÑÑ
однÑй Ñайл
ObjectEvent
$Timer = New-Object System.Timers.Timer
$Timer.Interval = 1000
Register-ObjectEvent -InputObject $Timer -EventName Elapsed -SourceIdentifier Timer.Output -Action {
$Random = Get-Random -Min 0 -Max 100
Write-Host $Random
}
$Timer.Enabled = $True
$Timer.Enabled = $False оÑÑановиÑÑ
$Timer | Get-Member -MemberType Event оÑобÑазиÑÑ ÑпиÑок вÑеÑ
ÑобÑÑий обÑекÑа
Get-EventSubscriber ÑпиÑок заÑегиÑÑÑиÑованнÑÑ
подпиÑок на ÑобÑÑÐ¸Ñ Ð² ÑекÑÑей ÑеÑÑии
Unregister-Event -SourceIdentifier Timer.Output ÑдалÑÐµÑ ÑегиÑÑÑаÑÐ¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки на ÑобÑÑие по имени ÑобÑÑÐ¸Ñ (EventName) или вÑе *
-Forward пеÑенапÑавлÑÐµÑ ÑобÑÑÐ¸Ñ Ð¸Ð· Ñдаленного ÑеанÑа (New-PSSession) в локалÑнÑй ÑеанÑ
-SupportEvent не вÑÐ²Ð¾Ð´Ð¸Ñ ÑезÑлÑÑÐ°Ñ ÑегиÑÑÑаÑии ÑобÑÑÐ¸Ñ Ð½Ð° ÑкÑан (и Get-EventSubscriber и Get-Job)
Register-EngineEvent -SourceIdentifier PowerShell.Exiting -Action {
$date = Get-Date -f hh:mm:ss
(New-Object -ComObject Wscript.Shell).Popup("PowerShell Exit: $date",0,"Action",64)
}
Sockets
UDP Socket
function Start-UDPServer {
param(
$Port = 5201
)
$RemoteComputer = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Any, 0)
do {
$UdpObject = New-Object System.Net.Sockets.UdpClient($Port)
$ReceiveBytes = $UdpObject.Receive([ref]$RemoteComputer)
$UdpObject.Close()
$ASCIIEncoding = New-Object System.Text.ASCIIEncoding
[string]$ReturnString = $ASCIIEncoding.GetString($ReceiveBytes)
[PSCustomObject]@{
LocalDateTime = $(Get-Date -UFormat "%Y-%m-%d %T")
ClientIP = $RemoteComputer.address.ToString()
ClientPort = $RemoteComputer.Port.ToString()
Message = $ReturnString
}
} while (1)
}
Start-UDPServer -Port 5201
Test-NetUDPConnection
function Test-NetUDPConnection {
param(
[string]$ComputerName = "127.0.0.1",
[int32]$PortServer = 5201,
[int32]$PortClient = 5211,
$Message
)
begin {
$UdpObject = New-Object system.Net.Sockets.Udpclient($PortClient)
$UdpObject.Connect($ComputerName, $PortServer)
}
process {
$ASCIIEncoding = New-Object System.Text.ASCIIEncoding
if (!$Message) {$Message = Get-Date -UFormat "%Y-%m-%d %T"}
$Bytes = $ASCIIEncoding.GetBytes($Message)
[void]$UdpObject.Send($Bytes, $Bytes.length)
}
end {
$UdpObject.Close()
}
}
Test-NetUDPConnection -ComputerName 127.0.0.1 -PortServer 5201
Test-NetUDPConnection -ComputerName 127.0.0.1 -PortServer 514 -Message "<30>May 31 00:00:00 HostName multipathd[784]: Test message"
TCP Socket
function Start-TCPServer {
param(
$Port = 5201
)
do {
$TcpObject = New-Object System.Net.Sockets.TcpListener($port)
$ReceiveBytes = $TcpObject.Start()
$ReceiveBytes = $TcpObject.AcceptTcpClient()
$TcpObject.Stop()
$ReceiveBytes.Client.RemoteEndPoint | select Address,Port
} while (1)
}
Start-TCPServer -Port 5201
Test-NetConnection -ComputerName 127.0.0.1 -Port 5201
WakeOnLan
Broadcast package consisting of 6 byte filled "0xFF" and then 96 byte where the mac address is repeated 16 times
function Send-WOL {
param (
[Parameter(Mandatory = $True)]$Mac,
$IP,
[int]$Port = 9
)
$Mac = $Mac.replace(":", "-")
if (!$IP) {$IP = [System.Net.IPAddress]::Broadcast}
$SynchronizationChain = [byte[]](,0xFF * 6)
$ByteMac = $Mac.Split("-") | %{[byte]("0x" + $_)}
$Package = $SynchronizationChain + ($ByteMac * 16)
$UdpClient = New-Object System.Net.Sockets.UdpClient
$UdpClient.Connect($IP, $port)
$UdpClient.Send($Package, $Package.Length)
$UdpClient.Close()
}
Send-WOL -Mac "D8-BB-C1-70-A3-4E"
Send-WOL -Mac "D8-BB-C1-70-A3-4E" -IP 192.168.3.100
HTTP Listener
$httpListener = New-Object System.Net.HttpListener
$httpListener.Prefixes.Add("http://+:8888/")
$httpListener.Start()
while (!([console]::KeyAvailable)) {
$info = Get-Service | select name,status | ConvertTo-HTML
$context = $httpListener.GetContext()
$context.Response.StatusCode = 200
$context.Response.ContentType = 'text/HTML'
$WebContent = $info
$EncodingWebContent = [Text.Encoding]::UTF8.GetBytes($WebContent)
$context.Response.OutputStream.Write($EncodingWebContent , 0, $EncodingWebContent.Length)
$context.Response.Close()
Get-NetTcpConnection -LocalPort 8888
(Get-Date).datetime
}
$httpListener.Close()
WebClient
[System.Net.WebClient] | Get-Member
(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/Lifailon/PowerShell-Commands/rsa/README.md")
Certificate
function Get-WebCertificate ($srv) {
$iwr = iwr $srv
$status_code = $iwr.StatusCode
$status = $iwr.BaseResponse.StatusCode
$info = $iwr.BaseResponse.Server
$spm = [System.Net.ServicePointManager]::FindServicePoint($srv)
$date_end = $spm.Certificate.GetExpirationDateString()
$cert_name = ($spm.Certificate.Subject) -replace "CN="
$cert_owner = ((($spm.Certificate.Issuer) -split ", ") | where {$_ -match "O="}) -replace "O="
$Collections = New-Object System.Collections.Generic.List[System.Object]
$Collections.Add([PSCustomObject]@{
Host = $srv;
Server = $info;
Status = $status;
StatusCode = $status_code;
Certificate = $cert_name;
Issued = $cert_owner;
End = $date_end
})
$Collections
}
Get-WebCertificate https://google.com
Base64
UTF8
$loginPassword = "login:password"
$Base64 = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($loginPassword)) закодиÑоваÑÑ Ð»Ð¾Ð³Ð¸Ð½ и паÑÐ¾Ð»Ñ Ð² ÑÑÑÐ¾ÐºÑ Base64
[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($Base64)) пÑеобÑазоваÑÑ Ð² байÑÑ Ð¸ обÑаÑно декодиÑоваÑÑ Ð² иÑÑ
однÑÑ ÑÑÑÐ¾ÐºÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ UTF-8 кодиÑовки
Unicode
$text = "password"
$byte = [System.Text.Encoding]::Unicode.GetBytes($text) # пÑеобÑазÑÐµÑ ÑÑÑÐ¾ÐºÑ $text в поÑледоваÑелÑноÑÑÑ Ð±Ð°Ð¹Ñов, иÑполÑзÑÑ ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²ÐºÑ Unicode
$base64 = [System.Convert]::ToBase64String($byte) # байÑÑ ÐºÐ¾Ð½Ð²ÐµÑÑиÑÑÑÑÑÑ Ð² ÑÑÑÐ¾ÐºÑ Base64 Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÐµÑода ToBase64String
$decode_base64 = [System.Convert]::FromBase64String($base64) # декодиÑоваÑÑ ÑÑÑÐ¾ÐºÑ Base64 обÑаÑно в поÑледоваÑелÑноÑÑÑ Ð±Ð°Ð¹Ñов Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÐµÑода FromBase64String
$decode_string = [System.Text.Encoding]::Unicode.GetString($decode_base64) # закодиÑованнÑе байÑÑ Ð¿ÑеобÑазÑÑÑÑÑ Ð¾Ð±ÑаÑно в ÑÑÑÐ¾ÐºÑ Ñ Ð¸ÑполÑзованием кодиÑовки Unicode Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÐµÑода GetString
Image
$path_image = "$home\Documents\1200x800.jpg"
$BBase64 = [System.Convert]::ToBase64String((Get-Content $path_image -Encoding Byte))
Add-Type -assembly System.Drawing
$Image = [System.Drawing.Bitmap]::FromStream([IO.MemoryStream][Convert]::FromBase64String($BBase64))
$Image.Save("$home\Desktop\1200x800.jpg")
Excel
$path = "$home\Desktop\Services-to-Excel.xlsx"
$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $false` оÑклÑÑиÑÑ Ð¾ÑкÑÑÑие GUI
$ExcelWorkBook = $Excel.Workbooks.Add()` СоздаÑÑ ÐºÐ½Ð¸Ð³Ñ
$ExcelWorkSheet = $ExcelWorkBook.Worksheets.Item(1)` СоздаÑÑ Ð»Ð¸ÑÑ
$ExcelWorkSheet.Name = "Services"` задаÑÑ Ð¸Ð¼Ñ Ð»Ð¸ÑÑа
$ExcelWorkSheet.Cells.Item(1,1) = "Name service"
# ÐадаÑÑ Ð¸Ð¼ÐµÐ½Ð° ÑÑолбÑов:
$ExcelWorkSheet.Cells.Item(1,2) = "Description"
$ExcelWorkSheet.Cells.Item(1,3) = "Status"
$ExcelWorkSheet.Cells.Item(1,4) = "Startup type"
$ExcelWorkSheet.Rows.Item(1).Font.Bold = $true` вÑделиÑÑ Ð¶Ð¸ÑнÑм ÑÑиÑÑом
$ExcelWorkSheet.Rows.Item(1).Font.size=14
# ÐадаÑÑ ÑиÑÐ¸Ð½Ñ ÐºÐ¾Ð»Ð¾Ð½Ð¾Ðº:
$ExcelWorkSheet.Columns.Item(1).ColumnWidth=30
$ExcelWorkSheet.Columns.Item(2).ColumnWidth=80
$ExcelWorkSheet.Columns.Item(3).ColumnWidth=15
$ExcelWorkSheet.Columns.Item(4).ColumnWidth=25
$services = Get-Service
$counter = 2` задаÑÑ Ð½Ð°ÑалÑнÑй Ð½Ð¾Ð¼ÐµÑ ÑÑÑоки Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи
foreach ($service in $services) {
$status = $service.Status
if ($status -eq 1) {
$status_type = "Stopped"
} elseif ($status -eq 4) {
$status_type = "Running"
}
$Start = $service.StartType
if ($Start -eq 1) {
$start_type = "Delayed start"
} elseif ($Start -eq 2) {
$start_type = "Automatic"
} elseif ($Start -eq 3) {
$start_type = "Manually"
} elseif ($Start -eq 4) {
$start_type = "Disabled"
}
$ExcelWorkSheet.Columns.Item(1).Rows.Item($counter) = $service.Name
$ExcelWorkSheet.Columns.Item(2).Rows.Item($counter) = $service.DisplayName
$ExcelWorkSheet.Columns.Item(3).Rows.Item($counter) = $status_type
$ExcelWorkSheet.Columns.Item(4).Rows.Item($counter) = $start_type
if ($status_type -eq "Running") {
$ExcelWorkSheet.Columns.Item(3).Rows.Item($counter).Font.Bold = $true
}
$counter++` +1 ÑвелиÑиÑÑ Ð´Ð»Ñ ÑÑеÑÑика ÑÑÑоки Rows
}
$ExcelWorkBook.SaveAs($path)
$ExcelWorkBook.close($true)
$Excel.Quit()
Excel.Application.Open
$path = "$home\Desktop\Services-to-Excel.xlsx"
$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $false
$ExcelWorkBook = $excel.Workbooks.Open($path)` оÑкÑÑÑÑ xlsx-Ñайл
$ExcelWorkBook.Sheets | select Name,Index` оÑобÑазиÑÑ Ð»Ð¸ÑÑÑ
$ExcelWorkSheet = $ExcelWorkBook.Sheets.Item(1)` оÑкÑÑÑÑ Ð»Ð¸ÑÑ Ð¿Ð¾ номеÑÑ Index
1..100 | %{$ExcelWorkSheet.Range("A$_").Text}` пÑоÑиÑаÑÑ Ð·Ð½Ð°Ñение из ÑÑолбÑа Ð ÑÑÑоки c 1 по 100
$Excel.Quit()
ImportExcel
Install-Module -Name ImportExcel
$data | Export-Excel .\Data.xlsx
$data = Import-Excel .\Data.xlsx
$data = ps
$Chart = New-ExcelChartDefinition -XRange CPU -YRange WS -Title "Process" -NoLegend
$data | Export-Excel .\ps.xlsx -AutoNameRange -ExcelChartDefinition $Chart -Show
CSV
Get-Service | Select Name,DisplayName,Status,StartType | Export-Csv -path "$home\Desktop\Get-Service.csv" -Append -Encoding Default ÑкÑпоÑÑиÑоваÑÑ Ð² csv (-Encoding UTF8)
Import-Csv "$home\Desktop\Get-Service.csv" -Delimiter "," импоÑÑиÑоваÑÑ Ð¼Ð°ÑÑив
$data = ConvertFrom-Csv @"
Region,State,Units,Price
West,Texas,927,923.71
$null,Tennessee,466,770.67
"@
$systeminfo = systeminfo /FO csv | ConvertFrom-Csv вÑвод ÑабоÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð² CSV и конвеÑÑаÑÐ¸Ñ Ð² обÑекÑ
$systeminfo."ÐолнÑй обÑем ÑизиÑеÑкой памÑÑи"
$systeminfo."ÐоÑÑÑÐ¿Ð½Ð°Ñ ÑизиÑеÑÐºÐ°Ñ Ð¿Ð°Ð¼ÑÑÑ"
ConvertFrom-String
'
log =
{
level = 4;
};
' | ConvertFrom-String` ÑÐ¾Ð·Ð´Ð°ÐµÑ PSCustomObject (ÑÐ°Ð·Ð±Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾ пÑобелам, ÑдалÑÐµÑ Ð²Ñе пÑÐ¾Ð±ÐµÐ»Ñ Ð¸ пÑÑÑÑе ÑÑÑоки)
ConvertFrom-StringData
"
key1 = value1
key2 = value2
" | ConvertFrom-StringData # ÑÐ¾Ð·Ð´Ð°ÐµÑ Hashtable
XML
$xml = [xml](Get-Content $home\desktop\test.rdg)` пÑоÑиÑаÑÑ ÑодеÑжимое XML-Ñайла
$xml.load("$home\desktop\test.rdg")` оÑкÑÑÑÑ Ñайл
$xml.RDCMan.file.group.properties.name` имена гÑÑпп
$xml.RDCMan.file.group.server.properties` имена вÑеÑ
ÑеÑвеÑов
$xml.RDCMan.file.group[3].server.properties` ÑпиÑок ÑеÑвеÑов в 4-й гÑÑппе
($xml.RDCMan.file.group[3].server.properties | ? name -like ADIRK).Name = "New-Name"` измениÑÑ Ð·Ð½Ð°Ñение
$xml.RDCMan.file.group[3].server[0].properties.displayName = "New-displayName"
$xml.RDCMan.file.group[3].server[1].RemoveAll()` ÑдалиÑÑ Ð¾Ð±ÑÐµÐºÑ (2-й ÑеÑÐ²ÐµÑ Ð² ÑпиÑке)
$xml.Save($file)` ÑоÑ
ÑаниÑÑ ÑодеÑжимое обÑекÑа в Ñайла
Get-Service | Export-Clixml -path $home\desktop\test.xml ÑкÑпоÑÑиÑоваÑÑ Ð¾Ð±ÑÐµÐºÑ PowerShell в XML
Import-Clixml -Path $home\desktop\test.xml импоÑÑиÑоваÑÑ Ð¾Ð±ÑÐµÐºÑ XML в PowerShell
ConvertTo-Xml (Get-Service)
Get-CredToXML
function Get-CredToXML {
param (
$CredFile = "$home\Documents\cred.xml"
)
if (Test-Path $CredFile) {
Import-Clixml -path $CredFile
}
elseif (!(Test-Path $CredFile)) {
$Cred = Get-Credential -Message "Enter credential"
if ($Cred -ne $null) {
$Cred | Export-CliXml -Path $CredFile
$Cred
}
else {
return
}
}
}
$Cred = Get-CredToXML
$Login = $Cred.UserName
$PasswordText = $Cred.GetNetworkCredential().password полÑÑиÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ð² ÑекÑÑовом виде
XmlWriter (Extensible Markup Language)
$XmlWriterSettings = New-Object System.Xml.XmlWriterSettings
$XmlWriterSettings.Indent = $true` вклÑÑиÑÑ Ð¾ÑÑÑÑпÑ
$XmlWriterSettings.IndentChars = " "` задаÑÑ Ð¾ÑÑÑÑп
$XmlFilePath = "$home\desktop\test.xml"
$XmlObjectWriter = [System.XML.XmlWriter]::Create($XmlFilePath, $XmlWriterSettings)` ÑоздаÑÑ Ð´Ð¾ÐºÑменÑ
$XmlObjectWriter.WriteStartDocument()` наÑаÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² докÑменÑ
$XmlObjectWriter.WriteComment("Comment")
$XmlObjectWriter.WriteStartElement("Root")` ÑоздаÑÑ ÑÑаÑÑовÑй ÑлеменÑ, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ Ð´Ð¾ÑеÑние обÑекÑÑ
$XmlObjectWriter.WriteStartElement("Configuration")` ÑоздаÑÑ Ð¿ÐµÑвÑй доÑеÑний ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð»Ñ BaseSettings
$XmlObjectWriter.WriteElementString("Language","RU")
$XmlObjectWriter.WriteStartElement("Fonts") # <Fonts>
$XmlObjectWriter.WriteElementString("Name","Arial")
$XmlObjectWriter.WriteElementString("Size","12")
$XmlObjectWriter.WriteEndElement() # </Fonts>
$XmlObjectWriter.WriteEndElement()` конеÑнÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ </Configuration>
$XmlObjectWriter.WriteEndElement()` конеÑнÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ </Root>
$XmlObjectWriter.WriteEndDocument()` завеÑÑиÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² докÑменÑ
$XmlObjectWriter.Flush()
$XmlObjectWriter.Close()
CreateElement
$xml = [xml](gc $home\desktop\test.xml)
$xml.Root.Configuration.Fonts
$NewElement = $xml.CreateElement("Fonts")` вÑбÑаÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÐºÑда добавиÑÑ
$NewElement.set_InnerXML("<Name>Times New Roman</Name><Size>14</Size>")` ÐаполниÑÑ Ð·Ð½Ð°ÑениÑми доÑеÑние ÑлеменÑÑ Fonts
$xml.Root.Configuration.AppendChild($NewElement)` добавиÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ð¾Ð²Ð¾Ð¹ ÑÑÑокой в Configuration (ÑодиÑÐµÐ»Ñ Fonts)
$xml.Save("$home\desktop\test.xml")
JSON
$log = '
{
"log": {
"level": 7
}
}
' | ConvertFrom-Json
Get-Service | ConvertTo-Json
$OOKLA = '
{
"result" :
{"date":1683534970,"id":"14708271987","connection_icon":"wireless","download":33418,"upload":35442,"latency":15,"distance":50,"country_code":"RU","server_id":2707,"server_name":"Bryansk","sponsor_name":"DOM.RU","sponsor_url":null,"connection_mode":"multi","isp_name":"Resource Link","isp_rating":"4.0","test_rank":63,"test_grade":"B-","test_rating":4,"idle_latency":"17","download_latency":"116","upload_latency":"75","additional_servers":
[{"server_id":8191,"server_name":"Bryansk","sponsor_name":"SectorTelecom.ru"},{"server_id":46278,"server_name":"Fokino","sponsor_name":"Fokks - Promyshlennaya avtomatika Ltd."},{"server_id":18218,"server_name":"Bryansk","sponsor_name":"RIA-link Ltd."}],
"path":"result\u002F14708271987","hasSecondary":true
}
}
' | ConvertFrom-Json
$ookla.result
YAML
Import-Module PSYaml` иÑполÑзÑеÑÑÑ Ð² Docker/Ansible
$netplan = "
network:` ÑловаÑÑ Ð¿Ð¾ ÑÐ¸Ð¿Ñ - клÑÑ : знаÑение Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñми ÑловаÑÑми
ethernets:
ens160:
dhcp4: yes
dhcp6: no
nameservers:
addresses:` [8.8.8.8, 1.1.1.1]` ÑпиÑок даннÑÑ
(ÑÑÑок)
- 8.8.8.8
- 1.1.1.1
version: 2
"
$network = ConvertFrom-Yaml $netplan
$network.Values.ethernets.ens160.nameservers
$DataType = "
int: !!int 10.1
flo: !!float 10.1
str: !!str string
bool: !!bool` boolean
"
HTML
ConvertFrom-Html
function ConvertFrom-Html {
param (
[Parameter(ValueFromPipeline)]$url
)
$irm = Invoke-RestMethod $url
$HTMLFile = New-Object -ComObject HTMLFile
$Bytes = [System.Text.Encoding]::Unicode.GetBytes($irm)
$HTMLFile.write($Bytes)
($HTMLFile.all | where {$_.tagname -eq "body"}).innerText
}
$apache_status = "http://192.168.3.102/server-status"
$apache_status | ConvertFrom-Html
ConvertTo-Html
Get-Process | select Name, CPU | ConvertTo-Html -As Table > "$home\desktop\proc-table.html" вÑвод в ÑоÑмаÑе List (Format-List) или Table (Format-Table)
$servers = "ya.ru","ya.com","google.com"
$path = "$home\Desktop\Ping.html"
$header = @"
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>ÐÑÑÐµÑ Ð¾ ÑÑаÑÑÑе ÑеÑвеÑов</title>
<style type="text/css">
<!--
body {
background-color: #E0E0E0;
font-family: sans-serif
}
table, th, td {
background-color: white;
border-collapse:collapse;
border: 1px solid black;
padding: 5px
}
-->
</style>
"@
$body = @"
<h1>Ping status</h1>
<p>$(get-date -Format "dd.MM.yyyy hh:mm").</p>
"@
$results = foreach ($server in $servers) {
if (Test-Connection $server -Count 1 -ea 0 -Quiet) {
$status = "Up"
}
else {
$status = "Down"
}
[PSCustomObject]@{
Name = $server
Status = $status
}
}
$results | ConvertTo-Html -head $header -body $body | foreach {
$_ -replace "<td>Down</td>","<td style='background-color:#FF8080'>Down</td>" -replace "<td>Up</td>","<td style='background-color:#5BCCF3'>Up</td>"
} | Out-File $path
Invoke-Item $path
PSWriteHTML
Import-Module PSWriteHTML
(Get-Module PSWriteHTML).ExportedCommands
Get-Service | Out-GridHtml -FilePath ~\Desktop\Get-Service-Out-GridHtml.html
HtmlReport
Import-Module HtmlReport
$topVM = ps | Sort PrivateMemorySize -Descending | Select -First 10 | %{,@(($_.ProcessName + " " + $_.Id), $_.PrivateMemorySize)}
$topCPU = ps | Sort CPU -Descending | Select -First 10 | %{,@(($_.ProcessName + " " + $_.Id), $_.CPU)}
New-Report -Title "Piggy Processes" -Input {
New-Chart Bar "Top VM Users" -input $topVm
New-Chart Column "Top CPU Overall" -input $topCPU
ps | Select ProcessName, Id, CPU, WorkingSet, *MemorySize | New-Table "All Processes"
} > ~\Desktop\Get-Process-HtmlReport.html
HtmlAgilityPack
# ÐагÑÑзка библиоÑеки C#, коÑоÑÐ°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð¿Ð°ÑÑиÑÑ HTML-докÑменÑÑ, вÑбиÑаÑÑ ÑлеменÑÑ DOM и извлекаÑÑ Ð¸Ð· ниÑ
даннÑе
Add-Type -Path "C:\Users\Lifailon\Downloads\HtmlAgilityPack\Net40\HtmlAgilityPack.dll"
$title = "новобÑанеÑ"
$url = "http://fasts-torrent.net"
$ep = "engine/ajax/search_torrent.php?title=$title"
$html = Invoke-RestMethod "$url/$ep"
# Создание нового обÑекÑа HtmlDocument из HtmlAgilityPack, коÑоÑÑй бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð·Ð°Ð³ÑÑзки и обÑабоÑки HTML-кода
$HtmlDocument = New-Object HtmlAgilityPack.HtmlDocument
# ÐагÑÑзка HTML в ÑозданнÑй обÑÐµÐºÑ HtmlDocument
$HtmlDocument.LoadHtml($html)
$torrents = @()
# ÐÑполÑзование XPath Ð´Ð»Ñ Ð²ÑбоÑа вÑеÑ
ÑлеменÑов <tr> (ÑÑÑок ÑаблиÑÑ) в докÑменÑе
$HtmlDocument.DocumentNode.SelectNodes("//tr") | ForEach-Object {
# ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки ÑаблиÑÑ Ð²ÑбиÑаем клаÑÑÑ, ÑооÑвеÑÑÑвÑÑÑие Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ ÑаздаÑи, ÑазмеÑÑ Ð¸ ÑÑÑлке Ð´Ð»Ñ ÑкаÑиваниÑ.
$titleNode = $_.SelectSingleNode(".//td[@class='torrent-title']")
$sizeNode = $_.SelectSingleNode(".//td[@class='torrent-sp']")
$downloadLinkNode = $_.SelectSingleNode(".//td[@class='torrent-d-btn']/a")
# ÐÑовеÑÑем, ÑÑо вÑе клаÑÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ñ
if ($titleNode -ne $null -and $sizeNode -ne $null -and $downloadLinkNode -ne $null) {
# ÐзвлеÑение ÑекÑÑа из клаÑÑов
$title = $titleNode.InnerText.Trim()
$size = $sizeNode.InnerText.Trim()
$downloadLink = $downloadLinkNode.Attributes["href"].Value
$torrent = New-Object PSObject -Property @{
Title = $title
Size = $size
DownloadLink = "$($url)$($downloadLink)"
}
$torrents += $torrent
}
}
$torrents
Title Size DownloadLink
----- ---- ------------
ÐовобÑÐ°Ð½ÐµÑ (6 Ñезон: 1-3 ÑеÑии из 13) (2024) WEBRip | RuDub 1,55 ÐÐ http://fasts-torrent.net/download/449613/torrent/-6-1-3-13-2024-webrip-rudub/
ÐовобÑÐ°Ð½ÐµÑ (5 Ñезон: 1-22 ÑеÑии из 22) (2023) WEBRip 1080p | RuDub 54,15 ÐÐ http://fasts-torrent.net/download/433749/torrent/-5-1-22-22-2023-webrip-1080p-rudub/
ÐовобÑÐ°Ð½ÐµÑ (5 Ñезон: 1-22 ÑеÑии из 22) (2023) WEBRip 720p | RuDub 30,14 ÐÐ http://fasts-torrent.net/download/433750/torrent/-5-1-22-22-2023-webrip-720p-rudub/
ÐовобÑÐ°Ð½ÐµÑ (5 Ñезон: 1-22 ÑеÑии из 22) (2023) WEBRip | RuDub 11,55 ÐÐ http://fasts-torrent.net/download/433751/torrent/-5-1-22-22-2023-webrip-rudub/
ÐовобÑÐ°Ð½ÐµÑ (4 Ñезон: 1-22 ÑеÑии из 22) (2021) WEB-DL 720p | RG.Paravozik 21.33 Gb http://fasts-torrent.net/download/418618/torrent/-4-1-22-22-2021-web-dl-720p-rgparavozik/
ÐолиÑейÑкий Ñ Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½Ð¾Ð¹: ÐовобÑÐ°Ð½ÐµÑ (2017) WEB-DLRip 720p| ЧиÑÑÑй звÑк 3.41 Gb http://fasts-torrent.net/download/254846/torrent/-2017-web-dlrip-720p-/
ÐолиÑейÑкий Ñ Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½Ð¾Ð¹: ÐовобÑÐ°Ð½ÐµÑ (2017) WEB-DLRip | ЧиÑÑÑй звÑк 1.37 Gb http://fasts-torrent.net/download/254845/torrent/-2017-web-dlrip-/
ÐовобÑÐ°Ð½ÐµÑ (2 Ñезон: 1-20 ÑеÑии из 20) (2019) WEBRip | BaibaKo 11.28 Gb http://fasts-torrent.net/download/364669/torrent/-2-1-20-20-2019-webrip-baibako/
ÐовобÑÐ°Ð½ÐµÑ (2 Ñезон: 1-20 ÑеÑии из 20) (2019) WEBRip 1080p | Octopus 45.97 Gb http://fasts-torrent.net/download/364161/torrent/-2-1-20-20-2019-webrip-1080p-octopus/
ÐовобÑÐ°Ð½ÐµÑ (2 Ñезон: 1-20 ÑеÑии из 20) (2019) WEB-DLRip | LostFilm 11.95 Gb http://fasts-torrent.net/download/364668/torrent/-2-1-20-20-2019-web-dlrip-lostfilm/
SQLite
$path = "$home\Documents\Get-Service.db"
$Module = Get-Module MySQLite
if ($Module -eq $null) {
Install-Module MySQLite -Repository PSGallery -Scope CurrentUser
}
Import-Module MySQLite
New-MySQLiteDB -Path $path # ÑоздаÑÑ ÐÐ
Invoke-MySQLiteQuery -Path $path -Query "CREATE TABLE Service (Name TEXT NOT NULL, DisplayName TEXT NOT NULL, Status TEXT NOT NULL);" # ÑоздаÑÑ ÑаблиÑÑ
$Service = Get-Service | select Name,DisplayName,Status
foreach ($S in $Service) {
$Name = $S.Name
$DName = $S.DisplayName
$Status = $S.Status
Invoke-MySQLiteQuery -Path $path -Query "INSERT INTO Service (Name, DisplayName, Status) VALUES ('$Name', '$DName', '$Status');"
}
(Get-MySQLiteDB $path).Tables ÑпиÑок ÑÐ°Ð±Ð»Ð¸Ñ Ð² базе
Invoke-MySQLiteQuery -Path $path -Query "SELECT name FROM sqlite_master WHERE type='table';" ÑпиÑок ÑÐ°Ð±Ð»Ð¸Ñ Ð² базе
Invoke-MySQLiteQuery -Path $path -Query "DROP TABLE Service;" ÑдалиÑÑ ÑаблиÑÑ
$TableName = "Service"
Invoke-MySQLiteQuery -Path $path -Query "SELECT * FROM $TableName" # пÑоÑиÑаÑÑ ÑодеÑжимое ÑаблиÑÑ (в ÑоÑмаÑе обÑекÑа)
Get-Service | select Name,DisplayName,Status | ConvertTo-MySQLiteDB -Path $path -TableName Service -force конвеÑÑиÑоваÑÑ Ð¾Ð±ÑÐµÐºÑ Ð² ÑаблиÑÑ
Database password
$Connection = New-SQLiteConnection -DataSource $path
$Connection.ChangePassword("password")
$Connection.Close()
Invoke-SqliteQuery -Query "SELECT * FROM Service" -DataSource "$path;Password=password"
MySQL
apt -y install mysql-server mysql-client
mysql -V
systemctl status mysql
mysqladmin -u root password задаÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ root
nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
user = mysql
# pid-file = /var/run/mysqld/mysqld.pid
# socket = /var/run/mysqld/mysqld.sock
# port = 3306
# datadir = /var/lib/mysql
# tmpdir = /tmp
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
log_error = /var/log/mysql/error.log
systemctl restart mysql
ss -tulnp | grep 3306
ufw allow 3306/tcp
nc -zv 192.168.1.253 3306
tnc 192.168.1.253 -p 3306
mysql -u root -p
SELECT user(), now(), version();
quit;
mysql -u root -p -e 'SHOW TABLES FROM db_aduser;' оÑобÑазиÑÑ ÑпиÑок ÑÐ°Ð±Ð»Ð¸Ñ Ð±ÐµÐ· подклÑÑÐµÐ½Ð¸Ñ Ðº конÑоли MySQL
CREATE ÑоздаÑÑ ÐÐ, полÑзоваÑелÑ, ÑаблиÑÑ
ALTER ÑпÑавление ÑÑолбÑами ÑаблиÑе
DROP ÑдалиÑÑ ÐÐ, полÑзоваÑелÑ, ÑаблиÑÑ
USE вÑбÑаÑÑ ÐÐ
SHOW вÑвеÑли ÑпиÑок ÐÐ, пÑав доÑÑÑпа полÑзоваÑÐµÐ»Ñ (GRANTS), Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ ÑÑолбÑов и иÑ
ÑвойÑÑва
GRANT даÑÑ Ð´Ð¾ÑÑÑп полÑзоваÑÐµÐ»Ñ Ðº ÐÐ
REVOKE ÑдалиÑÑ Ð´Ð¾ÑÑÑп полÑзоваÑÐµÐ»Ñ Ðº ÐÐ
UPDATE измениÑÑ Ð¿Ñава доÑÑÑпа, знаÑÐµÐ½Ð¸Ñ Ñ ÑаблиÑе
FLUSH обновиÑÑ Ð¿Ñава доÑÑÑпа
SELECT оÑобÑазиÑÑ Ð²ÑбÑаннÑÑ ÐÐ, вÑвеÑÑи ÑпиÑок полÑзоваÑелей, вÑбоÑка даннÑÑ
в ÑаблиÑе
INSERT внеÑÑи даннÑе
DELETE ÑдалиÑÑ Ð´Ð°Ð½Ð½Ñе в (FROM) ÑаблиÑе
DATA TYPE
VARCHAR(N) ÑÑÑока пеÑеменной длинÑ, в ÑоÑмаÑе ASCII, где один Ñимвол Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ 1 байÑ, ÑиÑлом N ÑказÑваеÑÑÑ Ð¼Ð°ÐºÑималÑÐ½Ð°Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° ÑÑÑоки
NVARCHAR(N) ÑÑÑока пеÑеменной длинÑ, в ÑоÑмаÑе Unicode, где один Ñимвол Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ 2 байÑа
CHAR(N)/nchar(N) ÑÑÑока ÑикÑиÑованной длинÑ, коÑоÑÐ°Ñ Ð²Ñегда дополнÑеÑÑÑ ÑпÑава пÑобелами до Ð´Ð»Ð¸Ð½Ñ N и в базе даннÑÑ
она Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ Ñовно N Ñимволов
INT Ñелое ÑиÑло, Ð¾Ñ -2147483648 до 2147483647, Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ 4 байÑа
FLOAT ÑиÑло, в коÑоÑом Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑиÑÑÑÑÑвоваÑÑ Ð´ÐµÑÑÑиÑÐ½Ð°Ñ ÑоÑка (запÑÑаÑ)
BIT Ñлаг, Ðа - 1 или ÐÐµÑ - 0
DATE ÑоÑÐ¼Ð°Ñ Ð´Ð°ÑÑ, напÑÐ¸Ð¼ÐµÑ 25.05.2023
TIME 23:30:55.1234567
DATETIME 25.05.2023 23:30:55.1234567
DATABASE
SHOW databases; # вÑвеÑÑи ÑпиÑок ÐÐ
CREATE DATABASE db_aduser; # ÑоздаÑÑ ÐÐ
CREATE DATABASE db_rep DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; # ÑоздаÑÑ ÐÐ Ñ ÐºÐ¾Ð´Ð¸Ñовкой UTF-8
DROP DATABASE db_rep; # ÑдалиÑÑ ÐÐ
USE db_aduser; # вÑбÑаÑÑ/пеÑеклÑÑиÑÑÑÑ Ð½Ð° вÑбÑаннÑÑ ÐÐ
SELECT database(); # оÑобÑазиÑÑ Ð²ÑбÑаннÑÑ ÐÐ
USER
SELECT USER,HOST FROM mysql.user; # вÑвеÑÑи ÑпиÑок УÐ
CREATE USER posh@localhost IDENTIFIED BY '1qaz!QAZ'; # ÑоздаÑÑ Ð£Ð, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑаÑÑÑÑ Ñ Ð»Ð¾ÐºÐ°Ð»Ñного ÑеÑвеÑа
CREATE USER posh@localhost IDENTIFIED BY '1qaz!QAZ'; # ÑоздаÑÑ Ð£Ð, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑаÑÑÑÑ Ñ Ñказанного ÑеÑвеÑа
CREATE USER posh@'192.168.3.99' IDENTIFIED BY '1qaz!QAZ'; # Ð£Ð Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа Ñ ÐºÐ¾Ð½ÐºÑеÑного ÑеÑвеÑа
CREATE USER 'admin'@'%' IDENTIFIED BY 'Admin12#'; # Ð£Ð Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа Ñ Ð»Ñбого ÑеÑвеÑа (% - wildcard)
DROP USER posh@localhost; # ÑдалиÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ
SHOW GRANTS FOR posh@'%'; # оÑобÑазиÑÑ Ð¿Ñава доÑÑÑпа полÑзоваÑелÑ
GRANT ALL PRIVILEGES ON db_aduser.* TO posh@'192.168.3.99'; # полнÑй доÑÑÑп Ð´Ð»Ñ posh к ÐÐ db_aduser
GRANT ALL PRIVILEGES ON *.* TO posh@'%'; # доÑÑÑп к вÑем ÐÐ c лÑбого клиенÑÑкого Ñ
оÑÑа
GRANT SELECT,DELETE ON mysql.* TO posh@'%'; # пÑава SELECT и DELETE на вÑÑÑоеннÑÑ ÐÐ mysql
REVOKE DELETE ON mysql.* FROM posh@'%'; # ÑдалиÑÑ Ð´Ð¾ÑÑÑп DELETE
UPDATE mysql.user SET super_priv='Y' WHERE USER='posh' AND host='%'; # измениÑÑ Ð¿Ñивелегии Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ
SELECT USER,HOST,super_priv FROM mysql.user; # ÑпиÑок УРи ÑаблиÑа Ñ Ð¿Ñавами SUPER privilege
FLUSH PRIVILEGES; # обновиÑÑ Ð¿Ñава доÑÑÑпа
TABLE
SHOW TABLES; # оÑобÑазиÑÑ ÑпиÑок вÑеÑ
ÑаблиÑ
SHOW TABLES LIKE '%user'; # поиÑк ÑаблиÑÑ Ð¿Ð¾ wildcard-имени
CREATE TABLE table_aduser (id INT NOT NULL AUTO_INCREMENT, Name VARCHAR(100), email VARCHAR(100), PRIMARY KEY (ID)); # ÑоздаÑÑ ÑаблиÑÑ
DROP TABLE table_aduser; # ÑдалиÑÑ ÑаблиÑÑ
COLUMN
SHOW COLUMNS FROM table_aduser; # оÑобÑазиÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ ÑÑобÑов и иÑ
ÑвойÑÑва
ALTER TABLE table_aduser DROP COLUMN id; # ÑдалиÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ id
ALTER TABLE table_aduser ADD COLUMN info VARCHAR(10); # добавиÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ info
ALTER TABLE table_aduser CHANGE info new_info VARCHAR(100); # измениÑÑ Ð¸Ð¼Ñ ÑÑолбÑа info на new_info и его Ñип даннÑÑ
ALTER TABLE table_aduser ADD COLUMN (id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (ID)); # добавиÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ id
INSERT
INSERT table_aduser (Name,email) VALUES ('Alex','no-email');
INSERT table_aduser (Name,email) VALUES ('Alex','no-email');
INSERT table_aduser (Name) VALUES ('Support');
INSERT table_aduser (Name) VALUES ('Jack');
SELECT
SELECT * FROM table_aduser; # ÑодеÑжимое вÑеÑ
ÑÑобÑов в вÑбÑанной (FROM) ÑаблиÑе
SELECT Name,email FROM table_aduser; # ÑодеÑжимое ÑказаннÑÑ
ÑÑобÑов
SELECT DISTINCT Name,Email FROM table_aduser; # оÑобÑазиÑÑ ÑникалÑнÑе запиÑи (без повÑоÑений)
SELECT * FROM table_aduser ORDER BY Name; # оÑÑоÑÑиÑоваÑÑ Ð¿Ð¾ Name
SELECT * FROM table_aduser ORDER BY Name DESC; # обÑаÑÐ½Ð°Ñ ÑоÑÑиÑовка
SELECT COUNT(*) FROM table_aduser; # колиÑеÑÑво ÑÑÑок в ÑаблиÑе
SELECT COUNT(new_info) FROM table_aduser; # колиÑеÑÑво ÑÑÑок в ÑÑолбÑе
WHERE
NOT; AND; OR # по пÑиоÑиÑеÑам ÑÑловий
SELECT * FROM table_aduser WHERE Name = 'Alex'; # поиÑк по ÑодеÑжимомÑ
SELECT * FROM table_aduser WHERE NOT Name != 'Alex'; # ÑÑловие NOT где Name не Ñавен знаÑениÑ
SELECT * FROM table_aduser WHERE email != ''; # вÑвеÑÑи ÑÑÑоки, где ÑодеÑжимое email не Ñано null
SELECT * FROM table_aduser WHERE email != '' OR id > 1000; # или id вÑÑе 1000
SELECT * FROM table_aduser WHERE Name RLIKE "support"; # ÑегиÑÑÑонезавиÑемÑй (RLIKE) поиÑк
SELECT * FROM table_aduser WHERE Name RLIKE "^support"; # наÑинаÑÑÑÑ ÑолÑко Ñ ÑÑого ÑловоÑоÑеÑаниÑ
DELETE
SELECT * FROM table_aduser WHERE Name RLIKE "alex"; # найÑи и пÑовеÑиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿ÐµÑед Ñдалением
DELETE FROM table_aduser WHERE Name RLIKE "alex"; # Query OK, 2 rows affected # Ñдалено две ÑÑÑоки
DELETE FROM table_aduser; # ÑдалиÑÑ ÐСРзнаÑениÑ
UPDATE
SELECT * FROM table_aduser WHERE Name = 'Jack'; # найÑи и пÑовеÑиÑÑ Ð·Ð½Ð°Ñение пеÑед изменением
UPDATE table_aduser SET Name = 'Alex' WHERE Name = 'Jack'; # измениÑÑ Ð·Ð½Ð°Ñение 'Jack' на 'Alex'
UPDATE db_aduser.table_aduser SET Name='BCA' WHERE id=1; # измениÑÑ Ð·Ð½Ð°Ñение в ÑÑÑоке Ñ ID 1
CHECK
CHECK TABLE db_aduser.table_aduser; # пÑовеÑиÑÑ
ANALYZE TABLE db_aduser.table_aduser; # анализиÑоваÑÑ
OPTIMIZE TABLE db_aduser.table_aduser; # опÑимизиÑоваÑÑ
REPAIR TABLE db_aduser.table_aduser; # воÑÑÑановиÑÑ
TRUNCATE TABLE db_aduser.table_aduser; # оÑиÑÑиÑÑ
DUMP
mysqldump -u root -p --databases db_aduser > /bak/db_aduser.sql
mysql -u root -p db_aduser < /bak/db_aduser.sql
crontab -e
00 22 * * * /usr/bin/mysqldump -uroot -p1qaz!QAZ db_zabbix | /bin/bzip2 > `date +/dump/zabbix/zabbix-\%d-\%m-\%Y-\%H:\%M.bz2`
00 23 * * * /usr/bin/mysqldump -uroot -p1qaz!QAZ db_zabbix > `date +/dump/smb/zabbix-\%d-\%m-\%Y-\%H:\%M.sql`
0 0 * * * find /dump/zabbix -mtime +7 -exec rm {} \;
mysqldump -u root --single-transaction db_zabbix > /dump/zabbix/db_zabbix.sql
mysql -u user_zabbix -p -e 'CREATE DATABASE db_zabbix;'
mysql -u user_zabbix -p db_zabbix < /root/db_zabbix.sql
innodb_force_recovery
sed -i '/innodb_force_recovery/d' /etc/mysql/my.cnf # ÑдалиÑÑ
mode=6; sed -i "/^\[mysqld\]/{N;s/$/\ninnodb_force_recovery=$mode/}" /etc/mysql/my.cnf # добавиÑÑ mode 6
systemctl restart mysql
[mysqld]
innodb_force_recovery=1 # ÑеÑÐ²ÐµÑ Ð¿ÑÑаеÑÑÑ Ð½Ð°ÑаÑÑ ÑабоÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо Ð¾Ñ Ñого, еÑÑÑ Ð»Ð¸ повÑежденнÑе даннÑе InnoDB или неÑ
innodb_force_recovery=2 # ÑдаеÑÑÑ Ð²Ð¾ÑÑÑановиÑÑ ÑабоÑÑ Ð·Ð° ÑÑÐµÑ Ð¾ÑÑановки поÑока команд, коÑоÑÑе бÑли ÑаÑÑиÑно вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ Ð¸Ð»Ð¸ не вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ (не запÑÑÐºÐ°ÐµÑ ÑоновÑе опеÑаÑии)
innodb_force_recovery=3 # оÑменÑÐµÑ Ð¾ÑÐºÐ°Ñ Ð¿Ð¾Ñле воÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð²ÑежденнÑÑ
Ñайлов (не пÑÑаеÑÑÑ Ð¾ÑкаÑиÑÑ ÑÑанзакÑии)
innodb_force_recovery=6 # запÑÑк СУÐРв Ñежиме read only
MySQL Connector NET
Add-ADUser
$ip = "192.168.1.253"
$user = "posh"
$pass = "1qaz!QAZ"
$db = "db_aduser"
Add-Type âPath "$home\Documents\MySQL-Connector-NET\8.0.31-4.8\MySql.Data.dll"
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{
ConnectionString="server=$ip;uid=$user;pwd=$pass;database=$db"
}
$Connection.Open()
$Command = New-Object MySql.Data.MySqlClient.MySqlCommand
$Command.Connection = $Connection
$UserList = Get-ADUser -filter * -properties name,EmailAddress
foreach ($user in $UserList) {
$uname=$user.Name
$uemail=$user.EmailAddress
$Command.CommandText = "INSERT INTO table_aduser (Name,Email) VALUES ('$uname','$uemail')"
$Command.ExecuteNonQuery()
}
$Connection.Close()
Get-ADUser
$ip = "192.168.1.253"
$user = "posh"
$pass = "1qaz!QAZ"
$db = "db_aduser"
Add-Type âPath "$home\Documents\MySQL-Connector-NET\8.0.31-4.8\MySql.Data.dll"
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{
ConnectionString = "server=$ip;uid=$user;pwd=$pass;database=$db"
}
$Connection.Open()
$Command = New-Object MySql.Data.MySqlClient.MySqlCommand
$Command.Connection = $Connection
$MYSQLDataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter
$MYSQLDataSet = New-Object System.Data.DataSet
$Command.CommandText = "SELECT * FROM table_aduser"
$MYSQLDataAdapter.SelectCommand = $Command
$NumberOfDataSets = $MYSQLDataAdapter.Fill($MYSQLDataSet, "data")
$Collections = New-Object System.Collections.Generic.List[System.Object]
foreach($DataSet in $MYSQLDataSet.tables[0]) {
$Collections.Add([PSCustomObject]@{
Name = $DataSet.name;
Mail = $DataSet.email
})
}
$Connection.Close()
$Collections
MSSQL
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | apt-key add - импоÑÑиÑоваÑÑ GPG-клÑÑ Ð´Ð»Ñ ÑепозиÑоÑиÑ
https://packages.microsoft.com/config/ubuntu/ вÑбÑаÑÑ ÑепозиÑоÑий и ÑкопиÑоваÑÑ URL
add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2019.list)"
apt-get update обновиÑÑ ÑпиÑок пакеÑов
apt-get install mssql-server
/opt/mssql/bin/mssql-conf setup ÑкÑÐ¸Ð¿Ñ Ð½Ð°ÑалÑной конÑигÑÑаÑии (вÑбÑаÑÑ ÑедакÑиÑ, 3 - express и ÑÑÑÑкий ÑзÑк 9 из 11)
systemctl status mssql-server
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - ÑÑÑановиÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | tee /etc/apt/sources.list.d/msprod.list
apt-get update
apt-get install mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc добавиÑÑ Ð² домаÑний каÑалог Ñайла bashrc, ÑÑо Ð±Ñ Ð½Ðµ пиÑаÑÑ Ð¿ÑÑÑ Ðº иÑполнÑÐµÐ¼Ð¾Ð¼Ñ ÑайлÑ
export PATH="$PATH:/opt/mssql-tools/bin"
iptables -I INPUT 1 -p tcp --dport 1433 -j ACCEPT
sqlcmd -S localhost -U SA
CREATE DATABASE itinvent
go
SELECT name FROM master.dbo.sysdatabases
go
System.Data.SqlClient
$user = "itinvent"
$pass = "itinvent"
$db = "itinvent"
$srv = "192.168.3.103"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "server=$srv;database=$db;user id=$user;password=$pass;Integrated Security=false"
$SqlCommand = New-Object System.Data.SqlClient.SqlCommand` клаÑÑ ÑоÑмаÑа командÑ
$SqlCommand.CommandText = "SELECT * FROM ITINVENT.dbo.USERS"` оÑобÑазиÑÑ ÑодеÑжимое ÑаблиÑÑ
#$SqlCommand.CommandText = "SELECT LICENCE_DATE,DESCR,MODEL_NO,TYPE_NO FROM ITINVENT.dbo.ITEMS where LICENCE_DATE IS NOT NULL"
$SqlCommand.Connection = $SqlConnection` пеÑедаÑÑ ÑоÑÐ¼Ð°Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑениÑ
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter` ÑоздаÑÑ Ð°Ð´Ð°Ð¿ÑÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ SELECT запÑоÑов к ÐÐ
$SqlAdapter.SelectCommand = $SqlCommand` пеÑедаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ
$DataSet = New-Object System.Data.DataSet` ÑоздаÑÑ Ð¾Ð±ÑÐµÐºÑ Ð¿Ñиема даннÑÑ
ÑоÑмаÑа XML
$SqlAdapter.Fill($DataSet)` заполниÑÑ Ð´Ð°Ð½Ð½Ñми полÑÑеннÑе Ð¾Ñ Ð°Ð´Ð°Ð¿ÑеÑа (возвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»-во обÑекÑов)
$SqlConnection.Close()
$Data = $DataSet.Tables
$Data[0] | ft
SqlClient INSERT
$user = "itinvent"
$pass = "itinvent"
$db = "db_test"
$srv = "192.168.3.103"
$sql = "INSERT INTO table_test (column_user) VALUES ('lifailon')"` добавиÑÑ Ð´Ð°Ð½Ð½Ñе в ÑаблиÑÑ table_test в ÐºÐ¾Ð»Ð¾Ð½ÐºÑ column_user
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "server=$srv;database=$db;user id=$user;password=$pass;Integrated Security=false"
$SqlCommand = New-Object System.Data.SqlClient.SqlCommand
$SqlCommand.CommandText = $sql
$SqlCommand.Connection = $SqlConnection
$SqlConnection.Open()
$rowsAffected = $SqlCommand.ExecuteNonQuery();` Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов INSERT/UPDATE/DELETE не иÑполÑзÑеÑÑÑ SqlDataAdapter
$SqlConnection.Close()
SSMS INSERT
USE [db_test]
GO
INSERT INTO [dbo].[table_test]
([column_user])
VALUES
('lifailon')
GO
SELECT TOP (1000) [column_user]
FROM [db_test].[dbo].[table_test]
T-SQL
-
DDL (Data Definition Language / ЯзÑк опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ ). Ð ÑÑÐ¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð¾ÑноÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, коÑоÑÑе ÑоздаÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , ÑаблиÑÑ, индекÑÑ, Ñ ÑанимÑе пÑоÑедÑÑÑ.
CREATEÑÐ¾Ð·Ð´Ð°ÐµÑ Ð¾Ð±ÑекÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ (ÑÐ°Ð¼Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½ÑÑ , ÑаблиÑÑ, индекÑÑ Ð¸ Ñ.д.)
ALTERизменÑÐµÑ Ð¾Ð±ÑекÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
DROPÑдалÑÐµÑ Ð¾Ð±ÑекÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
TRUNCATEÑдалÑÐµÑ Ð²Ñе даннÑе из ÑÐ°Ð±Ð»Ð¸Ñ -
DML (Data Manipulation Language / ЯзÑк манипÑлÑÑии даннÑми). Ð ÑÑÐ¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð¾ÑноÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¿Ð¾ вÑбоÑÑ, обновлениÑ, Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ .
SELECTÐ¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÑ Ð´Ð°Ð½Ð½Ñе из ÐÐ
UPDATEобновлÑÐµÑ Ð´Ð°Ð½Ð½Ñе
INSERTдобавлÑÐµÑ Ð½Ð¾Ð²Ñе даннÑе
DELETEÑдалÑÐµÑ Ð´Ð°Ð½Ð½Ñе -
DCL (Data Control Language / ЯзÑк ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑпа к даннÑм). Ð ÑÑÐ¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð¾ÑноÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, коÑоÑÑе ÑпÑавлÑÑÑ Ð¿Ñавами по доÑÑÑÐ¿Ñ Ðº даннÑм.
GRANTпÑедоÑÑавлÑÐµÑ Ð¿Ñава Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к даннÑм
REVOKEоÑзÑÐ²Ð°ÐµÑ Ð¿Ñава на доÑÑÑп к даннÑм
-- ÐеÑеменнÑе
DECLARE @text NVARCHAR(20), @int INT;
SET @text='Test';
SET @int = 21;
select @text,@int
-- Ðмена ÑеÑвеÑа и ÑкземплÑÑа
Select @@SERVERNAME as [Server\Instance];
-- веÑÑÐ¸Ñ SQL Server
Select @@VERSION as SQLServerVersion;
-- ТекÑÑÐ°Ñ ÐÐ (ÐÐ, в конÑекÑÑе коÑоÑой вÑполнÑеÑÑÑ Ð·Ð°Ð¿ÑоÑ)
Select DB_NAME() AS CurrentDB_Name;
-- ÐÑÐµÐ¼Ñ ÑабоÑÑ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа запÑÑка ÑеÑвеÑа
SELECT @@Servername AS ServerName ,
create_date AS ServerStarted ,
DATEDIFF(s, create_date, GETDATE()) / 86400.0 AS DaysRunning ,
DATEDIFF(s, create_date, GETDATE()) AS SecondsRunnig
FROM sys.databases
WHERE name = 'tempdb';
-- ÐолиÑеÑÑво акÑивнÑÑ
Ñоединений
SELECT @@Servername AS Server ,
DB_NAME(database_id) AS DatabaseName ,
COUNT(database_id) AS Connections ,
Login_name AS LoginName ,
MIN(Login_Time) AS Login_Time ,
MIN(COALESCE(last_request_end_time, last_request_start_time))
AS Last_Batch
FROM sys.dm_exec_sessions
WHERE database_id > 0
AND DB_NAME(database_id) NOT IN ( 'master', 'msdb' )
GROUP BY database_id ,
login_name
ORDER BY DatabaseName;
-- СÑаÑÑÑ Backup
SELECT @@Servername AS ServerName ,
d.Name AS DBName ,
MAX(b.backup_finish_date) AS LastBackupCompleted
FROM sys.databases d
LEFT OUTER JOIN msdb..backupset b
ON b.database_name = d.name
AND b.[type] = 'D'
GROUP BY d.Name
ORDER BY d.Name;
-- ÐÑÑÑ Ðº Backup
SELECT @@Servername AS ServerName ,
d.Name AS DBName ,
b.Backup_finish_date ,
bmf.Physical_Device_name
FROM sys.databases d
INNER JOIN msdb..backupset b ON b.database_name = d.name
AND b.[type] = 'D'
INNER JOIN msdb.dbo.backupmediafamily bmf ON b.media_set_id = bmf.media_set_id
ORDER BY d.NAME ,
b.Backup_finish_date DESC;
-- ÐÑвеÑÑи ÑпиÑок вÑеÑ
ÐÐ, модели воÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ пÑÑÑ Ðº mdf/ldf
EXEC sp_helpdb;
SELECT @@SERVERNAME AS Server ,
d.name AS DBName ,
create_date ,
recovery_model_Desc AS RecoveryModel ,
m.physical_name AS FileName
FROM sys.databases d
JOIN sys.master_files m ON d.database_id = m.database_id
ORDER BY d.name;
-- Ð Ð°Ð·Ð¼ÐµÑ ÐÐ
with fs
as
(
select database_id, type, size * 8.0 / 1024 size
from sys.master_files
)
select
name,
(select sum(size) from fs where type = 0 and fs.database_id = db.database_id) DataFileSizeMB,
(select sum(size) from fs where type = 1 and fs.database_id = db.database_id) LogFileSizeMB
from sys.databases
-- ÐоиÑк ÑаблиÑÑ Ð¿Ð¾ маÑке имени (вÑвод: Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ ÑÑ
ÐµÐ¼Ñ Ð³Ð´Ðµ ÑаÑпологаеÑÑÑ Ð¾Ð±ÑекÑ, Ñип обÑекÑа, даÑа ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸ поÑледней модиÑикаÑии):
select [object_id], [schema_id],
schema_name([schema_id]) as [schema_name],
[name],
[type],
[type_desc],
[create_date],
[modify_date]
from sys.all_objects
-- where [name]='INVENT';
where [name] like '%INVENT%';
-- Ðол-во ÑÑÑок в ÑаблиÑаÑ
SELECT @@ServerName AS Server ,
DB_NAME() AS DBName ,
OBJECT_SCHEMA_NAME(p.object_id) AS SchemaName ,
OBJECT_NAME(p.object_id) AS TableName ,
i.Type_Desc ,
i.Name AS IndexUsedForCounts ,
SUM(p.Rows) AS Rows
FROM sys.partitions p
JOIN sys.indexes i ON i.object_id = p.object_id
AND i.index_id = p.index_id
WHERE i.type_desc IN ( 'CLUSTERED', 'HEAP' )
-- This is key (1 index per table)
AND OBJECT_SCHEMA_NAME(p.object_id) <> 'sys'
GROUP BY p.object_id ,
i.type_desc ,
i.Name
ORDER BY SchemaName ,
TableName;
-- ÐайÑи ÑÑÑоковое (nvarchar) знаÑение 2023 по вÑем ÑаблиÑам Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
-- ÐÑобÑажаеÑÑÑ Ð² какой ÑаблиÑе и ÑÑолбÑе Ñ
ÑаниÑÑÑ Ð·Ð½Ð°Ñение, а Ñакже колиÑеÑÑво найденнÑÑ
паÑÑ ÑаблиÑа-колонка
set nocount on
declare @name varchar(128), @substr nvarchar(4000), @column varchar(128)
set @substr = '%2023%'
declare @sql nvarchar(max);
create table`rslt
(table_name varchar(128), field_name varchar(128), [value] nvarchar(max))
declare s cursor for select table_name as table_name from information_schema.tables where table_type = 'BASE TABLE' order by table_name
open s
fetch next from s into @name
while @@fetch_status = 0
begin
declare c cursor for
select quotename(column_name) as column_name from information_schema.columns
where data_type in ('text', 'ntext', 'varchar', 'char', 'nvarchar', 'char', 'sysname', 'int', 'tinyint') and table_name = @name
set @name = quotename(@name)
open c
fetch next from c into @column
while @@fetch_status = 0
begin
--print 'Processing table - ' + @name + ', column - ' + @column
set @sql='insert into`rslt select ''' + @name + ''' as Table_name, ''' + @column + ''', cast(' + @column +
' as nvarchar(max)) from' + @name + ' where cast(' + @column + ' as nvarchar(max)) like ''' + @substr + '''';
print @sql;
exec(@sql);
fetch next from c into @column;
end
close c
deallocate c
fetch next from s into @name
end
select table_name as [Table Name], field_name as [Field Name], count(*) as [Found Mathes] from`rslt
group by table_name, field_name
order by table_name, field_name
drop table`rslt
close s
deallocate s
-- ÐоиÑк в ÑаблиÑе [CI_HISTORY] и ÑÑолбÑÑ [HIST_ID]:
SELECT * FROM ITINVENT.dbo.CI_HISTORY where [HIST_ID] like '%2023%';
-- УзнаÑÑ ÑÑагменÑаÑÐ¸Ñ Ð¸Ð½Ð´ÐµÐºÑов
DECLARE @db_id SMALLINT;
SET @db_id = DB_ID(N'itinvent');
IF @db_id IS NULL
BEGIN;
PRINT N'ÐепÑавилÑное Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ';
END;
ELSE
BEGIN;
SELECT
object_id AS [ID обÑекÑа],
index_id AS [ID индекÑа],
index_type_desc AS [Тип индекÑа],
avg_fragmentation_in_percent AS [ФÑагменÑаÑÐ¸Ñ Ð² %]
FROM sys.dm_db_index_physical_stats(@db_id, NULL, NULL, NULL , 'LIMITED')
ORDER BY [avg_fragmentation_in_percent] DESC;
END;
GO
-- TempDB
-- Initial size - наÑалÑнÑй/минималÑнÑй ÑÐ°Ð·Ð¼ÐµÑ ÐÐ (1024 MB)
-- Autogrowh - пÑиÑоÑÑ (512MB)
-- Ðо ÑмолÑÐ°Ð½Ð¸Ñ tempdb наÑÑÑоена на авÑо-ÑаÑÑиÑение (Autogrow) и пÑи каждой пеÑезагÑÑзке SQL Server пеÑеÑоздаÑÑ ÑÐ°Ð¹Ð»Ñ ÑÑой ÐÐ Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑнÑм ÑазмеÑом иниÑиализаÑии.
-- УвелиÑив ÑÐ°Ð·Ð¼ÐµÑ Ð¸Ð½Ð¸ÑиализаÑии Ñайлов tempdb, можно ÑвеÑÑи к минимÑÐ¼Ñ Ð·Ð°ÑÑаÑÑ ÑиÑÑемнÑÑ
ÑеÑÑÑÑов на опеÑаÑии авÑо-ÑаÑÑиÑениÑ.
-- ÐзмениÑÑ Ð¿ÑÑÑ Ðº ÐÐ:
USE master;
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, FILENAME = 'F:\tempdb.mdf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp2, FILENAME = 'F:\tempdb_mssql_2.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp3, FILENAME = 'F:\tempdb_mssql_3.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp4, FILENAME = 'F:\tempdb_mssql_4.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp5, FILENAME = 'F:\tempdb_mssql_5.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp6, FILENAME = 'F:\tempdb_mssql_6.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp7, FILENAME = 'F:\tempdb_mssql_7.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp8, FILENAME = 'F:\tempdb_mssql_8.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = templog, FILENAME = 'F:\templog.ldf');
GO
-- УказаÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ñайла:
MODIFY FILE (NAME = temp2, FILENAME = 'F:\tempdb_mssql_2.ndf' , SIZE = 1048576KB , FILEGROWTH = 524288KB);
Тип ÑезеÑвной копии
- Full (ÐÐ¾Ð»Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ). Ðогда ÑÑаÑÑÑÐµÑ Ð¿Ð¾Ð»Ð½Ð¾Ðµ ÑезеÑвиÑование, запиÑÑваеÑÑÑ Log Sequence Number (LSN - поÑледоваÑелÑнÑй Ð½Ð¾Ð¼ÐµÑ Ð¶ÑÑнала), а Ñак же LSN запиÑÑваеÑÑÑ Ð¸ пÑи завеÑÑении полного ÑезеÑвиÑованиÑ. ÐÑÐ¾Ñ LSN ÑвлÑеÑÑÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð¼, иÑполÑзÑемÑм SQL Server, ÑÑÐ¾Ð±Ñ Ð·Ð½Ð°ÑÑ, в каком поÑÑдке вÑполнÑлиÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ INSERT, UPDATE или DELETE. ÐÑи ÑÑом налиÑие запиÑаннÑÑ LSN наÑала и оконÑаниÑ, как ÑаÑÑи полного бÑкапа, обеÑпеÑÐ¸Ð²Ð°ÐµÑ ÑоглаÑованное Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ ÑÑанзакÑий ÑезеÑвное копиÑование, поÑколÑÐºÑ Ð¿Ñи полном ÑезеÑвном копиÑовании ÑÑиÑÑваÑÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, пÑоизоÑедÑие во вÑÐµÐ¼Ñ ÑезеÑвного копиÑованиÑ. ÐÑо обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð¾Ð±ÑабоÑÐºÑ ÑÐ°ÐºÐ¸Ñ ÑÑанзакÑий в пÑоÑеÑÑе воÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ñкапа.
- Differential (диÑÑеÑенÑиалÑнаÑ/ÑазноÑÑÐ½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ). Ð¥ÑÐ°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ , изменивÑиеÑÑ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа поÑледней Ðолной ÑезеÑвной копии. ÐÑи воÑÑÑановлении нÑжно ÑнаÑала воÑÑÑановиÑÑ ÐолнÑÑ ÑезеÑвнÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð² Ñежиме NORECOVERY, поÑом можно пÑимениÑÑ Ð»ÑбÑÑ Ð¸Ð· поÑледÑÑÑÐ¸Ñ Ð Ð°Ð·Ð½Ð¾ÑÑнÑÑ ÐºÐ¾Ð¿Ð¸Ð¹, без пÑедÑдÑÑей Ðолной ÑезеÑвной копии РазноÑÑÐ½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð±ÐµÑполезна. ÐÐ°Ð¶Ð´Ð°Ñ Ð¿Ð¾ÑледÑÑÑÐ°Ñ Ð Ð°Ð·Ð½Ð¾ÑÑÐ½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð±ÑÐ´ÐµÑ Ñ ÑаниÑÑ Ð²Ñе даннÑе, Ð²Ñ Ð¾Ð´ÑÑие в пÑедÑдÑÑÑÑ Ð Ð°Ð·Ð½Ð¾ÑÑнÑÑ ÑезеÑвнÑÑ ÐºÐ¾Ð¿Ð¸Ñ, ÑделаннÑÑ Ð¿Ð¾Ñле пÑедÑдÑÑей Ðолной копии.
- Incremental (инкÑеменÑалÑнаÑ/ÐºÐ¾Ð¿Ð¸Ñ Ð¶ÑÑналов ÑÑанзакÑий). РезеÑвное копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¶ÑÑнала ÑÑанзакÑий копиÑÑÐµÑ Ð²Ñе ÑÑанзакÑии, коÑоÑÑе пÑоизоÑли Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа поÑледнего ÑезеÑвного копиÑованиÑ, а заÑем ÑÑÐµÐ·Ð°ÐµÑ Ð¶ÑÑнал ÑÑанзакÑий Ð´Ð»Ñ Ð¾ÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð´Ð¸Ñкового пÑоÑÑÑанÑÑва. ТÑанзакÑии пÑоиÑÑ Ð¾Ð´ÑÑ Ð² опÑеделенном поÑÑдке (LSN), бÑкап жÑÑнала поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑÑÐ¾Ñ Ð¿Ð¾ÑÑдок ÑÑанзакÑий. ÐÑÐºÐ°Ð¿Ñ Ð¶ÑÑналов ÑÑанзакÑий Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ð¾ÑÑÑанавливаÑÑÑÑ Ð¿Ð¾ поÑÑдкÑ. ÐÐ»Ñ Ð²Ð¾ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¿Ð¾ÑÑебÑеÑÑÑ Ð²ÑÑ ÑепоÑка ÑезеÑвнÑÑ ÐºÐ¾Ð¿Ð¸Ð¹: Ð¿Ð¾Ð»Ð½Ð°Ñ Ð¸ вÑе поÑледÑÑÑие инкÑеменÑалÑнÑе жÑÑнала ÑÑанзакÑий.
Ðодели воÑÑÑановлениÑ
- Simple (ÐÑоÑÑаÑ). Ð¥ÑаниÑÑÑ ÑолÑко Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñй Ð´Ð»Ñ Ð¶Ð¸Ð·Ð½Ð¸ оÑÑаÑок жÑÑнала ÑÑанзакÑий. ÐÑÑнал ÑÑанзакÑий (лог) авÑомаÑиÑеÑки оÑиÑаеÑÑÑ. Создание ÑезеÑвнÑÑ ÐºÐ¾Ð¿Ð¸Ð¹ жÑÑнала ÑÑанзакÑий невозможна, поÑÑÐ¾Ð¼Ñ Ð¾ÑÑаеÑÑÑ Ñамое огÑаниÑенное ÑиÑло опÑий по воÑÑÑановлениÑ. ÐедоÑÑÑпен ÑÑнкÑионал: Always On, Point-In-Time воÑÑÑановление, РезеÑвнÑе копии жÑÑнала ÑÑанзакÑий.
- Full (ÐолнаÑ). Ð¥ÑаниÑÑÑ Ð¶ÑÑнал ÑÑанзакÑий вÑÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в ÐÐ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа поÑледнего ÑезеÑвного копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¶ÑÑнала ÑÑанзакÑий. ÐÑÑнал ÑÑанзакÑий не бÑÐ´ÐµÑ Ð¾ÑиÑаÑÑÑÑ Ð´Ð¾ ÑÐµÑ Ð¿Ð¾Ñ, пока не бÑÐ´ÐµÑ Ñделана ÑезеÑÐ²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð¶ÑÑнала ÑÑанзакÑий.
- Bulk logged (С неполнÑм пÑоÑоколиÑованием). ÐденÑиÑна Full, за иÑклÑÑение: SELECT INTO, BULK INSERT и BCP, INSERT INTO SELECT, опеÑаÑии Ñ Ð¸Ð½Ð´ÐµÐºÑами (CREATE INDEX, ALTER INDEX REBUILD, DROP INDEX)
СиÑÑемнÑе ÐÐ
- master. Ð¥ÑанÑÑÑÑ Ð²Ñе даннÑе ÑиÑÑемного ÑÑÐ¾Ð²Ð½Ñ (конÑигÑÑаÑÐ¸Ñ ÑиÑÑемÑ, ÑведенÑÑ Ð¾Ð± ÑÑеÑнÑÑ Ð·Ð°Ð¿Ð¸ÑÑÑ Ð²Ñ Ð¾Ð´Ð°, инÑоÑмаÑÐ¸Ñ Ð¾Ð±Ð¾ вÑÐµÑ Ð´ÑÑÐ³Ð¸Ñ Ð±Ð°Ð·Ð°Ñ Ð´Ð°Ð½Ð½ÑÑ ) Ð´Ð»Ñ ÑкземплÑÑа SQL Server.
- tempdb. РабоÑее пÑоÑÑÑанÑÑво Ð´Ð»Ñ Ð²ÑеменнÑÑ Ð¾Ð±ÑекÑов, ÑÐ°ÐºÐ¸Ñ ÐºÐ°Ðº глобалÑнÑе или локалÑнÑе вÑеменнÑе ÑаблиÑÑ, вÑеменнÑе Ñ ÑанимÑе пÑоÑедÑÑÑ, ÑаблиÑнÑе пеÑеменнÑе и кÑÑÑоÑÑ. ÐеÑеÑоздаÑÑÑÑ Ð¿Ñи каждом запÑÑке SQL Server.
- model. ÐÑполÑзÑеÑÑÑ Ð² каÑеÑÑве Ñаблона Ð´Ð»Ñ Ð²ÑÐµÑ Ð±Ð°Ð· даннÑÑ , ÑоздаваемÑÑ Ð² ÑкземплÑÑе SQL Server, вÑе ÑодеÑжимое Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ model, вклÑÑÐ°Ñ Ð¿Ð°ÑамеÑÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , копиÑÑеÑÑÑ Ð² ÑоздаваемÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . Так как база даннÑÑ tempdb ÑоздаеÑÑÑ ÐºÐ°Ð¶Ð´Ñй Ñаз пÑи запÑÑке SQL Server, база даннÑÑ model вÑегда должна ÑÑÑеÑÑвоваÑÑ Ð² ÑиÑÑеме SQL Server.
- msdb. ÐÑполÑзÑеÑÑÑ Ð°Ð³ÐµÐ½Ñом SQL Server Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑаÑпиÑÐ°Ð½Ð¸Ñ Ð¿ÑедÑпÑеждений (опеÑаÑоÑ) и вÑполнение заданий, а Ñакже дÑÑгими компоненÑами. SQL Server Ñ ÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð»Ð½Ñй жÑÑнал ÑезеÑвного копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ воÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð² базе даннÑÑ msdb. ÐÐ»Ñ Ð¾ÑпÑавки поÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ð¸ÑполÑзÑеÑÑÑ: USE [msdb].
- resource. ÐоÑÑÑÐ¿Ð½Ð°Ñ ÑолÑко Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ð° даннÑÑ , коÑоÑÐ°Ñ ÑодеÑÐ¶Ð¸Ñ Ð²Ñе ÑиÑÑемнÑе обÑекÑÑ, напÑÐ¸Ð¼ÐµÑ sys.objects, ÑизиÑеÑки Ñ ÑанÑÑÑÑ Ð² базе даннÑÑ resource, но логиÑеÑки пÑиÑÑÑÑÑвÑÑÑ Ð² ÑÑ ÐµÐ¼Ðµ sys каждой Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
РегламенÑнÑе опеÑаÑии
- ÐÑовеÑка ÑелоÑÑноÑÑи Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
DBCC CHECKDB
-
ÐндекÑÑ. ÐндекÑÑ Ð¸ÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ð±ÑÑÑÑого поиÑка даннÑÑ Ð±ÐµÐ· Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи поиÑка/пÑоÑмоÑÑа вÑÐµÑ ÑÑÑок в ÑаблиÑе Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¿Ñи каждом обÑаÑении к ÑаблиÑе Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐÐ½Ð´ÐµÐºÑ ÑÑкоÑÑÐµÑ Ð¿ÑоÑеÑÑ Ð·Ð°Ð¿ÑоÑа, пÑедоÑÑавлÑÑ Ð±ÑÑÑÑÑй доÑÑÑп к ÑÑÑокам даннÑÑ Ð² ÑаблиÑе, аналогиÑно ÑомÑ, как ÑказаÑÐµÐ»Ñ Ð² книге Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ð²Ð°Ð¼ бÑÑÑÑо найÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð¸Ð½ÑоÑмаÑиÑ. ÐндекÑÑ Ð¿ÑедоÑÑавлÑÑÑ Ð¿ÑÑÑ Ð´Ð»Ñ Ð±ÑÑÑÑого поиÑка даннÑÑ Ð½Ð° оÑнове знаÑений в ÑÑÐ¸Ñ ÑÑолбÑÐ°Ñ . ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ индекÑа обÑзаÑелÑно Ñ ÑаниÑÑÑ ÐµÐ³Ð¾ ÑÑаÑиÑÑика. MS SQL Server ÑамоÑÑоÑÑелÑно ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð¸ изменÑÐµÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð¿Ñи ÑабоÑе Ñ Ð±Ð°Ð·Ð¾Ð¹. С ÑеÑением вÑемени даннÑе в индекÑе ÑÑановÑÑÑÑ ÑÑагменÑиÑованнÑми, Ñ.е. ÑазбÑоÑаннÑми по базе даннÑÑ , ÑÑо ÑеÑÑезно ÑÐ½Ð¸Ð¶Ð°ÐµÑ Ð¿ÑоизводиÑелÑноÑÑÑ Ð·Ð°Ð¿ÑоÑов. ÐÑли ÑÑагменÑаÑÐ¸Ñ ÑоÑÑавлÑÐµÑ Ð¾Ñ 5 до 30% (ÑÑандаÑÑно в задании 15%), Ñо ÑекомендÑеÑÑÑ ÐµÐµ ÑÑÑÑаниÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑеоÑганизаÑии, пÑи ÑÑагменÑаÑии вÑÑе 30% (по ÑмолÑÐ°Ð½Ð¸Ñ Ð² задаÑе > 30% ÑÑагменÑаÑии и ÑиÑло ÑÑÑÐ°Ð½Ð¸Ñ > 1000) Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ полное пеÑеÑÑÑоение индекÑов. ÐоÑле пеÑеÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð¾Ð²Ð¾ иÑполÑзÑеÑÑÑ ÑолÑко ÑеоÑганизаÑиÑ.
-
РеоÑганизаÑÐ¸Ñ (Reorganize) или деÑÑагменÑаÑÐ¸Ñ Ð¸Ð½Ð´ÐµÐºÑа â ÑÑо ÑеÑÐ¸Ñ Ð½ÐµÐ±Ð¾Ð»ÑÑÐ¸Ñ Ð»Ð¾ÐºÐ°Ð»ÑнÑÑ Ð¿ÐµÑемеÑений ÑÑÑÐ°Ð½Ð¸Ñ Ñак, ÑÑÐ¾Ð±Ñ Ð¸Ð½Ð´ÐµÐºÑ Ð½Ðµ бÑл ÑÑагменÑиÑован. ÐоÑле ÑеоÑганизаÑии ÑÑаÑиÑÑика не обновлÑеÑÑÑ. Ðо вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑи вÑе даннÑе доÑÑÑпнÑ, полÑзоваÑели ÑмогÑÑ ÑабоÑаÑÑ.
sp_msforeachtable N'DBCC INDEXDEFRAG (<Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
>, ''?'')'
- ÐеÑеÑÑÑоение (Rebuild) индекÑов (или задаÑа в маÑÑеÑе планов обÑлÑживаниÑ: ÐоÑÑÑановиÑÑ Ð¸Ð½Ð´ÐµÐºÑ) запÑÑÐºÐ°ÐµÑ Ð¿ÑоÑеÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов. РвеÑÑии MS SQL Server Standard пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¾ÑклÑÑение вÑÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñов Ð¾Ñ Ð±Ð°Ð·Ñ Ð½Ð° вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑии. ÐоÑле пеÑеÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¾Ð±ÑзаÑелÑно обновлÑеÑÑÑ ÑÑаÑиÑÑика.
sp_msforeachtable N'DBCC DBREINDEX (''?'')'
- Ðбновление ÑÑаÑиÑÑики. СÑаÑиÑÑика â неболÑÑÐ°Ñ ÑаблиÑа (обÑÑно до 200 ÑÑÑок), в коÑоÑой Ñ ÑаниÑÑÑ Ð¾Ð±Ð¾Ð±ÑÐµÐ½Ð½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ Ñом, какие знаÑÐµÐ½Ð¸Ñ Ð¸ как ÑаÑÑо вÑÑÑеÑаÑÑÑÑ Ð² ÑаблиÑе. Ðа оÑновании ÑÑаÑиÑÑики ÑеÑÐ²ÐµÑ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑеÑение, как лÑÑÑе поÑÑÑоиÑÑ Ð·Ð°Ð¿ÑоÑ. Ðогда пÑоиÑÑ Ð¾Ð´ÑÑ Ð·Ð°Ð¿ÑоÑÑ Ðº ÐÐ (напÑимеÑ, SELECT) Ð²Ñ Ð¿Ð¾Ð»ÑÑаеÑе даннÑе, но не опиÑÑваеÑе Ñо, как ÑÑи даннÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¸Ð·Ð²Ð»ÐµÑенÑ. РполÑÑении и обÑабоÑке даннÑÑ Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ ÑÑаÑиÑÑика. Ðо вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑоÑедÑÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑаÑиÑÑики даннÑе не блокиÑÑÑÑÑÑ.
exec sp_msforeachtable N'UPDATE STATISTICS ? WITH FULLSCAN'
- ÐÑиÑÑка пÑоÑедÑÑного кÑÑа, вÑполнÑеÑÑÑ Ð¿Ð¾Ñле Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑаÑиÑÑики. ÐпÑимизаÑÐ¾Ñ MS SQL Server кÑÑиÑÑÐµÑ Ð¿Ð»Ð°Ð½Ñ Ð·Ð°Ð¿ÑоÑов Ð´Ð»Ñ Ð¸Ñ Ð¿Ð¾Ð²ÑоÑного вÑполнениÑ. ÐÑо делаеÑÑÑ Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑкономиÑÑ Ð²ÑемÑ, заÑÑаÑиваемое на компилÑÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑа в Ñом ÑлÑÑае, еÑли Ñакой же запÑÐ¾Ñ Ñже вÑполнÑлÑÑ Ð¸ его план извеÑÑен. ÐоÑле Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ ÑÑаÑиÑÑики, не бÑÐ´ÐµÑ Ð¾ÑиÑен пÑоÑедÑÑнÑй кÑÑ, Ñо SQL Server Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбÑаÑÑ ÑÑаÑÑй (неопÑималÑнÑй) план запÑоÑа из кÑÑа вмеÑÑо Ñого, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÑÑÑоиÑÑ Ð½Ð¾Ð²Ñй (более опÑималÑнÑй) план.
DBCC FREEPROCCACHE
InfluxDB
Download InfluxDB 1.x Open Source InfluxDB-Studio
Install Windows
Invoke-RestMethod "https://dl.influxdata.com/influxdb/releases/influxdb-1.8.10_windows_amd64.zip" -OutFile "$home\Downloads\influxdb-1.8.10_windows_amd64.zip"
Expand-Archive "$home\Downloads\influxdb-1.8.10_windows_amd64.zip" -DestinationPath "$home\Documents\"
Remove-Item "$home\Downloads\influxdb-1.8.10_windows_amd64.zip"
& "$home\Downloads\influxdb-1.8.10-1\influxd.exe"
Install Ubuntu
wget https://dl.influxdata.com/influxdb/releases/influxdb_1.8.10_amd64.deb
sudo dpkg -i influxdb_1.8.10_amd64.deb
systemctl start influxdb
systemctl status influxdb
ps aux | grep influxdb | grep -Ev "grep"
netstat -natpl | grep 80[8-9][3-9]
API
nano /etc/influxdb/influxdb.conf
[http]
enabled = true
bind-address = ":8086"
auth-enabled = false
systemctl restart influxdb
Chronograf
wget https://dl.influxdata.com/chronograf/releases/chronograf-1.10.2_windows_amd64.zip -UseBasicParsing -OutFile chronograf-1.10.2_windows_amd64.zip
Expand-Archive .\chronograf-1.10.2_windows_amd64.zip -DestinationPath 'C:\Program Files\InfluxData\chronograf\'
wget https://dl.influxdata.com/chronograf/releases/chronograf_1.10.2_amd64.deb
sudo dpkg -i chronograf_1.10.2_amd64.deb
systemctl status influxdb
http://192.168.3.102:8888
Grafana
invoke-RestMethod https://dl.grafana.com/enterprise/release/grafana-enterprise-10.3.1.windows-amd64.msi -OutFile "$home\Download\grafana.msi"
apt-get install -y adduser libfontconfig1 musl
wget https://dl.grafana.com/enterprise/release/grafana-enterprise_10.3.1_amd64.deb
dpkg -i grafana-enterprise_10.3.1_amd64.deb
systemctl start grafana-server
systemctl status grafana-server
CLI Client
apt install influxdb-client
influx
influx --host 192.168.3.102 --username admin --password password
$influx_client_exec = "$home\Documents\influxdb-1.8.10-1\influx.exe"
& $influx_client_exec -host 192.168.3.102 -port 8086
help
show databases
use PowerShell
SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m
USERS
SHOW USERS оÑобÑазиÑÑ Ð¿Ð¾Ð»ÑзоваÑелей и иÑ
пÑава доÑÑÑпа
CREATE USER admin WITH PASSWORD 'password' WITH ALL PRIVILEGES ÑоздаÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ
GRANT ALL PRIVILEGES TO "admin" пÑедоÑÑавиÑÑ Ð¿Ñава доÑÑÑпа
GRANT READ ON "database" TO "admin" доÑÑÑп на ÑÑение Ð´Ð»Ñ ÐРили запиÑÑ (WRITE)
REVOKE ALL PRIVILEGES FROM "admin" оÑозваÑÑ Ð¿Ñава доÑÑÑпа
SHOW GRANTS FOR "admin" ÐРи пÑивелегии доÑÑÑпа Ð´Ð»Ñ Ñказанного полÑзоваÑелÑ
SET PASSWORD FOR "admin" = 'new_password' измениÑÑ Ð¿Ð°ÑолÑ
DROP USER "admin" ÑдалиÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ
DATABASE
CREATE DATABASE powershell ÑоздаÑÑ ÐÐ
SHOW DATABASES оÑобÑазиÑÑ ÑпиÑок ÐÐ
DROP DATABASE powershell ÑдалиÑÑ ÐÐ
USE powershell
SHOW measurements оÑобÑазиÑÑ Ð²Ñе ÑаблиÑÑ
INSERT performance,host=console,counter=CPU value=0.88 запиÑаÑÑ Ð´Ð°Ð½Ð½Ñе в ÑаблиÑÑ performance
MEASUREMENT
SHOW TAG KEYS FROM "HardwareMonitor" оÑобÑазиÑÑ Ð²Ñе ÑÑги в ÑаблиÑе
SHOW TAG VALUES FROM "HardwareMonitor" WITH KEY = "HardwareName" оÑобÑазиÑÑ Ð²Ñе знаÑÐµÐ½Ð¸Ñ Ñказанного ÑÑга
SHOW FIELD KEYS FROM "HardwareMonitor" оÑобÑазиÑÑ Ð²Ñе Field Tags и иÑ
Ñип даннÑÑ
SHOW SERIES FROM "HardwareMonitor" оÑобÑазиÑÑ ÑпиÑок вÑеÑ
ÑникалÑнÑÑ
ÑеÑий в Ñказанной ÑаблиÑе. СеÑÐ¸Ñ - ÑÑо Ð½Ð°Ð±Ð¾Ñ ÑоÑек даннÑÑ
, коÑоÑÑе имеÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñе знаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²ÑеÑ
Ñегов, за иÑклÑÑением вÑемени.
DROP SERIES FROM "HardwareMonitor" оÑиÑÑиÑÑ Ð²Ñе даннÑе в ÑаблиÑе
DROP MEASUREMENT "HardwareMonitor" ÑдалиÑÑ ÑаблиÑÑ
SELECT/WHERE
SELECT * FROM performance оÑобÑазиÑÑ Ð²Ñе даннÑе в ÑаблиÑе
SELECT value FROM performance оÑÑилÑÑÑоваÑÑ Ð¿Ð¾ ÑÑолбÑÑ value (ÑолÑко Field Keys)
SELECT * FROM performance limit 10 оÑобÑазиÑÑ 10 ÐµÐ´Ð¸Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
SELECT * FROM performance WHERE time > now() -2d оÑобÑазиÑÑ Ð´Ð°Ð½Ð½Ñе за поÑледние 2 днÑ
SELECT * FROM performance WHERE time > now() +3h -5m даннÑе за поÑледние 5 минÑÑ (+3 ÑаÑа Ð¾Ñ ÑекÑÑего вÑемени по UTC 0 -5 минÑÑ)
SELECT * FROM performance WHERE counter = 'CPU' вÑбоÑка по ÑÑгÑ
SELECT upload/1000 FROM speedtest WHERE upload/1000 <= 250 вÑбоÑка по ÑÑолбÑÑ upload и ÑазделиÑÑ Ð²Ñвод на 1000, вÑвеÑÑи upload менÑÑе 250
DELETE FROM performance WHERE time > now() -1h ÑдалиÑÑ Ð´Ð°Ð½Ð½Ñе за поÑледние 1/4 ÑаÑа
DELETE FROM performance WHERE time < now() -24h ÑдалиÑÑ Ð´Ð°Ð½Ð½Ñе ÑÑаÑÑе 24 ÑаÑов
REGEX
SELECT * FROM "win_pdisk" WHERE instance =~/.*C:/ and time > now() - 5m и
SELECT * FROM "win_pdisk" WHERE instance =~/.*E:/ or instance =~ /.*F:/ или
SELECT * FROM "win_pdisk" WHERE instance !~ /.*Total/ не Ñавно (иÑклÑÑиÑÑ)
SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and HardwareName =~ /Intel/ пÑиблизиÑелÑно Ñавно
SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and HardwareName =~ /Intel.+i7/ ÑÐºÐ²Ð¸Ð²Ð°Ð»ÐµÐ½Ñ 12th_Gen_Intel_Core_i7-1260P
SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and HardwareName =~ /^Intel/ наÑинаеÑÑÑ Ð½Ð° Intel
SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and HardwareName =~ /00$/ заканÑиваеÑÑÑ Ð½Ð° 00
GROUP BY tag_key
SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and SensorName = 'Temperature' GROUP BY HardwareName ÑоздаÑÑ ÑникалÑнÑе гÑÑÐ¿Ð¿Ñ Ð¿Ð¾ ÑÑÐ³Ñ HardwareName
SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and SensorName = 'Temperature' GROUP BY Host,HardwareName болÑÑе гÑÑпп по двÑм ÑÑгаам
Functions(field_key)
SELECT instance,LAST(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance оÑÑилÑÑÑоваÑÑ Ð²Ñвод по поÑледнемÑ/ÑекÑÑÐµÐ¼Ñ Ð·Ð½Ð°ÑениÑ
SELECT instance,FIRST(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance оÑÑилÑÑÑоваÑÑ Ð²Ñвод по пеÑÐ²Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð·Ð° веÑÑ Ð¸Ð»Ð¸ ÑказаннÑй оÑÑезок вÑемени
SELECT instance,MIN(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance оÑÑилÑÑÑоваÑÑ Ð²Ñвод Ñ Ð¾ÑобÑажением минималÑного знаÑениÑ
SELECT instance,MAX(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance оÑÑилÑÑÑоваÑÑ Ð²Ñвод Ñ Ð¾ÑобÑажением макÑималÑного знаÑениÑ
SELECT SUM(Bytes_Received_persec) FROM "win_net" GROUP BY instance ÑÑммаÑ
вÑеÑ
знаÑений
SELECT COUNT(Bytes_Received_persec) FROM "win_net" WHERE Bytes_Received_persec >= 0 GROUP BY instance кол-во даннÑÑ
, где знаÑение вÑÑе или Ñавно 0
SELECT MEAN(Bytes_Received_persec) FROM "win_net" WHERE Bytes_Received_persec < 1000 GROUP BY instance ÑÑеднее знаÑение даннÑÑ
Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ñелем Ð¾Ñ 0 до 1000 (509)
SELECT *,MAX(Value) FROM "HardwareMonitor" WHERE time > now() -1h GROUP BY SensorName,Host ÑоздаÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ð´Ð»Ñ Ð²ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑималÑного знаÑÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑÑобÑа Value каждого ÑÑга SensorName и Ñ
оÑÑа за поÑледний ÑаÑ
SELECT *,MAX(Value) FROM "HardwareMonitor" WHERE time > now() -1h and SensorName = 'CPU_Package' GROUP BY Host маÑималÑное знаÑение CPU_Package за поÑледний ÑÐ°Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñ
оÑÑа
SELECT MEAN(Value) FROM "HardwareMonitor" WHERE time > now() -1h and SensorName = 'CPU_Package' GROUP BY Host ÑÑеднее знаÑение CPU_Package за поÑледний ÑаÑ
POLICY
CREATE DATABASE powershell WITH DURATION 48h REPLICATION 1 NAME "del2d" ÑоздаÑÑ ÐÐ Ñ Ð¿Ð¾Ð»Ð¸Ñикой Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ 2 днÑ
CREATE RETENTION POLICY del2h ON powershell DURATION 2h REPLICATION 1 ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ Ð¿Ð¾Ð»Ð¸ÑÐ¸ÐºÑ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐÐ
CREATE RETENTION POLICY del6h ON powershell DURATION 6h REPLICATION 1 SHARD DURATION 2h ÑказаÑÑ Ð¿ÐµÑиод Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ 6 ÑаÑов + 2 ÑаÑа до оÑиÑÑки (по ÑмолÑÐ°Ð½Ð¸Ñ 1Ñ Ð¸Ð»Ð¸ болÑÑе)
ALTER RETENTION POLICY del6h ON powershell DEFAULT измениÑÑ (ALTER) полиÑÐ¸ÐºÑ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐРна del6h (DEFAULT)
DROP RETENTION POLICY del2d ON powershell Ñдаление полиÑики Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¿ÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº безвозвÑаÑÐ½Ð¾Ð¼Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð²ÑеÑ
измеÑений (ÑаблиÑ) и даннÑÑ
, Ñ
ÑанÑÑиÑ
ÑÑ Ð² полиÑике Ñ
ÑанениÑ
SHOW RETENTION POLICIES ON PowerShell оÑобÑазиÑÑ Ð´ÐµÐ¹ÑÑвÑÑÑие полиÑики Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
PowerShell
$data = Invoke-RestMethod http://192.168.3.102:8086/query?q="SHOW RETENTION POLICIES ON PowerShell"
$col = $data.results.series.columns
$val = $data.results.series.values
$mass = @()
$mass += [string]$col
foreach ($v in $val) {
$mass += [string]$v
}
$mass = $mass -replace '^','"'
$mass = $mass -replace '$','"'
$mass = $mass -replace '\s','","'
$mass | ConvertFrom-Csv
API POST
ÐмеÑÑо ÑÐ°Ð±Ð»Ð¸Ñ Ð² InfluxDB имеÑÑÑÑ Ð¸Ð·Ð¼ÐµÑениÑ. ÐмеÑÑо ÑÑолбÑов в ней еÑÑÑ Ñеги и полÑ.
Table Tag (string/int) Field (double/int) TIMESTAMP
measurement,Tag_Keys1=Tag_Values1,Tag_Keys2=Tag_Values2 Field_Keys1="Values",Field_Keys2="Values" 0000000000000000000
1 2 3
$ip = "192.168.3.104"
$port = "8086"
$db = "powershell"
$table = "speedtest"
$ipp = $ip+":"+$port
$url = "http://$ipp/write?db=$db"
$user = "admin"
$pass = "password" | ConvertTo-SecureString -AsPlainText -Force
$cred = [System.Management.Automation.PSCredential]::new($user,$pass)
$unixtime = (New-TimeSpan -Start (Get-Date "01/01/1970") -End (Get-Date)).TotalSeconds
$timestamp = ([string]$unixtime -replace "\..+") + "000000000"
Invoke-RestMethod -Method POST -Uri $url -Body "$table,host=$(hostname) download=200000,upload=300000,ping=3 $timestamp"
API GET
curl http://192.168.3.104:8086/query --data-urlencode "q=SHOW DATABASES" pwsh7 (ConvertFrom-Json) and bash
$dbs = irm "http://192.168.3.104:8086/query?q=SHOW DATABASES"
$dbs = irm "http://192.168.3.104:8086/query?epoch=ms&u=admin&p=password&q=SHOW DATABASES"
$dbs.results.series.values
$ip = "192.168.3.104"
$port = "8086"
$db = "powershell"
$table = "speedtest"
$query = "SELECT * FROM $table"
$ipp = $ip+":"+$port
$url = "http://$ipp/query?db=$db&q=$query"
$data = Invoke-RestMethod -Method GET -Uri $url` -Credential $cred
$data.results.series.name ` Ð¸Ð¼Ñ ÑаблиÑÑ
$data.results.series.columns` ÑÑолбÑÑ/клÑÑи
$data.results.series.values ` даннÑе поÑÑÑоÑно
Endpoints
$stats = irm http://192.168.3.104:8086/debug/vars` ÑÑаÑиÑÑика ÑеÑвеÑа
$stats."database:powershell".values` кол-во ÑÐ°Ð±Ð»Ð¸Ñ Ðº ÐÐ
$stats.queryExecutor.values` колиÑеÑÑво query-запÑоÑов (обÑаÑений к endpoint /query)
$stats.write.values` колиÑеÑÑво write-запÑоÑов
$stats.system.uptime
http://192.168.3.104:8086/debug/requests кол-во клиенÑÑкиÑ
HTTP-запÑоÑов к конеÑнÑм ÑоÑкам /writeи /query
http://192.168.3.104:8086/debug/pprof
http://192.168.3.104:8086/ping
http://192.168.3.104:8086/query
http://192.168.3.104:8086/write
http://192.168.3.99:8086/api/v2/setup
http://192.168.3.99:8086/api/v2/config
http://192.168.3.99:8086/api/v2/write
PingTo-InfluxDB
while ($true) {
$tz = (Get-TimeZone).BaseUtcOffset.TotalMinutes
$unixtime = (New-TimeSpan -Start (Get-Date "01/01/1970") -End ((Get-Date).AddMinutes(-$tz))).TotalSeconds` -3h UTC
$timestamp = ([string]$unixtime -replace "\..+") + "000000000"
$tnc = tnc 8.8.8.8
$Status = $tnc.PingSucceeded
$RTime = $tnc.PingReplyDetails.RoundtripTime
Invoke-RestMethod -Method POST -Uri "http://192.168.3.104:8086/write?db=powershell" -Body "ping,host=$(hostname) status=$status,rtime=$RTime $timestamp"
sleep 1
}
SELECT * FROM ping WHERE status = false
PerformanceTo-InfluxDB
function ConvertTo-Encoding ([string]$From, [string]$To) {
Begin {
$encFrom = [System.Text.Encoding]::GetEncoding($from)
$encTo = [System.Text.Encoding]::GetEncoding($to)
}
Process {
$bytes = $encTo.GetBytes($_)
$bytes = [System.Text.Encoding]::Convert($encFrom, $encTo, $bytes)
$encTo.GetString($bytes)
}
}
$localization = (Get-Culture).LCID` ÑекÑÑÐ°Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸Ð·Ð°ÑиÑ
if ($localization -eq 1049) {
$performance = "\\$(hostname)\ÐÑоÑеÑÑоÑ(_Total)\% загÑÑженноÑÑи пÑоÑеÑÑоÑа" | ConvertTo-Encoding UTF-8 windows-1251` декодиÑоваÑÑ ÐºÐ¸ÑиллиÑÑ
} else {
$performance = "\Processor(_Total)\% Processor Time"
}
$tz = (Get-TimeZone).BaseUtcOffset.TotalMinutes
while ($true) {
$unixtime = (New-TimeSpan -Start (Get-Date "01/01/1970") -End ((Get-Date).AddMinutes(-$tz))).TotalSeconds` -3h UTC
$timestamp = ([string]$unixtime -replace "\..+") + "000000000"
[double]$value = (Get-Counter $performance).CounterSamples.CookedValue.ToString("0.00").replace(",",".")` окÑÑглиÑÑ Ð² Ñип даннÑÑ
Double
Invoke-RestMethod -Method POST -Uri "http://192.168.3.104:8086/write?db=powershell" -Body "performance,host=$(hostname),counter=CPU value=$value $timestamp"
sleep 5
}
Service
$powershell_Path = (Get-Command powershell).Source
$NSSM_Path = "C:\NSSM\NSSM-2.24.exe"
$Script_Path = "C:\NSSM\PerformanceTo-InfluxDB.ps1"
$Service_Name = "PerformanceTo-InfluxDB"
& $NSSM_Path install $Service_Name $powershell_Path -ExecutionPolicy Bypass -NoProfile -f $Script_Path
Get-Service $Service_Name | Start-Service
Get-Service $Service_Name | Set-Service -StartupType Automatic
Telegraf
iwr https://dl.influxdata.com/telegraf/releases/telegraf-1.27.1_windows_amd64.zip -UseBasicParsing -OutFile telegraf-1.27.1_windows_amd64.zip
Expand-Archive .\telegraf-1.27.1_windows_amd64.zip -DestinationPath "C:\Telegraf"
rm telegraf-1.27.1_windows_amd64.zip
cd C:\Telegraf
.\telegraf.exe -sample-config --input-filter cpu:mem:dns_query --output-filter influxdb > telegraf_nt.conf ÑоздаÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ Ñ Ð²ÑбаÑннÑми плагинами Ð´Ð»Ñ ÑбоÑа меÑÑик
Start-Process notepad++ C:\Telegraf\telegraf_nt.conf
[[outputs.influxdb]]
urls = ["http://192.168.3.104:8086"]
database = "telegraf_nt"
username = "user"
password = "pass"
[[inputs.cpu]]
percpu = false
totalcpu = true
[[inputs.dns_query]]
servers = ["8.8.8.8"]
network = "udp"
domains = ["."]
record_type = "A"
port = 53
timeout = "2s"
.\telegraf.exe --test -config C:\Telegraf\telegraf_nt.conf ÑеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии (полÑÑÐµÐ½Ð¸Ñ Ð¼ÐµÑÑик Ñ Ð²Ñводом в конÑолÑ)
C:\Telegraf\telegraf.exe -config C:\Telegraf\telegraf_nt.conf запÑÑÑиÑÑ telegraf (ÑеÑÑ Ð¾ÑпÑавки даннÑÑ
)
.\telegraf.exe --config "C:\Telegraf\telegraf_nt.conf" --service install ÑоздаÑÑ ÑлÑжбÑ
Get-Service telegraf | Start-Service
.\telegraf.exe --service uninstall
USE telegraf
SELECT usage_idle,usage_system,usage_user FROM cpu
Elasticsearch
Install-Module -Name Elastic.Console -AllowPrerelease github source
Get-Command -Module Elastic.Console
Get-ElasticsearchVersion
Set-ElasticsearchVersion 7.3.0
Invoke-Elasticsearch REST API запÑоÑÑ
CData
PowerShell Gallery CData
Automate Elasticsearch Integration Tasks from PowerShell
Install-Module ElasticsearchCmdlets Ð¿Ð°ÐºÐµÑ Ð´ÑайвеÑа в psgallery
Import-Module ElasticsearchCmdlets
Get-Command -Module ElasticsearchCmdlets
$elasticsearch = Connect-Elasticsearch -Server "$Server" -Port "$Port" -User "$User" -Password "$Password"
$shipcity = "New York"
$orders = Select-Elasticsearch -Connection $elasticsearch -Table "Orders" -Where "ShipCity = `'$ShipCity`'"` поиÑк и полÑÑение даннÑÑ
$orders = Invoke-Elasticsearch -Connection $elasticsearch -Query 'SELECT * FROM Orders WHERE ShipCity = @ShipCity' -Params @{'@ShipCity'='New York'}` SQL запÑоÑÑ
ADO.NET Assembly
Install-Package CData.Elasticsearch Ð¿Ð°ÐºÐµÑ Ð´ÑайвеÑа в nuget
[Reflection.Assembly]::LoadFile("C:\Program Files\PackageManagement\NuGet\Packages\CData.Elasticsearch.23.0.8565\lib\net40\System.Data.CData.Elasticsearch.dll")
$connect = New-Object System.Data.CData.Elasticsearch.ElasticsearchConnection("Server=127.0.0.1;Port=9200;User=admin;Password=123456;")
$connect.Open()
$sql = "SELECT OrderName, Freight from Orders"
$da = New-Object System.Data.CData.Elasticsearch.ElasticsearchDataAdapter($sql, $conn)
$dt = New-Object System.Data.DataTable
$da.Fill($dt)
$dt.Rows | foreach {
Write-Host $_.ordername $_.freight
}
UPDATE
Update-Elasticsearch -Connection $Elasticsearch -Columns @('OrderName','Freight') -Values @('MyOrderName', 'MyFreight') -Table Orders -Id "MyId"
$cmd = New-Object System.Data.CData.Elasticsearch.ElasticsearchCommand("UPDATE Orders SET ShipCity='New York' WHERE Id = @myId", $conn)
$cmd.Parameters.Add(new System.Data.CData.Elasticsearch.ElasticsearchParameter("@myId","10456255-0015501366"))
$cmd.ExecuteNonQuery()
INSERT
Add-Elasticsearch -Connection $Elasticsearch -Table Orders -Columns @("OrderName", "Freight") -Values @("MyOrderName", "MyFreight")
$cmd = New-Object System.Data.CData.Elasticsearch.ElasticsearchCommand("INSERT INTO Orders (ShipCity) VALUES (@myShipCity)", $conn)
$cmd.Parameters.Add(new System.Data.CData.Elasticsearch.ElasticsearchParameter("@myShipCity","New York"))
$cmd.ExecuteNonQuery()
DELETE
Remove-Elasticsearch -Connection $Elasticsearch -Table "Orders" -Id "MyId"
$cmd = New-Object System.Data.CData.Elasticsearch.ElasticsearchCommand("DELETE FROM Orders WHERE Id=@myId", $conn)
$cmd.Parameters.Add(new System.Data.CData.Elasticsearch.ElasticsearchParameter("@myId","001d000000YBRseAAH"))
$cmd.ExecuteNonQuery()
ODBC
Get-Command -Module Wdac
Get-OdbcDriver | ft ÑпиÑок ÑÑÑановленнÑÑ
дÑайвеÑов
$connectstring = "DSN=Local Elasticsearch;"
$sql = "SELECT * FROM library"
$conn = New-Object System.Data.Odbc.OdbcConnection($connectstring)
$conn.open()
$cmd = New-Object system.Data.Odbc.OdbcCommand($sql,$conn)
$da = New-Object system.Data.Odbc.OdbcDataAdapter($cmd)
$dt = New-Object system.Data.datatable
$null = $da.fill($dt)
$conn.close()
$dt
PostgreSQL
СкаÑаÑÑ Ð¸ ÑÑÑановиÑÑ Ð´ÑайвеÑ
$dbServer = "192.168.3.101"
$port = "5432"
$dbName = "test"
$dbUser = "admin"
$dbPass = "admin"
$szConnect = "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=$port;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;"
$cnDB = New-Object System.Data.Odbc.OdbcConnection($szConnect)
$dsDB = New-Object System.Data.DataSet
try {
$cnDB.Open()
$adDB = New-Object System.Data.Odbc.OdbcDataAdapter
$adDB.SelectCommand = New-Object System.Data.Odbc.OdbcCommand("SELECT id, name, age, login FROM public.users" , $cnDB)
$adDB.Fill($dsDB)
$cnDB.Close()
}
catch [System.Data.Odbc.OdbcException] {
$_.Exception
$_.Exception.Message
$_.Exception.ItemName
}
foreach ($row in $dsDB[0].Tables[0].Rows) {
$row.login
$row.age
}
WMI
WMI/CIM (Windows Management Instrumentation/Common Information Model)
Get-WmiObjec -ComputerName localhost -Namespace root -class "__NAMESPACE" | select name,__namespace оÑобÑазиÑÑ Ð´Ð¾ÑеÑнии Namespace (логиÑеÑкие иеÑаÑÑ
иÑеÑкие гÑÑппÑ)
Get-WmiObject -List оÑобÑазиÑÑ Ð²Ñе клаÑÑÑ Ð¿ÑоÑÑÑанÑÑва имен "root\cimv2" (по ÑмолÑаниÑ), ÑвойÑÑва (опиÑÑваÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ Ð¸ ÑекÑÑее ÑоÑÑоÑние ÑпÑавлÑемого ÑеÑÑÑÑа) и иÑ
меÑÐ¾Ð´Ñ (какие дейÑÑÐ²Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð²ÑполниÑÑ Ð½Ð°Ð´ ÑÑим ÑеÑÑÑÑом)
Get-WmiObject -List | Where-Object {$_.name -match "video"} поиÑк клаÑÑа по имени, его ÑвойÑÑв и меÑодов
Get-WmiObject -ComputerName localhost -Class Win32_VideoController оÑобÑазиÑÑ ÑодеÑжимое ÑвойÑÑв клаÑÑа
gwmi -List | where name -match "service" | ft -auto еÑли в ÑаблиÑе пÑиÑÑÑÑÑвÑÑÑ Methods, Ñо можно взаимодейÑÑвоваÑÑ {StartService, StopService}
gwmi -Class win32_service | select * оÑобÑазиÑÑ ÑпиÑок вÑеÑ
ÑлÑжб и вÑеÑ
иÑ
ÑвойÑÑв
Get-CimInstance Win32_service обÑаÑаеÑÑÑ Ð½Ð° пÑÑмÑÑ Ðº "root\cimv2"
gwmi win32_service -Filter "name='Zabbix Agent'" оÑÑилÑÑÑоваÑÑ Ð²Ñвод по имени
(gwmi win32_service -Filter "name='Zabbix Agent'").State оÑобÑазиÑÑ ÐºÐ¾Ð½ÐºÑеÑное ÑвойÑÑво
gwmi win32_service -Filter "State = 'Running'" оÑÑилÑÑÑоваÑÑ Ð·Ð°Ð¿ÑÑеннÑе ÑлÑжбÑ
gwmi win32_service -Filter "StartMode = 'Auto'" оÑÑилÑÑÑоваÑÑ ÑлÑÐ¶Ð±Ñ Ð¿Ð¾ меÑÐ¾Ð´Ñ Ð·Ð°Ð¿ÑÑка
gwmi -Query 'select * from win32_service where startmode="Auto"' WQL-запÑÐ¾Ñ (WMI Query Language)
gwmi win32_service | Get-Member -MemberType Method оÑобÑазиÑÑ Ð²Ñе меÑÐ¾Ð´Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ñ Ð¾Ð¿Ð¸Ñание пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (Delete, StartService)
(gwmi win32_service -Filter 'name="Zabbix Agent"').Delete() ÑдалиÑÑ ÑлÑжбÑ
(gwmi win32_service -Filter 'name="MSSQL$MSSQLE"').StartService() запÑÑÑиÑÑ ÑлÑжбÑ
Get-CimInstance -ComputerName $srv Win32_OperatingSystem | select LastBootUpTime вÑÐµÐ¼Ñ Ð¿Ð¾Ñледнего вклÑÑениÑ
gwmi -ComputerName $srv -Class Win32_OperatingSystem | select LocalDateTime,LastBootUpTime ÑекÑÑее вÑÐµÐ¼Ñ Ð¸ вÑÐµÐ¼Ñ Ð¿Ð¾Ñледнего вклÑÑениÑ
gwmi Win32_OperatingSystem | Get-Member -MemberType Method меÑÐ¾Ð´Ñ reboot и shutdown
(gwmi Win32_OperatingSystem -EnableAllPrivileges).Reboot() иÑполÑзÑеÑÑÑ Ñ ÐºÐ»ÑÑем повÑÑÐµÐ½Ð¸Ñ Ð¿Ñивелегий
(gwmi Win32_OperatingSystem -EnableAllPrivileges).Win32Shutdown(0) завеÑÑение ÑеанÑа полÑзоваÑелÑ
$system = Get-WmiObject -Class Win32_OperatingSystem
$InstallDate = [Management.ManagementDateTimeconverter]::ToDateTime($system.installdate)` ÐолÑÑаем даÑÑ ÑÑÑановки ÐС
$AfterInstallDays = ((Get-Date) â $Installdate).Days` ÐÑÑиÑлÑем вÑемÑ, пÑоÑедÑее Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа ÑÑÑановки
$ShortInstallDate = "{0:yyyy-MM-dd HH:MM}" -f ($InstallDate)
"СиÑÑема ÑÑÑановлена: $ShortInstallDate (ÐÑоÑло $AfterInstalldays дней)"
(Get-WmiObject win32_battery).estimatedChargeRemaining заÑÑд баÑаÑеи в пÑоÑенÑаÑ
gwmi Win32_UserAccount доменнÑе полÑзоваÑели
(gwmi Win32_SystemUsers).PartComponent
Get-CimInstance -ClassName Win32_LogonSession
Get-CimInstance -ClassName Win32_BIOS
gwmi -list -Namespace root\CIMV2\Terminalservices
(gwmi -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).AllowTSConnections
(gwmi -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).SetAllowTSConnections(1) вклÑÑиÑÑ RDP
$srv = "localhost"
gwmi Win32_logicalDisk -ComputerName $srv | where {$_.Size -ne $null} | select @{
Label="Value"; Expression={$_.DeviceID}}, @{Label="AllSize"; Expression={
[string]([int]($_.Size/1Gb))+" GB"}},@{Label="FreeSize"; Expression={
[string]([int]($_.FreeSpace/1Gb))+" GB"}}, @{Label="Free%"; Expression={
[string]([int]($_.FreeSpace/$_.Size*100))+" %"}}
NLA (Network Level Authentication)
(gwmi -class "Win32_TSGeneralSetting" -Namespace root\cimv2\Terminalservices -Filter "TerminalName='RDP-tcp'").UserAuthenticationRequired
(gwmi -class "Win32_TSGeneralSetting" -Namespace root\cimv2\Terminalservices -Filter "TerminalName='RDP-tcp'").SetUserAuthenticationRequired(1) вклÑÑиÑÑ NLA
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name SecurityLayer оÑобÑазиÑÑ Ð·Ð½Ð°Ñение (2)
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name UserAuthentication оÑобÑазиÑÑ Ð·Ð½Ð°Ñение (1)
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name SecurityLayer -Value 0 измениÑÑ Ð·Ð½Ð°Ñение
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name UserAuthentication -Value 0
REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters /v AllowEncryptionOracle /t REG_DWORD /d 2 оÑклÑÑиÑÑ Ð½Ð° клиенÑÑком компÑÑÑеÑе пÑовеÑÐºÑ Ð²ÐµÑÑии CredSSP, еÑли на Ñелевом комÑÑÑеÑе-ÑеÑвеÑе не ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ KB4512509 Ð¾Ñ Ð¼Ð°Ñ 2018 года
Regedit
Get-PSDrive ÑпиÑок вÑеÑ
доÑÑÑпнÑÑ
диÑков/Ñазделов, иÑ
ÑÐ°Ð·Ð¼ÐµÑ Ð¸ веÑок ÑееÑÑÑа
cd HKLM:\ HKEY_LOCAL_MACHINE
cd HKCU:\ HKEY_CURRENT_USER
Get-Item полÑÑиÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ веÑке ÑееÑÑÑа
New-Item ÑоздаÑÑ Ð½Ð¾Ð²Ñй Ñаздел ÑееÑÑÑа
Remove-Item ÑдалиÑÑ Ð²ÐµÑÐºÑ ÑееÑÑÑа
Get-ItemProperty полÑÑиÑÑ Ð·Ð½Ð°Ñение клÑÑей/паÑамеÑÑов ÑееÑÑÑа (ÑÑо ÑвойÑÑва веÑки ÑееÑÑÑа, аналогиÑно ÑвойÑÑвам Ñайла)
Set-ItemProperty измениÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ или знаÑение паÑамеÑÑа ÑееÑÑÑа
New-ItemProperty ÑоздаÑÑ Ð¿Ð°ÑамеÑÑ ÑееÑÑÑа
Remove-ItemProperty ÑдалиÑÑ Ð¿Ð°ÑамеÑÑ
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select DisplayName ÑпиÑок ÑÑÑановленнÑÑ
пÑогÑамм
Get-Item HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002 поÑмоÑÑеÑÑ ÑодеÑжимое Items
(Get-ItemProperty HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002)."New Signature" оÑобÑазиÑÑ Ð·Ð½Ð°Ñение (Value) ÑвойÑÑва (Property) Items
$reg_path = "HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002"
$sig_name = "auto"
Set-ItemProperty -Path $reg_path -Name "New Signature" -Value $sig_name измениÑÑ Ð¸Ð»Ð¸ добавиÑÑ Ð² коÑне веÑки (Path) ÑвойÑÑво (Name) Ñо знаÑением (Value)
Set-ItemProperty -Path $reg_path -Name "Reply-Forward Signature" -Value $sig_name
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\taskmgr.exe]
"Debugger"="\"C:\\Windows\\System32\\Taskmgr.exe\""
Performance
lodctr /R пеÑеÑоздаÑÑ ÑÑеÑÑиков пÑоизводиÑелÑноÑÑи из ÑиÑÑемного Ñ
ÑанилиÑа аÑÑ
ивов (Ñак же иÑпÑавлÑÐµÑ ÑÑеÑÑики Ð´Ð»Ñ CIM, напÑимеÑ, Ð´Ð»Ñ cpu Win32_PerfFormattedData_PerfOS_Processor и iops Win32_PerfFormattedData_PerfDisk_PhysicalDisk)
(Get-Counter -ListSet *).CounterSetName вÑвеÑÑи ÑпиÑок вÑеÑ
доÑÑÑпнÑÑ
ÑÑеÑÑиков пÑоизводиÑелÑноÑÑи в ÑиÑÑеме
(Get-Counter -ListSet *memory*).Counter поиÑк по wildcard-имени во вÑеÑ
ÑÑеÑÑикаÑ
(вклÑÑÐ°Ñ Ð´Ð¾ÑеÑнии)
Get-Counter "\Memory\Available MBytes" обÑем Ñвободной опеÑаÑивной памÑÑи
Get-Counter -cn $srv "\LogicalDisk(*)\% Free Space" % Ñвободного меÑÑа на вÑеÑ
ÑазделаÑ
диÑков
(Get-Counter "\Process(*)\ID Process").CounterSamples
Get-Counter "\Processor(_Total)\% Processor Time" âComputerName $srv -MaxSamples 5 -SampleInterval 2 5 пÑовеÑок каждÑе 2 ÑекÑндÑ
Get-Counter "\ÐÑоÑеÑÑоÑ(_Total)\% загÑÑженноÑÑи пÑоÑеÑÑоÑа" -Continuous непÑеÑÑвно
(Get-Counter "\ÐÑоÑеÑÑоÑ(*)\% загÑÑженноÑÑи пÑоÑеÑÑоÑа").CounterSamples
(Get-Counter -ListSet *инÑеÑÑейÑ*).Counter найÑи вÑе ÑÑеÑÑики
Get-Counter "\СеÑевой инÑеÑÑейÑ(*)\ÐÑего байÑ/Ñ" оÑобÑазиÑÑ Ð²Ñе адапÑеÑÑ (вÑбÑаÑÑ Ð´ÐµÐ¹ÑÑвÑÑÑий по ÑÑаÑикÑ)
$WARNING = 25
$CRITICAL = 50
$TransferRate = ((Get-Counter "\\huawei-mb-x-pro\ÑеÑевой инÑеÑÑейÑ(intel[r] wi-fi 6e ax211 160mhz)\вÑего байÑ/Ñ"
).countersamples | select -ExpandProperty CookedValue)*8
$NetworkUtilisation = [math]::round($TransferRate/1000000000*100,2)
if ($NetworkUtilisation -gt $CRITICAL){
Write-Output "CRITICAL: $($NetworkUtilisation) % Network utilisation, $($TransferRate.ToString('N0')) b/s"
#exit 2
}
if ($NetworkUtilisation -gt $WARNING){
Write-Output "WARNING: $($NetworkUtilisation) % Network utilisation, $($TransferRate.ToString('N0')) b/s"
#exit 1
}
Write-Output "OK: $($NetworkUtilisation) % Network utilisation, $($TransferRate.ToString('N0')) b/s"
#exit 0
SNMP
Setup SNMP Service
Install-WindowsFeature SNMP-Service,SNMP-WMI-Provider -IncludeManagementTools ÑÑÑановиÑÑ ÑÐ¾Ð»Ñ SNMP и WMI пÑÐ¾Ð²Ð°Ð¹Ð´ÐµÑ ÑеÑез Server Manager
Get-WindowsFeature SNMP*
Add-WindowsCapability -Online -Name SNMP.Client~~~~0.0.1.0 ÑÑÑановиÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Feature On Demand Ð´Ð»Ñ Windows 10/11\Get-Service SNMP*\Get-NetFirewallrule -DisplayName snmp | ft\Get-NetFirewallrule -DisplayName snmp | Enable-NetFirewallRule`
Setting SNMP Service via Regedit
Agent:
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\RFC1156Agent" -Name "sysContact" -Value "lifailon-user" ÑоздаÑÑ (New) или измениÑÑ (Set)
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\RFC1156Agent" -Name "sysLocation" -Value "plex-server"
Security:
New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\public" ÑоздаÑÑ Ð½Ð¾Ð²Ñй community string
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\ValidCommunities" -Name "public" -Value 16 назнаÑиÑÑ Ð¿Ñава на public
1 â NONE
2 â NOTIFY позволÑÐµÑ Ð¿Ð¾Ð»ÑÑаÑÑ SNMP ловÑÑки
4 â READ ONLY позволÑÐµÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð´Ð°Ð½Ð½Ñе Ñ ÑÑÑÑойÑÑва
8 â READ WRITE позволÑÐµÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð´Ð°Ð½Ð½Ñе и изменÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ ÑÑÑÑойÑÑва
16 â READ CREATE позволÑÐµÑ ÑиÑаÑÑ Ð´Ð°Ð½Ð½Ñе, изменÑÑÑ Ð¸ ÑоздаваÑÑ Ð¾Ð±ÑекÑÑ
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\PermittedManagers" -Name "1" -Value "192.168.3.99" Ð¾Ñ ÐºÐ¾Ð³Ð¾ ÑазÑеÑено пÑинимаÑÑ Ð·Ð°Ð¿ÑоÑÑ
Get-Service SNMP | Restart-Service
snmpwalk
snmpwalk -v 2c -c public 192.168.3.100
snmpwalk -v 2c -c public -O e 192.168.3.100
SNMP Modules
Install-Module -Name SNMP
Get-SnmpData -IP 192.168.3.100 -OID 1.3.6.1.2.1.1.4.0 -UDPport 161 -Community public
(Get-SnmpData -IP 192.168.3.100 -OID 1.3.6.1.2.1.1.4.0).Data
Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.1 пÑойÑиÑÑ Ð¿Ð¾ деÑÐµÐ²Ñ OID
Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.25.6.3.1.2 ÑпиÑок ÑÑÑановленного ÐÐ
Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.25.2.3.1 ÑпиÑок Ñазделов и памÑÑи (C: D: Virtual Memory и Physical Memory)
Set-SnmpData изменение даннÑÑ
на Ñдаленном ÑÑÑÑойÑÑве
Install-Module -Name SNMPv3
Invoke-SNMPv3Get полÑÑение даннÑÑ
по Ð¾Ð´Ð½Ð¾Ð¼Ñ OID
Invoke-SNMPv3Set изменение даннÑÑ
Invoke-SNMPv3Walk обÑ
од по деÑÐµÐ²Ñ OID
Invoke-SNMPv3Walk -UserName lifailon -Target 192.168.3.100 -AuthSecret password -PrivSecret password -OID 1.3.6.1.2.1.1 -AuthType MD5 -PrivType AES128
Lextm.SharpSnmpLib
СинÑакÑиÑ
Download lib
Add-Type -LiteralPath "$home\Desktop\lextm.sharpsnmplib-12.5.2\net471\SharpSnmpLib.dll"
$port = 161
$OID = "1.3.6.1.2.1.1.4.0"
$variableList = New-Object Collections.Generic.List[Lextm.SharpSnmpLib.Variable]
$variableList.Add([Lextm.SharpSnmpLib.Variable]::new([Lextm.SharpSnmpLib.ObjectIdentifier]::new($OID)))
$timeout = 3000
[Net.IPAddress]$ip = "192.168.3.100"
$endpoint = New-Object Net.IpEndPoint $ip, $port
$Community = "public"
[Lextm.SharpSnmpLib.VersionCode]$Version = "V2"
$message = [Lextm.SharpSnmpLib.Messaging.Messenger]::Get(
$Version,
$endpoint,
$Community,
$variableList,
$TimeOut
)
$message.Data.ToString()
Walk
[Lextm.SharpSnmpLib.ObjectIdentifier]$OID = "1.3.6.1.2.1.1" # деÑево или конеÑнÑй OID
$WalkMode = [Lextm.SharpSnmpLib.Messaging.WalkMode]::WithinSubtree # Ñежим обÑ
ода по деÑевÑ
$results = New-Object Collections.Generic.List[Lextm.SharpSnmpLib.Variable]
$message = [Lextm.SharpSnmpLib.Messaging.Messenger]::Walk(
$Version,
$endpoint,
$Community,
$OID,
$results,
$TimeOut,
$WalkMode
)
$results
$results2 = @()
foreach ($d in $results) {
$results2 +=[PSCustomObject]@{'ID'=$d.id.ToString();'Data'=$d.Data.ToString()} # пеÑекодиÑоваÑÑ Ð²Ñвод поÑÑÑоÑно в ÑÑÑокÑ
}
$results2
Zabbix
Zabbix Agent Deploy
$url = "https://cdn.zabbix.com/zabbix/binaries/stable/6.4/6.4.5/zabbix_agent2-6.4.5-windows-amd64-static.zip"
$path = "$home\Downloads\zabbix-agent2-6.4.5.zip"
$WebClient = New-Object System.Net.WebClient
$WebClient.DownloadFile($url, $path)` ÑкаÑаÑÑ Ñайл
Expand-Archive $path -DestinationPath "C:\zabbix-agent2-6.4.5\"` ÑазаÑÑ
ивиÑоваÑÑ
Remove-Item $path` ÑдалиÑÑ Ð°ÑÑ
ив
New-NetFirewallRule -DisplayName "Zabbix-Agent" -Profile Any -Direction Inbound -Action Allow -Protocol TCP -LocalPort 10050,10051` оÑкÑÑÑÑ Ð¿Ð¾ÑÑÑ Ð² FW
$Zabbix_Server = "192.168.3.102"
$conf = "C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.conf"
$cat = cat $conf
$rep = $cat -replace "Server=.+","Server=$Zabbix_Server"
$rep | Select-String Server=
$rep > $conf
$exe = "C:\zabbix-agent2-6.4.5\bin\zabbix_agent2.exe"
.$exe --config $conf --install` ÑÑÑановиÑÑ ÑлÑжбÑ
Get-Service *Zabbix*Agent* | Start-Service` запÑÑÑиÑÑ ÑлÑжбÑ
#.$exe --config $conf --uninstall` ÑдалиÑÑ ÑлÑжбÑ
zabbix_sender
СоздаÑÑ host - задаÑÑ Ð¿ÑоизволÑное Ð¸Ð¼Ñ (powershell-host) и добавиÑÑ Ð² гÑÑппÑ
СоздаÑÑ Items:
Name: Service Count
Type: Zabbix trapper
Key: service.count
Type of Information: Numeric
$path = "C:\zabbix-agent2-6.4.5\bin"
$scount = (Get-Service).Count
.$path\zabbix_sender.exe -z 192.168.3.102 -s "powershell-host" -k service.count -o $scount
zabbix_get
apt install zabbix-get
nano /etc/zabbix/zabbix_agentd.conf
Server=127.0.0.1,192.168.3.102,192.168.3.99 добавиÑÑ ÑеÑвеÑа Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
zabbix_get Ñ Ð°Ð³ÐµÐ½Ñа (как иÑ
запÑаÑÐ¸Ð²Ð°ÐµÑ ÑеÑвеÑ)
.$path\zabbix_get -s 192.168.3.101 -p 10050 -k agent.version пÑовеÑиÑÑ Ð²ÐµÑÑÐ¸Ñ Ð°Ð³ÐµÐ½Ñа
.$path\zabbix_get -s 192.168.3.101 -p 10050 -k agent.ping 1 - ok
.$path\zabbix_get -s 192.168.3.101 -p 10050 -k net.if.discovery ÑпиÑок ÑеÑевÑÑ
инÑеÑÑейÑов
.$path\zabbix_get -s 192.168.3.101 -p 10050 -k net.if.in["ens33"]
.$path\zabbix_get -s 192.168.3.101 -p 10050 -k net.if.out["ens33"]
UserParameter
UserParameter=process.count,powershell -Command "(Get-Process).Count"
UserParameter=process.vm[*],powershell -Command "(Get-Process $1).ws"
Test:
C:\zabbix-agent2-6.4.5\bin\zabbix_get.exe -s 127.0.0.1 -p 10050 -k process.count
C:\zabbix-agent2-6.4.5\bin\zabbix_get.exe -s 127.0.0.1 -p 10050 -k process.vm[zabbix_agent2]
C:\zabbix-agent2-6.4.5\bin\zabbix_get.exe -s 127.0.0.1 -p 10050 -k process.vm[powershell]
СоздаÑÑ Ð½Ð¾Ð²Ñе Items:
key: process.count
key: process.vm[zabbix_agent2]
Include
-
ÐобавиÑÑ Ð¿Ð°ÑамеÑÑ Include Ð´Ð»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑигÑÑаÑионнÑÑ Ñайлов подклÑÑаемÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð²
'Include=.\zabbix_agent2.d\plugins.d\*.conf' >> C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.conf -
СоздаÑÑ ÐºÐ¾Ð½ÑигÑÑаÑионнÑй Ñайл Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑкими паÑамеÑÑами в каÑалоге, пÑÑÑ Ðº коÑоÑÐ¾Ð¼Ñ Ñказан в zabbix_agentd.conf
'UserParameter=Get-Query-Param[*],powershell.exe -noprofile -executionpolicy bypass -File C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.d\scripts\User-Sessions\Get-Query-Param.ps1 $1' > C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.d\plugins.d\User-Sessions.conf -
ÐомеÑÑиÑÑ ÑкÑÐ¸Ð¿Ñ Get-Query-Param.ps1 в каÑалог, пÑÑÑ Ðº коÑоÑÐ¾Ð¼Ñ Ñказан в User-Sessions.conf. СкÑÐ¸Ð¿Ñ ÑодеÑжим полÑзоваÑелÑÑкие паÑамеÑÑÑ, коÑоÑÑе он пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ñ Zabbix ÑеÑвеÑа Ð´Ð»Ñ Ð¿ÐµÑедаÑи Ð¸Ñ Ð² ÑÑнкÑии ÑкÑипÑа.
Param([string]$select)
if ($select -eq "ACTIVEUSER") {
(Get-Query | where status -match "Active").User
}
if ($select -eq "INACTIVEUSER") {
(Get-Query | where status -match "Disconnect").User
}
if ($select -eq "ACTIVECOUNT") {
(Get-Query | where status -match "Active").Status.Count
}
if ($select -eq "INACTIVECOUNT") {
(Get-Query | where status -match "Disconnect").Status.Count
}
- ÐÑовеÑиÑÑ ÑабоÑÑ ÑкÑипÑа:
$path = "C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.d\scripts\User-Sessions"
.$path\Get-Query-Param.ps1 ACTIVEUSER
.$path\Get-Query-Param.ps1 INACTIVEUSER
.$path\Get-Query-Param.ps1 ACTIVECOUNT
.$path\Get-Query-Param.ps1 INACTIVECOUNT
- СоздаÑÑ Items Ñ ÐºÐ»ÑÑами:
Get-Query-Param[ACTIVEUSER] Type: Text
Get-Query-Param[INACTIVEUSER] Type: Text
Get-Query-Param[ACTIVECOUNT] Type: Int
Get-Query-Param[INACTIVECOUNT] Type: Int
- ÐакÑоÑÑ:
{$ACTIVEMAX} = 16
{$ACTIVEMIN} = 0
- ТÑиггеÑÑ:
last(/Windows-User-Sessions/Get-Query-Param[ACTIVECOUNT])>{$ACTIVEMAX}
min(/Windows-User-Sessions/Get-Query-Param[ACTIVECOUNT],24h)={$ACTIVEMIN}
zabbix_agent2.conf
# ÐÐ³ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ Ð² паÑÑивном (ÑеÑÐ²ÐµÑ Ð·Ð°Ð±Ð¸ÑÐ°ÐµÑ Ñам инÑоÑмаÑиÑ) и акÑивном Ñежиме (Ð°Ð³ÐµÐ½Ñ Ñам оÑпÑавлÑеÑ):
Server=192.168.3.102
ServerActive=192.168.3.102
# ТÑебÑеÑÑÑ ÑказаÑÑ hostname Ð´Ð»Ñ ServerActive:
Hostname=huawei-book-01
# ÐÑли не Ñказано, иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑаÑии имени Ñ
оÑÑа (игноÑиÑÑеÑÑÑ, еÑли Ð¸Ð¼Ñ Ñ
оÑÑа опÑеделено):
# HostnameItem=system.hostname
# Ðак ÑаÑÑо обновлÑеÑÑÑ ÑпиÑок акÑивнÑÑ
пÑовеÑок, в ÑекÑндаÑ
(Range: 60-3600):
RefreshActiveChecks=120
# IP-адÑÐµÑ Ð¸ÑÑоÑника Ð´Ð»Ñ Ð¸ÑÑ
одÑÑиÑ
Ñоединений:
# SourceIP=
# ÐÐ³ÐµÐ½Ñ Ð±ÑÐ´ÐµÑ ÑлÑÑаÑÑ Ð½Ð° ÑÑом поÑÑÑ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ ÑеÑвеÑом (Range: 1024-32767):
# ListenPort=10050
# СпиÑок IP-адÑеÑов, коÑоÑÑе Ð°Ð³ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ пÑоÑлÑÑиваÑÑ ÑеÑез запÑÑÑÑ
# ListenIP=0.0.0.0
# ÐÐ³ÐµÐ½Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑоÑлÑÑиваÑÑ ÑÑÐ¾Ñ Ð¿Ð¾ÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов ÑÑаÑÑÑа HTTP (Range: 1024-32767):
# StatusPort=
ControlSocket=\\.\pipe\agent.sock
# ÐÑда веÑÑи жÑÑнал (file/syslog/console):
LogType=file
LogFile=C:\zabbix-agent2-6.4.5\zabbix_agent2.log
# Ð Ð°Ð·Ð¼ÐµÑ Ð»Ð¾Ð³Ð° Ð¾Ñ 0-1024 MB (0 - оÑклÑÑиÑÑ Ð°Ð²ÑомаÑиÑеÑкÑÑ ÑоÑаÑÐ¸Ñ Ð»Ð¾Ð³Ð¾Ð²)
LogFileSize=100
# УÑÐ¾Ð²ÐµÐ½Ñ Ð»Ð¾Ð³Ð¸ÑованиÑ. 4 - Ð´Ð»Ñ Ð¾Ñладки (вÑÐ´Ð°ÐµÑ Ð¼Ð½Ð¾Ð³Ð¾ инÑоÑмаÑии)
DebugLevel=4
API Token
$ip = "192.168.3.102"
$url = "http://$ip/zabbix/api_jsonrpc.php"
$data = @{
"jsonrpc"="2.0";
"method"="user.login";
"params"=@{
"username"="Admin";` в веÑÑии до 6.4 паÑамеÑÑ "user"
"password"="zabbix";
};
"id"=1;
}
$token = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result
$token = "2eefd25fdf1590ebcdb7978b5bcea1fff755c65b255da8cbd723181b639bb789" ÑгенеÑиÑоваÑÑ Ñокен в UI (http://192.168.3.102/zabbix/zabbix.php?action=token.list)
user.get
$data = @{
"jsonrpc"="2.0";
"method"="user.get";
"params"=@{
};
"auth"=$token;
"id"=1;
}
$users = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result
problem.get
$data = @{
"jsonrpc"="2.0";
"method"="problem.get";
"params"=@{
};
"auth"=$token;
"id"=1;
}
(Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result
host.get
ÐолÑÑиÑÑ ÑпиÑок вÑÐµÑ Ñ Ð¾ÑÑов (Ð¸Ð¼Ñ Ð¸ id)
host.create - creating new hosts
host.delete - deleting hosts
host.get - retrieving hosts
host.massadd - adding related objects to hosts
host.massremove - removing related objects from hosts
host.massupdate - replacing or removing related objects from hosts
host.update - updating hosts
$data = @{
"jsonrpc"="2.0";
"method"="host.get";
"params"=@{
"output"=@(` оÑÑилÑÑÑоваÑÑ Ð²Ñвод
"hostid";
"host";
);
};
"id"=2;
"auth"=$token;
}
$hosts = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result
$host_id = $hosts[3].hostid` забÑаÑÑ id Ñ
оÑÑа по индекÑÑ
item.get
ÐолÑÑиÑÑ id ÑлеменÑов даннÑÑ Ð¿Ð¾ Ð½Ð°Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»ÑÑа Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑеÑного Ñ Ð¾ÑÑа
$data = @{
"jsonrpc"="2.0";
"method"="item.get";
"params"=@{
"hostids"=@($host_id);` оÑÑилÑÑÑоваÑÑ Ð¿Ð¾ Ñ
оÑÑÑ
};
"auth"=$token;
"id"=1;
}
$items = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result
$items_id = ($items | where key_ -match system.uptime).itemid` забÑаÑÑ id ÑлеменÑа даннÑÑ
history.get
ÐолÑÑиÑÑ Ð²ÑÑ Ð¸ÑÑоÑÐ¸Ñ ÑлеменÑа даннÑÑ Ð¿Ð¾ его id
$data = @{
"jsonrpc"="2.0";
"method"="history.get";
"params"=@{
"hostids"=@($host_id); ` ÑилÑÑÑаÑÐ¸Ñ Ð¿Ð¾ Ñ
оÑÑÑ
"itemids"=@($items_id);` ÑилÑÑÑаÑÐ¸Ñ Ð¿Ð¾ ÑлеменÑÑ Ð´Ð°Ð½Ð½ÑÑ
};
"auth"=$token;
"id"=1;
}
$items_data_uptime = (Invoke-RestMethod -Method POST -Uri $url -Body ($data | ConvertTo-Json) -ContentType "application/json").Result` полÑÑиÑÑ Ð²Ñе даннÑе по клÑÑÑ Ñ ÐºÐ¾Ð½ÐºÑеÑного Ñ
оÑÑа
Convert Secconds To TimeSpan and DateTime
$sec = $items_data_uptime.value
function ConvertSecondsTo-TimeSpan {
param (
$insec
)
$TimeSpan = [TimeSpan]::fromseconds($insec)
"{0:dd' day 'hh\:mm\:ss}" -f $TimeSpan
}
$UpTime = ConvertSecondsTo-TimeSpan $sec[-1]
Convert From Unix Time
$time = $items_data_uptime.clock
function ConvertFrom-UnixTime {
param (
$intime
)
$EpochTime = [DateTime]"1/1/1970"
$TimeZone = Get-TimeZone
$UTCTime = $EpochTime.AddSeconds($intime)
$UTCTime.AddMinutes($TimeZone.BaseUtcOffset.TotalMinutes)
}
$GetDataTime = ConvertFrom-UnixTime $time[-1]
($hosts | where hostid -eq $host_id).host полÑÑиÑÑ Ð¸Ð¼Ñ Ñ
оÑÑа
$UpTime поÑледнее полÑÑенное знаÑение вÑемени ÑабоÑÑ Ñ
оÑÑа
$GetDataTime вÑÐµÐ¼Ñ Ð¿Ð¾Ñледнего полÑÑенного знаÑениÑ
pki
New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "$env:computername" -FriendlyName "Test Certificate" -NotAfter (Get-Date).AddYears(5) ÑоздаÑÑ ÑамоподпиÑаннÑй ÑеÑÑиÑÐ¸ÐºÐ°Ñ (в LocalMachine\My - СеÑÑиÑикаÑÑ ÐºÐ¾Ð¼Ð¿ÑÑÑеÑа\ÐиÑное) Ñ ÑÑоком дейÑÑÐ²Ð¸Ñ 5 леÑ
Get-ChildItem -Path Cert:\CurrentUser\Root\ ÑпиÑок вÑеÑ
ÑÑÑановленнÑÑ
ÑеÑÑиÑикаÑов в Ñ
ÑанилиÑе ÐовеÑеннÑе коÑневÑе ЦС ТекÑÑего полÑзоваÑелÑ
Get-ChildItem -Path Cert:\CurrentUser\My\ ÑпиÑок ÑамозавеÑÑÑÑиÑ
ÑеÑÑиÑикаÑов в ÐиÑное Ñ
ÑанилиÑе ТекÑÑего полÑзоваÑелÑ
Get-ChildItem -Path Cert:\LocalMachine\My\ ÑпиÑок ÑамозавеÑÑÑÑиÑ
ÑеÑÑиÑикаÑов в ÐиÑное Ñ
ÑанилиÑе ÐокалÑного компÑÑÑеÑа
Get-ChildItem -Path Cert:\LocalMachine\My\ | select NotBefore,NotAfter,Thumbprint,Subject ÑÑок дейÑÑÐ²Ð¸Ñ ÑеÑÑиÑикаÑа
Get-ChildItem -Path Cert:\LocalMachine\My\ | where Thumbprint -eq D9356FB774EE0E6206B7D5B59B99102CA5B17BDA поиÑк ÑеÑÑиÑÐ¸ÐºÐ°Ñ Ð¿Ð¾ оÑпеÑаÑкÑ
Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificates\My\Certificates\ ÑеÑÑиÑикаÑÑ Ð² Ñайловой ÑиÑÑеме, каждÑй Ñайл ÑооÑвеÑÑÑвÑÐµÑ ÑеÑÑиÑикаÑÑ, ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð¾Ð¼Ñ Ð² лиÑном Ñ
ÑанилиÑе ÑекÑÑего полÑзоваÑелÑ
Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificates\My\Keys\ ÑÑÑлки на обÑекÑÑ Ð·Ð°ÐºÑÑÑÑÑ
клÑÑей, ÑозданнÑÑ
поÑÑавÑиком Ñ
ÑанилиÑа клÑÑей (KSP)
Get-ChildItem -Path HKCU:\Software\Microsoft\SystemCertificates\CA\Certificates | ft -AutoSize ÑпиÑок ÑеÑÑиÑикаÑов в ÑееÑÑÑе воÑедÑего в ÑиÑÑÐµÐ¼Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ
$cert = (Get-ChildItem -Path Cert:\CurrentUser\My\)[1] вÑбÑаÑÑ ÑеÑÑиÑикаÑ
$cert | Remove-Item ÑдалиÑÑ ÑеÑÑиÑикаÑ
Export-Certificate -FilePath $home\Desktop\certificate.cer -Cert $cert ÑкÑпоÑÑиÑоваÑÑ ÑеÑÑиÑикаÑ
$cert.HasPrivateKey пÑовеÑиÑÑ Ð½Ð°Ð»Ð¸Ñие закÑÑÑого клÑÑа
$pass = "password" | ConvertTo-SecureString -AsPlainText -Force ÑоздаÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ð´Ð»Ñ ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°ÐºÑÑÑого клÑÑа
Export-PfxCertificate -FilePath $home\Desktop\certificate.pfx -Password $pass -Cert $certificate ÑкÑпоÑÑиÑоваÑÑ ÑеÑÑиÑÐ¸ÐºÐ°Ñ Ñ Ð·Ð°ÐºÑÑÑÑм клÑÑем
Import-Certificate -FilePath $home\Desktop\certificate.cer -CertStoreLocation Cert:\CurrentUser\My импоÑÑиÑоваÑÑ ÑеÑÑиÑикаÑ
Import-PfxCertificate -Exportable -Password $pass -CertStoreLocation Cert:\CurrentUser\My -FilePath $home\Desktop\certificate.pfx
OpenSSL
Invoke-WebRequest -Uri https://slproweb.com/download/Win64OpenSSL_Light-3_1_1.msi -OutFile $home\Downloads\OpenSSL-Light-3.1.1.msi
Start-Process $home\Downloads\OpenSSL-Light-3.1.1.msi -ArgumentList '/quiet' -Wait` ÑÑÑановиÑÑ msi Ð¿Ð°ÐºÐµÑ Ð² ÑиÑ
ом Ñежиме (запÑÑк Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ ÐдминиÑÑÑаÑоÑа)
rm $home\Downloads\OpenSSL-Light-3.1.1.msi
cd "C:\Program Files\OpenSSL-Win64\bin"
-
ÐзмениÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ð´Ð»Ñ PFX
openssl pkcs12 -in "C:\Cert\domain.ru.pfx" -out "C:\Cert\domain.ru.pem" -nodesÑкÑпоÑÑиÑÑем имеÑÑийÑÑ ÑеÑÑиÑÐ¸ÐºÐ°Ñ Ð¸ закÑÑÑÑй клÑÑ Ð² .pem-Ñайл без паÑÐ¾Ð»Ñ Ñ Ñказанием ÑекÑÑего паÑолÑ
openssl pkcs12 -export -in "C:\Cert\domain.ru.pem" -out "C:\Cert\domain.ru_password.pfx" -nodesконвеÑÑиÑÑем .pem обÑаÑно в .pfx c Ñказанием нового паÑÐ¾Ð»Ñ -
ÐонвеÑÑаÑÐ¸Ñ Ð¸Ð· закÑÑÑого и оÑкÑÑÑого клÑÑа PEM в PFX
openssl pkcs12 -export -in "C:\tmp\vpn\vpn.itproblog.ru-crt.pem" -inkey "C:\tmp\vpn\vpn.itproblog.ru-key.pem" -out "C:\tmp\vpn\vpn.iiproblog.ru.pfx"
in â пÑÑÑ Ð´Ð¾ Ñайла Ñ Ð¾ÑкÑÑÑÑм клÑÑом
inkey â пÑÑÑ Ð´Ð¾ Ñайла Ñ Ð·Ð°ÐºÑÑÑÑм клÑÑом
out â пÑÑÑ Ð´Ð¾ Ñайла, в коÑоÑÑй бÑÐ´ÐµÑ ÐºÐ¾Ð½Ð²ÐµÑÑиÑован ÑеÑÑиÑÐ¸ÐºÐ°Ñ (pfx) -
ÐонвеÑÑаÑÐ¸Ñ PFX в CRT
openssl pkcs12 -in "C:\OpenSSL-Win64\bin\_.domain.ru.pfx" -clcerts -out "C:\OpenSSL-Win64\bin\_.domain.ru.crt"ÑказÑваеÑÑÑ ÑекÑÑий и 2 Ñаза новÑй паÑÐ¾Ð»Ñ PEM pass phrase (Ñайл ÑодеÑÐ¶Ð¸Ñ EGIN CERTIFICATE и BEGIN ENCRYPTED PRIVATE KEY)
openssl pkcs12 -in "C:\OpenSSL-Win64\bin\_.domain.ru.pfx" -clcerts -nokeys -out "C:\OpenSSL-Win64\bin\_.domain.ru.crt"без клÑÑа, полÑÑиÑÑ Ð¾ÑкÑÑÑÑÑ ÑаÑÑÑ (Ñайл ÑодеÑÐ¶Ð¸Ñ ÑолÑко EGIN CERTIFICATE) -
ÐонвеÑÑаÑÐ¸Ñ PFX в KEY
openssl pkcs12 -in "C:\OpenSSL-Win64\bin\_.domain.ru.pfx" -nocerts -out "C:\OpenSSL-Win64\bin\_.domain.ru.key"Ñайл ÑодеÑÐ¶Ð¸Ñ ÑолÑко BEGIN ENCRYPTED PRIVATE KEY -
СнÑÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ðº закÑÑÑого клÑÑа .key
openssl rsa -in "C:\OpenSSL-Win64\bin\_.domain.ru.key" -out "C:\OpenSSL-Win64\bin\_.domain.ru-decrypted.key" -
CRT и KEY в PFX:
openssl pkcs12 -inkey certificate.key -in certificate.crt -export -out certificate.pfx
OpenVPN
Invoke-WebRequest -Uri https://swupdate.openvpn.org/community/releases/OpenVPN-2.6.5-I001-amd64.msi -OutFile $home\Downloads\OpenVPN-2.6.5.msi
Start-Process $home\Downloads\OpenVPN-2.6.5.msi -ArgumentList '/quiet /SELECT_OPENSSL_UTILITIES=1' -Wait
msiexec /i $home\Downloads\OpenVPN-2.6.5.msi ADDLOCAL=EasyRSA /passive /quiet # ÑÑÑановиÑÑ Ð¾ÑделÑнÑй ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ EasyRSA Certificate Management Scripts
# msiexec /i $home\Downloads\OpenVPN-2.6.5.msi ADDLOCAL=OpenVPN.Service,Drivers,Drivers.Wintun,OpenVPN,OpenVPN.GUI,OpenVPN.GUI.OnLogon,EasyRSA /passive вÑбоÑоÑÐ½Ð°Ñ ÑÑÑановка
# Invoke-WebRequest -Uri https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.5/EasyRSA-3.1.5-win64.zip -OutFile $home\Downloads\EasyRSA-3.1.5.zip ÑкаÑаÑÑ Ð¾ÑделÑнÑй Ð¿Ð°ÐºÐµÑ EasyRSA
rm $home\Downloads\OpenVPN-2.6.5.msi
cd "C:\Program Files\OpenVPN\easy-rsa"
Copy-Item vars.example vars Ñайл конÑигÑÑаÑии Ð´Ð»Ñ EasyRSA
set_var EASYRSA_TEMP_DIR "$EASYRSA_PKI"
set_var EASYRSA_REQ_COUNTRY "RU"
set_var EASYRSA_REQ_PROVINCE "MSK"
set_var EASYRSA_REQ_CITY "MSK"
set_var EASYRSA_REQ_ORG "FAILON.NET"
set_var EASYRSA_REQ_EMAIL "[email protected]"
set_var EASYRSA_REQ_OU "IT"
#set_var EASYRSA_KEY_SIZE 2048
#set_var EASYRSA_CA_EXPIRE 3650
#set_var EASYRSA_CERT_EXPIRE 825
.\EasyRSA-Start.bat ÑÑеда EasyRSA Shell
easyrsa init-pki иниÑиализаÑÐ¸Ñ PKI, ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð´Ð¸ÑекÑоÑиÑ: C:\Program Files\OpenVPN\easy-rsa\pki и ÑиÑÐ°ÐµÑ Ð¿ÐµÑеменнÑе Ñайла \easy-rsa\vars
easyrsa build-ca генеÑаÑÐ¸Ñ ÐºÐ¾Ñневого CA Ñ Ñказанием паÑÐ¾Ð»Ñ Ð¸ пÑоизволÑное Ð¸Ð¼Ñ ÑеÑвеÑа (\pki\ca.crt и \pki\private\ca.key)
easyrsa gen-req server nopass генеÑаÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑа ÑеÑÑиÑикаÑа и клÑÑ Ð´Ð»Ñ ÑеÑвеÑа OpenVPN - yes (\pki\reqs\server.req и \pki\private\server.key)
easyrsa sign-req server server подпиÑаÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ð° вÑпÑÑк ÑеÑÑиÑикаÑа ÑеÑвеÑа Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ CA - yes (\pki\issued\server.crt)
easyrsa gen-dh ÑоздаÑÑ ÐºÐ»ÑÑ ÐиÑÑи-Хеллмана (\pki\dh.pem)
easyrsa gen-req client1 nopass генеÑаÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑа ÑеÑÑиÑикаÑа и клÑÑ Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñа OpenVPN (\pki\reqs\client1.req и \pki\private\client1.key)
easyrsa sign-req client client1 подпиÑаÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ð° вÑпÑÑк ÑеÑÑиÑикаÑа клиенÑа Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ CA - yes (\pki\issued\client1.crt)
easyrsa revoke client1 оÑозваÑÑ ÑеÑÑиÑÐ¸ÐºÐ°Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ
openssl rsa -in "C:\Program Files\OpenVPN\easy-rsa\pki\private\client1.key" -out "C:\Program Files\OpenVPN\easy-rsa\pki\private\client1_nopass.key" ÑнÑÑÑ Ð·Ð°ÑиÑÑ Ð¿Ð°Ñолем Ð´Ð»Ñ ÐºÐ»ÑÑа (BEGIN ENCRYPTED PRIVATE KEY -> BEGIN PRIVATE KEY)
exit
cd "C:\Program Files\OpenVPN\bin"
.\openvpn --genkey secret ta.key генеÑаÑÐ¸Ñ ÐºÐ»ÑÑа tls-auth (\bin\ta.key)
Move-Item "C:\Program Files\OpenVPN\bin\ta.key" "C:\Program Files\OpenVPN\easy-rsa\pki\"
server.ovpn
# Copy-Item "C:\Program Files\OpenVPN\sample-config\server.ovpn" "C:\Program Files\OpenVPN\config-auto\server.ovpn"
New-Item -ItemType File -Path "C:\Program Files\OpenVPN\config-auto\server.ovpn"
port 1194
proto udp
# ЧÑо именно инкапÑÑлиÑоваÑÑ Ð² ÑÑннеле (ethernet ÑÑÐµÐ¹Ð¼Ñ - tap или ip пакеÑÑ - tun)
dev tun
ca "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\issued\\server.crt"
key "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\private\\server.key"
dh "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\dh.pem"
server 192.168.4.0 255.255.255.0
# Ð¥ÑÐ°Ð½Ð¸Ñ ÑпиÑок ÑопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ip Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñов, ÑÑо Ð±Ñ Ð½Ð°Ð·Ð½Ð°ÑиÑÑ ÑÐ¾Ñ Ð¶Ðµ адÑÐµÑ Ð¿Ñи пеÑезапÑÑке ÑеÑвеÑа
# ifconfig-pool-persist "C:\\Program Files\\OpenVPN\\dhcp-client-list.txt"
# РазÑеÑиÑÑ ÐºÐ»Ð¸ÐµÐ½Ñам подклÑÑаÑÑÑÑ Ð¿Ð¾Ð´ одним клÑÑом
# duplicate-cn
# max-clients 30
# РазÑеÑиÑÑ Ð¾Ð±Ð¼ÐµÐ½ ÑÑаÑиком Ð¼ÐµÐ¶Ð´Ñ ÐºÐ»Ð¸ÐµÐ½Ñами
client-to-client
# compress
tls-auth "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\ta.key" 0
cipher AES-256-GCM
keepalive 20 60
# Ðе пеÑеÑиÑаваÑÑ ÑÐ°Ð¹Ð»Ñ ÐºÐ»ÑÑей пÑи пеÑезапÑÑке ÑÑннелÑ
persist-key
# ÐÑÑавлÑÐµÑ Ð±ÐµÐ· Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑÑÑойÑÑва tun/tap пÑи пеÑезапÑÑке OpenVPN
persist-tun
status "C:\\Program Files\\OpenVPN\\log\\status.log"
log "C:\\Program Files\\OpenVPN\\log\\openvpn.log"
verb 3
mute 20
windows-driver wintun
# ÐÑкÑÑÑÑ Ð´Ð¾ÑÑÑп к подÑеÑи за ÑеÑвеÑом
push "route 192.168.3.0 255.255.255.0"
push "route 192.168.4.0 255.255.255.0"
# ÐавеÑнÑÑÑ Ð²Ñе запÑоÑÑ ÐºÐ»Ð¸ÐµÐ½Ñа (в Ñом ÑиÑле ÐнÑеÑÐ½ÐµÑ ÑÑаÑик) на OpenVPN ÑеÑвеÑ
# push "redirect-gateway def1"
# push "dhcp-option DNS 192.168.3.101"
# push "dhcp-option DOMAIN failon.net"
New-NetFirewallRule -DisplayName "AllowOpenVPN-In" -Direction Inbound -Protocol UDP âLocalPort 1194 -Action Allow на ÑеÑвеÑе
New-NetFirewallRule -DisplayName "AllowOpenVPN-Out" -Direction Outbound -Protocol UDP âLocalPort 1194 -Action Allow на клиенÑе
Get-Service *openvpn* | Restart-Service
client.ovpn
# Copy-Item "C:\Program Files\OpenVPN\sample-config\client.ovpn" "C:\Program Files\OpenVPN\config-auto\client.ovpn"
New-Item -ItemType File -Path "C:\Program Files\OpenVPN\config-auto\client.ovpn"
client
dev tun
proto udp
remote 26.115.154.67 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-GCM
connect-retry-max 25
# ÐÑполÑзоваÑÑ Ð´ÑÐ°Ð¹Ð²ÐµÑ wintun и полнÑй пÑÑÑ Ð´Ð¾ ÑеÑÑиÑикаÑов пÑи иÑполÑзовании openvpn gui
windows-driver wintun
verb 3
Client
iwr -Uri https://openvpn.net/downloads/openvpn-connect-v3-windows.msi -OutFile "$home\downloads\OpenVPN-Connect-3.msi"
ÐеÑедаÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ Ð¸ клÑÑи:
client.ovpn
ca.crt
dh.pem
ta.key
client1.crt
client1.key
Route
Get-Service RemoteAccess | Stop-Service
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -Name "IPEnableRouter" -Value 1 вклÑÑÐ°ÐµÑ IP маÑÑÑÑÑизаÑиÑ
(Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters").IPEnableRouter
Get-NetIPInterface | select ifIndex,InterfaceAlias,AddressFamily,ConnectionState,Forwarding | ft оÑобÑазиÑÑ ÑеÑевÑе инÑеÑÑейÑÑ
Set-NetIPInterface -ifIndex 13 -Forwarding Enabled вклÑÑиÑÑ Ð¿ÐµÑеадÑеÑаÑÐ¸Ñ Ð½Ð° инÑеÑÑейÑе
sysctl net.ipv4.ip_forward=1
echo "sysctl net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
Get-NetRoute
New-NetRoute -DestinationPrefix "192.168.3.0/24" -NextHop "192.168.4.1" -InterfaceIndex 8
route -p add 192.168.3.0 mask 255.255.255.0 192.168.4.1 metric 1
route -p change 192.168.3.0 mask 255.255.255.0 192.168.4.1 metric 2
route -p add 192.168.3.0 mask 255.255.255.0 192.168.4.1 metric 1 if 7 ÑказаÑÑ Ð½Ð¾Ð¼ÐµÑ ÑеÑевого инÑеÑÑейÑа на коÑоÑÑй необÑ
одимо поÑÑлаÑÑ Ð¿Ð°ÐºÐµÑ (Wintun Userspace Tunnel)
route print -4
route delete 192.168.3.0
tracert 192.168.3.101 Ñ 192.168.4.6
1 17 ms * 22 ms 192.168.4.1
2 12 ms 13 ms 14 ms 192.168.3.101
route add -net 192.168.4.0 netmask 255.255.255.0 gw 192.168.3.100
route -e
traceroute 192.168.4.6 Ñ 192.168.3.101
1 192.168.3.100 (192.168.3.100) 0.148 ms 0.110 ms 0.106 ms
2 192.168.4.6 (192.168.4.6) 14.573 ms * *
ping 192.168.3.101 -t Ñ 192.168.4.6
tcpdump -n -i ens33 icmp на 192.168.3.101
14:36:34.533771 IP 192.168.4.6 > 192.168.3.101: ICMP echo request, id 1, seq 2962, length 40 # оÑпÑавил запÑоÑ
14:36:34.533806 IP 192.168.3.101 > 192.168.4.6: ICMP echo reply, id 1, seq 2962, length 40 # оÑпÑавил оÑвеÑ
NAT
Get-Command -Module NetNat
New-NetNat -Name LocalNat -InternalIPInterfaceAddressPrefix "192.168.3.0/24"
Add-NetNatStaticMapping -NatName LocalNat -Protocol TCP -ExternalIPAddress 0.0.0.0 -ExternalPort 80 -InternalIPAddress 192.168.3.102 -InternalPort 80
Remove-NetNatStaticMapping -StaticMappingID 0
Remove-NetNat -Name LocalNat
WireGuard
Invoke-WebRequest "https://download.wireguard.com/windows-client/wireguard-amd64-0.5.3.msi" -OutFile "$home\Downloads\WireGuard-Client-0.5.3.msi"
msiexec.exe /i "$home\Downloads\WireGuard-Client-0.5.3.msi" DO_NOT_LAUNCH=1 /qn
Invoke-WebRequest "http://www.wiresock.net/downloads/wiresock-vpn-gateway-x64-1.1.4.1.msi" -OutFile "$home\Downloads\WireSock-VPN-Gateway-1.1.4.1.msi"
msiexec.exe /i "http://www.wiresock.net/downloads/wiresock-vpn-gateway-x64-1.1.4.1.msi" /qn
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
wg-quick-config -add -start
26.115.154.67:8181
192.168.21.4/24
Successfully saved client configuration: C:\ProgramData\NT KERNEL\WireSock VPN Gateway\wsclient_1.conf
Successfully saved server configuration: C:\ProgramData\NT KERNEL\WireSock VPN Gateway\wiresock.conf
get-service *wire*
wg show
wg-quick-config -add -restart add client
wiresock.conf
[Interface]
PrivateKey = gCHC0g2JPwr6sXPiaOL4/KTkMyjN9TculrJUA/GORV8=
Address = 192.168.21.5/24
ListenPort = 8181
[Peer]
PublicKey = NoSxjew2RCHiUzI6mlahjd4I+0EcLsoYom/H01z91yU=
AllowedIPs = 192.168.21.6/32
wsclient_1.conf (добавиÑÑ Ð¼Ð°ÑÑÑÑÑÑ Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñа в AllowedIPs)
[Interface]
PrivateKey = yIpRQRmaGrrk9Y+49E8JhEpFmKzSeecvUAdeNgf1hUM=
Address = 192.168.21.6/24
DNS = 8.8.8.8, 1.1.1.1
MTU = 1420
[Peer]
PublicKey = Fp7674VSYeGj8CYt6RCKR7Qz1y/IKUXCw8ImOFhX3hk=
AllowedIPs = 192.168.21.0/24, 192.168.3.0/24
Endpoint = 26.115.154.67:8181
PersistentKeepalive = 25
VpnClient
Get-Command -Module VpnClient
Add-VpnConnection -Name "vpn-failon" -ServerAddress "26.115.154.67" -TunnelType L2TP -L2tpPsk "123098" -EncryptionLevel "Required" -AuthenticationMethod MSChapv2 -RememberCredential -AllUserConnection âPassThru -Force
-TunnelType PPTP/L2TP/SSTP/IKEv2/Automatic
-L2tpPsk иÑполÑзоваÑÑ Ð¾Ð±Ñий клÑÑ Ð´Ð»Ñ Ð°ÑÑенÑиÑикаÑии (без паÑамеÑÑа, Ð´Ð»Ñ L2TP аÑÑенÑиÑикаÑии иÑполÑзÑеÑÑÑ ÑеÑÑиÑикаÑ)
-AuthenticationMethod Pap/Chap/MSChapv2/Eap/MachineCertificate
-EncryptionLevel NoEncryption/Optional/Required/Maximum/Custom
-SplitTunneling завоÑаÑиваÑÑ Ð²ÐµÑÑ ÑÑаÑик ÑеÑез VPN-ÑÑÐ½Ð½ÐµÐ»Ñ (вклÑÑение Use default gateway on remote network в наÑÑÑойкаÑ
паÑамеÑÑа VPN адапÑеÑа)
-UseWinlogonCredential иÑполÑзоваÑÑ ÑÑеÑнÑе даннÑе ÑекÑÑего полÑзоваÑÐµÐ»Ñ Ð´Ð»Ñ Ð°ÑÑенÑиÑикаÑии на VPN ÑеÑвеÑе
-RememberCredential ÑазÑеÑиÑÑ ÑоÑ
ÑанÑÑÑ ÑÑеÑнÑе даннÑе Ð´Ð»Ñ VPN подклÑÑÐµÐ½Ð¸Ñ (ÑÑеÑÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð¸ паÑÐ¾Ð»Ñ ÑоÑ
ÑанÑÑÑÑÑ Ð² диÑпеÑÑÐµÑ ÑÑеÑнÑÑ
даннÑÑ
Windows поÑле пеÑвого ÑÑпеÑного подклÑÑениÑ)
-DnsSuffix domain.local
-AllUserConnection ÑазÑеÑиÑÑ Ð¸ÑполÑзоваÑÑ VPN подклÑÑение Ð´Ð»Ñ Ð²ÑеÑ
полÑзоваÑелей компÑÑÑеÑа (ÑоÑ
ÑанÑеÑÑÑ Ð² конÑигÑÑаÑионнÑй Ñайл: C:\ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk)
Install-Module -Name VPNCredentialsHelper модÑÐ»Ñ Ð´Ð»Ñ ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð»Ð¾Ð³Ð¸Ð½Ð° и паÑÐ¾Ð»Ñ Ð² Windows Credential Manager Ð´Ð»Ñ VPN подклÑÑениÑ
Set-VpnConnectionUsernamePassword -connectionname vpn-failon -username user1 -password password
rasdial "vpn-failon" подклÑÑиÑÑÑÑ
Get-VpnConnection -AllUserConnection | select * ÑпиÑок VPN подклÑÑениÑ, доÑÑÑпнÑÑ
Ð´Ð»Ñ Ð²ÑеÑ
полÑзоваÑелей, найÑÑÑойки и ÑекÑÑий ÑÑаÑÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ (ConnectionStatus)
Add-VpnConnectionRoute -ConnectionName vpn-failon -DestinationPrefix 192.168.3.0/24 âPassThru динамиÑеÑки добавиÑÑ Ð² ÑаблиÑÑ Ð¼Ð°ÑÑÑÑÑизаÑии маÑÑÑÑÑ, коÑоÑÑй бÑÐ´ÐµÑ Ð°ÐºÑивен пÑи подклÑÑении к VPN
Remove-VpnConnection -Name vpn-failon -AllUserConnection -Force ÑдалиÑÑ
Set-VpnConnection -Name "vpn-failon" -SplitTunneling $True вклÑÑиÑÑ ÑазделÑное ÑÑнеллиÑование
Add-VpnConnectionRoute -ConnectionName "vpn-failon" -DestinationPrefix 172.22.22.0/24 наÑÑÑоиÑÑ Ð¼Ð°ÑÑÑÑÑизаÑÐ¸Ñ Ðº Ñказанной подÑеÑи ÑеÑез VPN-Ñоединение
(Get-VpnConnection -ConnectionName "vpn-failon").routes оÑобÑазиÑÑ ÑаблиÑÑ Ð¼Ð°ÑÑÑÑÑизаÑии Ð´Ð»Ñ Ñказанного ÑоединениÑ
Remove-VpnConnectionRoute -ConnectionName "vpn-failon" -DestinationPrefix "172.22.23.0/24"
Proxy
$user = "lifailon"
$pass = "Proxy"
$SecureString = ConvertTo-SecureString $pass -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential($user, $SecureString)
[System.Net.Http.HttpClient]::DefaultProxy = New-Object System.Net.WebProxy("http://192.168.3.100:9090")
[System.Net.Http.HttpClient]::DefaultProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials
[System.Net.Http.HttpClient]::DefaultProxy.Credentials = $Credential
Invoke-RestMethod http://ifconfig.me/ip
Invoke-RestMethod https://kinozal.tv/rss.xml
netsh
Proxy
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=80 connectaddress=192.168.3.108
netsh interface portproxy show all
netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=0.0.0.0
Wlan
netsh wlan show profile ÑпиÑок ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð½Ñ Ð¿ÑоÑилей Wi-Fi и паÑолей
netsh wlan show interfaces Ñ
аÑ-ки ÑекÑÑей ÑеÑи (MAC, speed)
netsh wlan show profile SSID-Name-Network key=clear оÑиÑÑиÑÑ Ð¿Ð°ÑолÑ
netsh wlan show networks ÑпиÑок видемÑÑ
ÑеÑей
netsh wlan disconnect оÑклÑÑиÑÑÑÑ Ð¾Ñ Wi-Fi
netsh wlan connect name="SSID-Name-Network" подклÑÑиÑÑÑÑ
netsh wlan show drivers дÑÐ°Ð¹Ð²ÐµÑ Wi-Fi
netsh wlan set hostednetwork mode=allow ssid="WiFi-Test" key="password" Ñоздание ÑоÑки доÑÑÑпа Wi-Fi (SoftAP)
Firewall
netsh advfirewall set allprofiles state off оÑклÑÑиÑÑ fw
netsh advfirewall reset ÑбÑоÑиÑÑ Ð½Ð°ÑÑÑойки
netsh advfirewall firewall add rule name="Open Remote Desktop" protocol=TCP dir=in localport=3389 action=allow оÑкÑÑÑÑ Ð¿Ð¾ÑÑ 3389
netsh advfirewall firewall add rule name="All ICMP V4" dir=in action=allow protocol=icmpv4 оÑкÑÑÑÑ icmp
OpenSSH
Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*'
Add-WindowsCapability -Online -Name OpenSSH.Client*
dism /Online /Add-Capability /CapabilityName:OpenSSH.Client~~~~0.0.1.0
iwr https://github.com/PowerShell/Win32-OpenSSH/releases/download/v9.2.2.0p1-Beta/OpenSSH-Win64-v9.2.2.0.msi -OutFile $home\Downloads\OpenSSH-Win64-v9.2.2.0.msi ÑкаÑаÑÑ
msiexec /i $home\Downloads\OpenSSH-Win64-v9.2.2.0.msi ÑÑÑановиÑÑ msi пакеÑ
Set-Service sshd -StartupType Automatic
Get-NetTCPConnection | where LocalPort -eq 22
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
Get-NetFirewallRule -Name *ssh*
Start-Process notepad++ C:\Programdata\ssh\sshd_config конÑигÑÑаÑионнÑй Ñайл
GSSAPIAuthentication yes вклÑÑиÑÑ Kerberos аÑÑенÑиÑикаÑÐ¸Ñ (ÑеÑез AD)
SyslogFacility LOCAL0 вклÑÑиÑÑ Ð»Ð¾ÐºÐ°Ð»Ñное ведение жÑÑнала в Ñайл (C:\ProgramData\ssh\logs\sshd.log)
LogLevel INFO
Restart-Service sshd
ssh -K $srv вÑполниÑÑ Kerberos аÑÑенÑиÑикаÑиÑ
ssh [email protected] -p 22
pwsh -command Get-Service
ssh -L 3101:192.168.3.101:22 -R 3101:192.168.3.101:22 [email protected] -p 22 SSH Tunnel lifailon@localhost:3101 -> 192.168.3.101:3101
WinRM
Enter-PSSession -ComputerName $srv подклÑÑиÑÑÑÑ Ðº PowerShell ÑеÑÑии ÑеÑез PSRemoting. ÐодклÑÑение возможно ÑолÑко по FQDN-имени
Invoke-Command $srv -ScriptBlock {Get-ComputerInfo} вÑполнение ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑеÑез PSRemoting
$session = New-PSSession $srv оÑкÑÑÑÑ ÑеÑÑиÑ
Get-PSSession оÑобÑазиÑÑ Ð°ÐºÑивнÑе ÑеÑÑии
icm -Session $session {$srv = $using:srv} пеÑедаÑÑ Ð¿ÐµÑеменнÑÑ ÑекÑÑей ÑеÑÑии ($using) в ÑдаленнÑÑ
Disconnect-PSSession $session закÑÑÑÑ ÑеÑÑиÑ
Remove-PSSession $session ÑдалиÑÑ ÑеÑÑиÑ
Import-Module -Name ActiveDirectory -PSSession $srv импоÑÑиÑоваÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ Ñ Ñдаленного компÑÑÑеÑа в локалÑнÑÑ ÑеÑÑиÑ
Windows Remote Management Configuration
winrm quickconfig -quiet Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑÑк ÑлÑÐ¶Ð±Ñ WinRM на авÑомаÑиÑеÑкий, задаÑÑ ÑÑандаÑÑнÑе наÑÑÑойки WinRM и добавиÑÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾ÑÑов в fw
Enable-PSRemoting âForce вклÑÑиÑÑ PowerShell Remoting, ÑабоÑÐ°ÐµÑ ÑолÑко Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð½Ð¾Ð³Ð¾ и ÑаÑÑного ÑеÑевÑÑ
пÑоÑилей Windows
Enable-PSRemoting -SkipNetworkProfileCheck -Force Ð´Ð»Ñ Ð½Ð°ÑÑÑойки компÑÑÑеÑа в обÑей (public) ÑеÑи (ÑабоÑÐ°ÐµÑ Ñ Ð²ÐµÑÑии powershell 6)
$NetProfiles = Get-NetConnectionProfile оÑобÑазиÑÑ Ð¿ÑоÑили ÑеÑевÑÑ
подклÑÑений
Set-NetConnectionProfile -InterfaceIndex $NetProfiles[1].InterfaceIndex -NetworkCategory Private измениÑÑ Ñип ÑеÑи Ð´Ð»Ñ Ð¿ÑоÑÐ¸Ð»Ñ (DomainAuthenticated/Public)
(Get-CimInstance -ClassName Win32_ComputerSystem).PartOfDomain пÑовеÑиÑÑ, ÑÑо компÑÑÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½ в домен AD
Get-Service WinRM | Set-Service -StartupType AutomaticDelayedStart оÑложеннÑй запÑÑк
Get-Service -Name winrm -RequiredServices ÑÑаÑÑÑ Ð·Ð°Ð²Ð¸ÑимÑÑ
ÑлÑжб
New-NetFirewallRule -Profile Any -DisplayName "WinRM HTTP" -Direction Inbound -Protocol TCP -LocalPort 5985,5986
Test-NetConnection $srv -port 5895 пÑовеÑиÑÑ Ð¿Ð¾ÑÑ
Test-WSMan $srv -ErrorAction Ignore пÑовеÑиÑÑ ÑабоÑÑ WinRM на Ñдаленном компÑÑÑеÑе (игноÑиÑоваÑÑ Ð²Ñвод оÑибок Ð´Ð»Ñ ÑкÑипÑа) или локалÑно (localhost)
$Cert = New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "$env:computername" -FriendlyName "WinRM HTTPS Certificate" -NotAfter (Get-Date).AddYears(5) ÑоздаÑÑ ÑамоподпиÑаннÑй ÑеÑÑиÑикаÑ
$Thumbprint = $Cert.Thumbprint забÑаÑÑ Ð¾ÑпеÑаÑок
New-Item -Path WSMan:\Localhost\Listener -Transport HTTPS -Address * -CertificateThumbprint $Thumbprint -Name WinRM_HTTPS_Listener -Force ÑоздаÑÑ Ð¿ÑоÑлÑÑиваÑелÑ
New-NetFirewallRule -DisplayName 'WinRM HTTPS' -Profile Domain,Private -Direction Inbound -Action Allow -Protocol TCP -LocalPort 5986 оÑкÑÑÑÑ Ð¿Ð¾ÑÑ Ð² fw
$selector_set = @{
Address = "*"
Transport = "HTTPS"
}
$value_set = @{
CertificateThumbprint = "66ABFDA044D8C85135048186E2FDC0DBE6125163"
}
New-WSManInstance -ResourceURI "winrm/config/Listener" -SelectorSet $selector_set -ValueSet $value_set
winrm get winrm/config оÑобÑазиÑÑ Ð²ÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ (Client/Service)
winrm get winrm/config/service/auth конÑигÑÑаÑÐ¸Ñ Ð°Ð²ÑоÑизаÑии на ÑеÑвеÑе
winrm enumerate winrm/config/listener ÑекÑÑÐ°Ñ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ Ð¿ÑоÑлÑÑиваÑелей WinRM (оÑобÑÐ°Ð¶Ð°ÐµÑ Ð¾ÑпеÑаÑок ÑеÑÑиÑикаÑа Ð´Ð»Ñ HTTPS 5986)
Get-ChildItem -Path Cert:\LocalMachine\My\ | where Thumbprint -eq D9356FB774EE0E6206B7D5B59B99102CA5B17BDA | select * инÑоÑмаÑÐ¸Ñ Ð¾ ÑеÑÑиÑикаÑе
ls WSMan:\localhost\Client конÑигÑÑаÑÐ¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñа
ls WSMan:\localhost\Service конÑигÑÑаÑÐ¸Ñ ÑеÑвеÑа
ls WSMan:\localhost\Service\auth ÑпиÑок вÑеÑ
конÑигÑÑаÑий аÑÑенÑиÑикаÑии WinRM ÑеÑвеÑа
Set-Item -path WSMan:\localhost\Service\auth\basic -value $true ÑазÑеÑиÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑÑ Ð°ÑÑенÑиÑикаÑÐ¸Ñ Ðº ÑекÑÑÐµÐ¼Ñ ÑеÑвеÑÑ
ls HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN наÑÑÑойки в ÑееÑÑÑе (напÑимеÑ, Ð´Ð»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð°ÑденÑиÑикаÑии в \Service\auth_basic = 1)
Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.* -Force добавиÑÑ Ð´Ð¾Ð²ÐµÑеннÑе Ñ
оÑÑÑ Ð² конÑигÑÑаÑÐ¸Ñ Ð½Ð° клиенÑе, ÑÑÐ¾Ð±Ñ ÑабоÑала Negotiate аÑÑенÑиÑикаÑÐ¸Ñ ÑеÑез NTLM
Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.3.100 -Concatenate -Force добавиÑÑ Ð²ÑоÑой компÑÑÑеÑ
ls WSMan:\localhost\Client\TrustedHosts
Set-Item WSMan:\localhost\Client\AllowUnencrypted $true вклÑÑиÑÑ Ð¿ÐµÑедаÑа незаÑиÑÑованнÑÑ
даннÑÑ
конÑигÑÑаÑии клиенÑа
Set-Item WSMan:\localhost\Service\AllowUnencrypted $true вклÑÑиÑÑ Ð¿ÐµÑедаÑа незаÑиÑÑованнÑÑ
даннÑÑ
конÑигÑÑаÑии ÑеÑвеÑа (необÑ
одимо бÑÑÑ Ð² private ÑеÑи)
Get-PSSessionConfiguration пÑовеÑиÑÑ, вклÑÑен ли PSremoting и вÑвеÑÑи ÑпиÑок полÑзоваÑелей и гÑÑпп, коÑоÑÑм ÑазÑеÑено подклÑÑаÑÑÑÑ ÑеÑез WinRM
Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI назнаÑиÑÑ Ð¿Ñава доÑÑÑпа ÑеÑез деÑкÑипÑÐ¾Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи ÑекÑÑей ÑеÑÑии (до пеÑезагÑÑки)
(Get-PSSessionConfiguration -Name "Microsoft.PowerShell").SecurityDescriptorSDDL полÑÑиÑÑ Ð½Ð°ÑÑÑойки деÑкÑипÑоÑа в ÑоÑмаÑе SDDL
Set-PSSessionConfiguration -Name Microsoft.PowerShell -SecurityDescriptorSDDL $SDDL пÑимениÑÑ Ð½Ð°ÑÑÑойки деÑкÑипÑоÑа на дÑÑгом компÑÑÑеÑе без иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ GUI \
New-LocalUser "WinRM-Writer" -Password (ConvertTo-SecureString -AsPlainText "123098") ÑоздаÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ
Add-LocalGroupMember -Group "Remote Management Users" -Member "WinRM-Writer" добавиÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ WinRM-Writer в локалÑнÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ð´Ð¾ÑÑÑпа "ÐолÑзоваÑели Ñдаленного ÑпÑавлениÑ"
cmdkey /add:192.168.3.99 /user:WinRM-Writer /pass:123098 ÑоÑ
ÑаниÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ð² CredentialManager
cmdkey /list
Import-Module CredentialManager
Add-Type -AssemblyName System.Web
New-StoredCredential -Target 192.168.3.99 -UserName WinRM-Writer -Password 123098 -Comment WinRM ÑоÑ
ÑаниÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ð² CredentialManager (из PS5)
Get-StoredCredential -AsCredentialObject
$cred = Get-StoredCredential -Target 192.168.3.99
Enter-PSSession -ComputerName 192.168.3.99 -Credential $cred -Authentication Negotiate
Enter-PSSession -ComputerName 192.168.3.99 -Credential $cred -Authentication Basic -Port 5985 ÑабоÑÐ°ÐµÑ Ð¿Ñи оÑклÑÑении allowunencrypted на ÑÑоÑоне ÑеÑвеÑа и клиенÑа
winrs -r:http://192.168.3.100:5985/wsman -u:WinRM-Writer -p:123098 ipconfig пеÑедаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑеÑез winrs (-?)
winrs -r:https://192.168.3.100:5985/wsman -u:WinRM-Writer -p:123098 -ssl ipconfig ÑеÑез https
pwsh -Command "Install-Module -Name PSWSMan" ÑÑÑановиÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² Linux ÑиÑÑеме
Kerberos
.\CheckMaxTokenSize.ps1 -Principals login -OSEmulation $true -Details $true ÑзнаÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ñокена полÑзоваÑÐµÐ»Ñ Ð² домене
Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters | select maxtokensize макÑималÑнÑй ÑÐ°Ð·Ð¼ÐµÑ Ñокена на ÑеÑвеÑе
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters измениÑÑ ÑазмеÑа, еÑли заголовок пакеÑа аÑÑенÑиÑикаÑии пÑевÑÑÐ°ÐµÑ 16 Ðб (из за болÑÑого кол-ва гÑÑпп)
MaxFieldLength ÑвелиÑиÑÑ Ð´Ð¾ 0000ffff (65535)
MaxRequestBytes ÑвелиÑиÑÑ Ð´Ð¾ 0000ffff (65535)
PackageManagement
Import-Module PackageManagement импоÑÑиÑоваÑÑ Ð¼Ð¾Ð´ÑлÑ
Get-Module PackageManagement инÑоÑмаÑÐ¸Ñ Ð¾ модÑле
Get-Command -Module PackageManagement оÑобÑазиÑÑ Ð²Ñе командлеÑÑ Ð¼Ð¾Ð´ÑлÑ
Get-Package оÑобÑазиÑÑ Ð²Ñе ÑÑÑановленнÑе пакеÑÑ PowerShellGallery
Get-Package -ProviderName msi,Programs ÑпиÑок ÑÑÑановленнÑÑ
пÑогÑамм
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 вклÑÑиÑÑ Ð¸ÑполÑзование пÑоÑокол TLS 1.2 (еÑли не оÑклÑÑÐµÐ½Ñ Ð¿ÑоÑÐ¾ÐºÐ¾Ð»Ñ TLS 1.0 и 1.1)
Find-PackageProvider поиÑк пÑовайдеÑов
Install-PackageProvider PSGallery -force ÑÑÑановиÑÑ Ð¸ÑÑоÑник
Install-PackageProvider NuGet -force
Install-PackageProvider Chocolatey -force
Get-PackageSource иÑÑоÑники ÑÑÑановки пакеÑов
Set-PackageSource -Name PSGallery -Trusted по ÑмолÑаниÑ
Find-Package -Name *Veeam* -Source PSGallery поиÑк пакеÑов Ñ Ñказанием иÑÑоÑника
Install-Package -Name VeeamLogParser -ProviderName PSGallery -scope CurrentUser
Get-Command *Veeam*
Import-Module -Name VeeamLogParser загÑÑзиÑÑ Ð¼Ð¾Ð´ÑлÑ
Get-Module VeeamLogParser | select -ExpandProperty ExportedCommands оÑобÑазиÑÑ ÑпиÑок ÑÑнкÑий
winget
winget list ÑпиÑок ÑÑÑановленнÑÑ
пакеÑов
winget search VLC найÑи пакеÑ
winget show VideoLAN.VLC инÑоÑмаÑÐ¸Ñ Ð¾ пакеÑе
winget show VideoLAN.VLC --versions ÑпиÑок доÑÑÑпнÑÑ
веÑÑий в ÑепозиÑоÑии
winget install VideoLAN.VLC ÑÑÑановиÑÑ Ð¿Ð°ÐºÐµÑ
winget uninstall VideoLAN.VLC ÑдалиÑÑ Ð¿Ð°ÐºÐµÑ
winget download jqlang.jq загÑÑзкиÑÑ Ð¿Ð°ÐºÐµÑ (https://github.com/jqlang/jq/releases/download/jq-1.7/jq-windows-amd64.exe)
winget install jqlang.jq добавлÑÐµÑ Ð² пеÑеменнÑÑ ÑÑÐµÐ´Ñ Ð¸ пÑевдоним командной ÑÑÑоки jq
winget uninstall jqlang.jq
jqlang-install
[uri]$url = $($(irm https://api.github.com/repos/jqlang/jq/releases/latest).assets.browser_download_url -match "windows-amd64").ToString() # полÑÑиÑÑ Ð²ÐµÑÑÐ¸Ñ latest на GitHub
irm $url -OutFile "C:\Windows\System32\jq.exe" # загÑÑзиÑÑ jq.exe
Scoop
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
irm get.scoop.sh | iex ÑÑÑановка
scoop help
scoop search jq
scoop info jq
(scoop info jq).version
scoop cat jq
scoop download jq C:\Users\lifailon\scoop\cache
scoop install jq C:\Users\lifailon\scoop\apps\jq\1.7
scoop list
(scoop list).version
scoop uninstall jq
Chocolatey
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
choco -v
choco -help
choco list
choco install adobereader
NuGet
Invoke-RestMethod https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -OutFile "$home\Documents\nuget.exe"
Invoke-Expression "$home\Documents\nuget.exe search Selenium.WebDriver"
Invoke-Expression "$home\Documents\nuget.exe install Selenium.WebDriver"
Get-Item $home\Documents\*Selenium*
& "$home\Documents\nuget.exe" list console-translate
$nuget_api_key = "<API-KEY>"
$source = "https://api.nuget.org/v3/index.json"
$Name = "Console-Translate"
$path = "$home\Documents\$Name"
New-Item -Type Directory $path
Copy-Item "$home\Documents\Git\$Name\$Name\0.2\*" "$path\"
Copy-Item "$home\Documents\Git\$Name\LICENSE" "$path\"
Copy-Item "$home\Documents\Git\$Name\README.md" "$path\"
'<?xml version="1.0"?>
<package >
<metadata>
<id>Console-Translate</id>
<version>0.2.2</version>
<authors>Lifailon</authors>
<owners>Lifailon</owners>
<description>Cross-platform client for translating text in the console, uses API Google (edded public free token), MyMemory and DeepLX (no token required)</description>
<tags>PowerShell, Module, Translate, api</tags>
<projectUrl>https://github.com/Lifailon/Console-Translate</projectUrl>
<contentFiles>
<files include="Console-Translate.psm1" buildAction="Content" />
<files include="Console-Translate.psd1" buildAction="Content" />
<files include="lang-iso-639-1.csv" buildAction="Content" />
<files include="README.md" buildAction="Content" />
<files include="LICENSE" buildAction="Content" />
</contentFiles>
</metadata>
</package>' > "$path\$Name.nuspec"
Set-Location $path
& "$home\Documents\nuget.exe" pack "$path\$Name.nuspec"
& "$home\Documents\nuget.exe" push "$path\$Name.0.2.2.nupkg" -ApiKey $nuget_api_key -Source $source
& "$home\Documents\nuget.exe" push "$path\$Name.0.2.2.nupkg" -ApiKey $nuget_api_key -Source $source -SkipDuplicate
Install-Package Console-Translate -Source nuget.org
Get-Package Console-Translate | select *
Register-PSRepository -Name "NuGet" -SourceLocation "https://www.nuget.org/api/v2" -InstallationPolicy Trusted
Get-PSRepository
Find-Module -Name Console-Translate
Install-Module Console-Translate -Repository NuGet
& "$home\Documents\nuget.exe" delete Console-Translate 0.2.0 -Source https://api.nuget.org/v3/index.json -ApiKey $nuget_api_key -NoPrompt
Git
git --version
git config --global user.name "Lifailon" добавиÑÑ Ð¸Ð¼Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñов
git config --global user.email "[email protected]"
git config --global --edit
ssh-keygen -t rsa -b 4096
Get-Service | where name -match "ssh-agent" | Set-Service -StartupType Automatic
Get-Service | where name -match "ssh-agent" | Start-Service
Get-Service | where name -match "ssh-agent" | select Name,Status,StartType
ssh-agent
ssh-add C:\Users\Lifailon\.ssh\id_rsa
cat ~\.ssh\id_rsa.pub | Set-Clipboard copy to settings keys
cd $home\Documents\Git
git clone [email protected]:Lifailon/lifailon.github.io
cd lifailon.github.io
git grep "ping ya.ru" поиÑк ÑекÑÑа в ÑайлаÑ
git fetch загÑÑзиÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· Ñдаленного Ñ
ÑанилиÑа Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÑеÑ
веÑок локалÑного ÑепозиÑоÑиÑ, не заÑÑÐ°Ð³Ð¸Ð²Ð°Ñ ÑекÑÑÑÑ ÑабоÑÑÑ Ð²ÐµÑÐºÑ (загÑÑÐ¶Ð°ÐµÑ Ð²Ñе коммиÑÑ, веÑки и Ñ.д. коÑоÑÑе не пÑиÑÑÑÑÑвÑÑÑ Ð² локалÑном ÑепозиÑоÑии)
git pull загÑÑзиÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· Ñдаленного Ñ
ÑанилиÑа Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð»Ð¾ÐºÐ°Ð»Ñного ÑепозиÑоÑÐ¸Ñ (вÑполнÑÐµÑ git fetch Ð´Ð»Ñ ÑинÑ
ÑонизаÑии Ñдаленного ÑепозиÑоÑÐ¸Ñ Ñ Ð»Ð¾ÐºÐ°Ð»ÑнÑм и git merge Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑекÑÑей ÑабоÑей веÑки)
git status оÑобÑазиÑÑ ÑÑаÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ по Ñайлам
git diff оÑобÑазиÑÑ Ð¸ÑÑоÑÐ¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ поÑÑÑоÑно
git diff pandoc ÑÑÐ°Ð²Ð½Ð¸Ð²Ð°ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑекÑÑей ÑабоÑей диÑекÑоÑии Ñ Ð¿Ð¾Ñледним коммиÑом в Ñказанной веÑке
git add . добавиÑÑ (пÑоиндекÑиÑоваÑÑ) Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð¾ вÑеÑ
ÑайлаÑ
ÑекÑÑего каÑалога
git commit -m "update powershell commands" ÑоÑ
ÑаниÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½ÑаÑием
git push ÑинÑ
ÑонизиÑоваÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ ÑепозиÑоÑием на ÑеÑвеÑе
git branch hugo ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ Ð²ÐµÑкÑ
git branch -m hugo-public пеÑеименоваÑÑ ÑекÑÑÑÑ Ð²ÐµÑкÑ
git branch -d hugo-public ÑдалиÑÑ Ð²ÐµÑкÑ
git switch hugo пеÑеклÑÑиÑÑÑÑ Ð½Ð° дÑÑгÑÑ Ð²ÐµÑкÑ
git push origin hugo оÑпÑавиÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑказаннÑÑ Ð²ÐµÑкÑ
git push --set-upstream origin hugo оÑÑлеживаÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² веÑке (позволÑÐµÑ Ð´ÐµÐ»Ð°ÑÑ push без ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð²ÐµÑки)
git merge hugo ÑлиÑние ÑекÑÑей веÑки (pandoc) Ñ Ñказанной (hugo)
git log --oneline --all лог коммиÑов
git log --graph коммиÑÑ Ð¸ Ñледование веÑок
git log --author="Lifailon" показÑÐ²Ð°ÐµÑ Ð¸ÑÑоÑÐ¸Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñов Ñказанного полÑзоваÑелÑ
git blame index.html показÑваеÑ, кÑо и когда Ð²Ð½ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² каждÑÑ ÑÑÑÐ¾ÐºÑ Ñказанного Ñайла
git show d01f09dead3a6a8d75dda848162831c58ca0ee13 оÑобÑазиÑÑ Ð¿Ð¾Ð´ÑобнÑй лог по номеÑÑ ÐºÐ¾Ð¼Ð¼Ð¸Ñа
git restore filename оÑмениÑÑ Ð²Ñе локалÑнÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑабоÑей копии незавиÑимо Ð¾Ñ Ñого, бÑли они пÑоиндекÑиÑÐ¾Ð²Ð°Ð½Ñ Ð¸Ð»Ð¸ Ð½ÐµÑ (еÑли бÑла индекÑаÑÐ¸Ñ ÑеÑез add), возвÑаÑÐ°Ñ ÐµÐ³Ð¾ к ÑоÑÑоÑÐ½Ð¸Ñ Ð½Ð° Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿Ð¾Ñледнего коммиÑа
git restore --source d01f09dead3a6a8d75dda848162831c58ca0ee13 filename воÑÑÑановиÑÑ Ñайл на ÑказаннÑÑ Ð²ÐµÑÑÐ¸Ñ Ð¿Ð¾ Ñ
ÑÑÑ Ð¸Ð½Ð´ÐµÐ½ÑиÑикаÑоÑа коммиÑа
git checkout filename оÑкаÑиÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ пÑоиндекÑиÑованнÑе Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñа, возвÑаÑÐ°Ñ ÐµÐ³Ð¾ к ÑоÑÑоÑниÑ, каким оно бÑло на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿Ð¾Ñледнего коммиÑа (еÑли не бÑло индекÑаÑии ÑеÑез add)
git checkout d01f09dead3a6a8d75dda848162831c58ca0ee13 пеÑеклÑÑиÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑе ÑÐ°Ð¹Ð»Ñ ÑабоÑей копии на ÑказаннÑй ÐºÐ¾Ð¼Ð¼Ð¸Ñ (пеÑеклÑÑÐ°ÐµÑ HEAD на ÑказаннÑй коммиÑ)
git reset HEAD filename ÑдалиÑÑ ÑказаннÑй Ñайл из индекÑа без ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑамиÑ
изменений в Ñайле Ð´Ð»Ñ Ð¿Ð¾ÑледÑÑÑей повÑоÑной индекÑаÑии (еÑли бÑл add но не бÑло commit, поÑом вÑполниÑÑ checkout)
git reset --soft HEAD^ оÑменÑÐµÑ Ð¿Ð¾Ñледний (^) коммиÑ, ÑоÑ
ÑанÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· ÑÑого коммиÑа в ÑабоÑем каÑалоге и индекÑе (подгоÑовленной облаÑÑи), можно внеÑÑи Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑÐ°Ð¹Ð»Ñ Ð¸ повÑоÑно иÑ
заÑикÑиÑоваÑÑ
git reset --hard HEAD^ полноÑÑÑÑ Ð¾ÑменÑÐµÑ Ð¿Ð¾Ñледний коммиÑ, ÑдалÑÑ Ð²Ñе его Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· ÑабоÑего каÑалога и индекÑа до ÑоÑÑоÑÐ½Ð¸Ñ Ð¿Ð¾Ñледнего коммиÑа
git reset --hard d01f09dead3a6a8d75dda848162831c58ca0ee13 оÑкаÑÑÐ²Ð°ÐµÑ HEAD к ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ ÐºÐ¾Ð¼Ð¼Ð¸ÑÑ Ð¸ ÑдалÑÐµÑ Ð²Ñе коммиÑÑ, коÑоÑÑе бÑли ÑÐ´ÐµÐ»Ð°Ð½Ñ Ð¿Ð¾Ñле него (бÑдÑÑ Ð¿Ð¾ÑеÑÑÐ½Ñ Ð²Ñе незакоммиÑеннÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ иÑÑоÑÐ¸Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñов поÑле Ñказанного)
git revert HEAD --no-edit ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð½Ð¾Ð²Ñй коммиÑ, коÑоÑÑй оÑменÑÐµÑ Ð¿Ð¾Ñледний ÐºÐ¾Ð¼Ð¼Ð¸Ñ (HEAD) и новÑй ÐºÐ¾Ð¼Ð¼Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½ повеÑÑ
него (ÑобÑÑÐ¸Ñ Ð·Ð°Ð¿Ð¸ÑÑваÑÑÑÑ Ð² git log)
git revert d01f09dead3a6a8d75dda848162831c58ca0ee13 ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð½Ð¾Ð²Ñй коммиÑ, коÑоÑÑй оÑменÑÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, внеÑеннÑе в ÑказаннÑй ÐºÐ¾Ð¼Ð¼Ð¸Ñ Ñ Ñ
еÑем (не изменÑÐµÑ Ð¸ÑÑоÑÐ¸Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñов, а ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð½Ð¾Ð²Ñй ÐºÐ¾Ð¼Ð¼Ð¸Ñ Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñми оÑменÑ)
git stash ÑоÑ
ÑанÑÐµÑ ÑекÑÑие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑÑÑÑ (вÑеменное Ñ
ÑанилиÑе) и оÑиÑÐ°ÐµÑ ÑабоÑÑÑ Ð´Ð¸ÑекÑоÑиÑ
git stash pop пÑименÑÐµÑ Ð¿Ð¾Ñледние Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· ÑÑÑÑа к ÑекÑÑей веÑке
GitHub
$user = "Lifailon"
$repository = "ReverseProxyNET"
Invoke-RestMethod https://api.github.com/users/$($user)
Invoke-RestMethod https://api.github.com/users/$($user)/repos
Invoke-RestMethod https://api.github.com/repos/$($user)/$($repository)/contents
Invoke-RestMethod https://api.github.com/repos/$($user)/$($repository)/contents/source/rpnet.cs
Invoke-RestMethod https://api.github.com/repos/$($user)/$($repository)/commits
$sha = $(Invoke-RestMethod https://api.github.com/repos/$($user)/$($repository)/commits).sha
Invoke-RestMethod https://api.github.com/repos/$($user)/$($repository)/commits/$($sha[-1])
Invoke-RestMethod "https://api.github.com/repos/$($user)/$($repository)/releases/latest"
$(Invoke-RestMethod "https://api.github.com/repos/$($user)/$($repository)/releases/latest").assets.name
$issues = Invoke-RestMethod https://api.github.com/repos/LibreHardwareMonitor/LibreHardwareMonitor/issues
$issue_number = $($issues | Where-Object title -match "PowerShell").number
Invoke-RestMethod https://api.github.com/repos/LibreHardwareMonitor/LibreHardwareMonitor/issues/$($issue_number)/comments
Invoke-RestMethod https://api.github.com/repos/LibreHardwareMonitor/LibreHardwareMonitor/pulls
Invoke-RestMethod https://api.github.com/repos/LibreHardwareMonitor/LibreHardwareMonitor/languages
Invoke-RestMethod https://api.github.com/repos/LibreHardwareMonitor/LibreHardwareMonitor/stargazers
Invoke-RestMethod https://api.github.com/repos/LibreHardwareMonitor/LibreHardwareMonitor/forks
Invoke-RestMethod https://api.github.com/repos/LibreHardwareMonitor/LibreHardwareMonitor/subscribers
DSC
Import-Module PSDesiredStateConfiguration
Get-Command -Module PSDesiredStateConfiguration
(Get-Module PSDesiredStateConfiguration).ExportedCommands
Get-DscLocalConfigurationManager
Get-DscResource
Get-DscResource -Name File -Syntax ÑинÑакÑиÑ
Ensure = Present наÑÑÑойка должна бÑÑÑ Ð²ÐºÐ»ÑÑена (каÑалог должен пÑиÑÑÑÑÑвоваÑÑ, пÑоÑеÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð·Ð°Ð¿ÑÑен, еÑли Ð½ÐµÑ â ÑоздаÑÑ, запÑÑÑиÑÑ)
Ensure = Absent наÑÑÑойка должна бÑÑÑ Ð²ÑклÑÑена (каÑалога бÑÑÑ Ð½Ðµ должно, пÑоÑеÑÑ Ð½Ðµ должен бÑÑÑ Ð·Ð°Ð¿ÑÑен, еÑли Ð½ÐµÑ â ÑдалиÑÑ, оÑÑановиÑÑ)
Configuration TestConfiguraion
{
Ctrl+Space
}
Configuration DSConfigurationProxy
{
Node vproxy-01
{
File CreateDir
{
Ensure = "Present"
Type = "Directory"
DestinationPath = "C:\Temp"
}
Service StopW32time
{
Name = "w32time"
State = "Stopped"` Running
}
WindowsProcess RunCalc
{
Ensure = "Present"
Path = "C:\WINDOWS\system32\calc.exe"
Arguments = ""
}
Registry RegSettings
{
Ensure = "Present"
Key = "HKEY_LOCAL_MACHINE\SOFTWARE\MySoft"
ValueName = "TestName"
ValueData = "TestValue"
ValueType = "String"
}
# WindowsFeature IIS
# {
# Ensure = "Present"
# Name = "Web-Server"
# }
}
}
$Path = (DSConfigurationProxy).DirectoryName
Test-DscConfiguration -Path $Path | select * ResourcesInDesiredState - Ñже наÑÑÑоено, ResourcesNotInDesiredState - не наÑÑÑоено (не ÑооÑвеÑÑÑвÑеÑ)
Start-DscConfiguration -Path $Path
Get-Job
$srv = "vproxy-01"
Get-Service -ComputerName $srv | ? name -match w32time # Start-Service
icm $srv {Get-Process | ? ProcessName -match calc} | ft # Stop-Process -Force
icm $srv {ls C:\ | ? name -match Temp} | ft rm`
Configuration InstallPowerShellCore {
Import-DscResource -ModuleName PSDesiredStateConfiguration
Node localhost {
Script InstallPowerShellCore {
GetScript = {
return @{
GetScript = $GetScript
}
}
SetScript = {
[string]$url = $(Invoke-RestMethod https://api.github.com/repos/PowerShell/PowerShell/releases/latest).assets.browser_download_url -match "win-x64.zip"
$downloadPath = "$home\Downloads\PowerShell.zip"
$installPath = "$env:ProgramFiles\PowerShell\7"
Invoke-WebRequest -Uri $url -OutFile $downloadPath
Expand-Archive -Path $downloadPath -DestinationPath $installPath -Force
}
TestScript = {
return Test-Path "$env:ProgramFiles\PowerShell\7\pwsh.exe"
}
}
}
}
$Path = (InstallPowerShellCore).DirectoryName
Test-DscConfiguration -Path $Path
Start-DscConfiguration -Path $path -Wait -Verbose
Get-Job
Ansible
apt -y update && apt -y upgrade
apt -y install ansible v2.10.8
apt -y install ansible-core v2.12.0
apt -y install sshpass
ansible-galaxy collection install ansible.windows ÑÑÑановиÑÑ ÐºÐ¾Ð»Ð»ÐµÐºÑÐ¸Ñ Ð¼Ð¾Ð´Ñлей
ansible-galaxy collection install community.windows
ansible-galaxy collection list | grep windows
ansible-config dump | grep DEFAULT_MODULE_PATH пÑÑÑ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´Ñлей
apt-get -y install python-dev libkrb5-dev krb5-user пакеÑÑ Ð´Ð»Ñ Kerberos аÑÑенÑиÑикаÑии
apt install python3-pip
pip3 install requests-kerberos
nano /etc/krb5.conf наÑÑÑоиÑÑ [realms] и [domain_realm]
kinit -C [email protected]
klist
ansible --version
config file = None
nano /etc/ansible/ansible.cfg Ñайл конÑигÑÑаÑии
[defaults]
inventory = /etc/ansible/hosts
# uncomment this to disable SSH key host checking
# ÐÑклÑÑиÑÑ Ð¿ÑовеÑÐºÑ ÐºÐ»ÑÑа ssh (Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð¸ÑполÑзÑÑ Ð¿Ð°ÑолÑ)
host_key_checking = False
Hosts
nano /etc/ansible/hosts
[us]
pi-hole-01 ansible_host=192.168.3.101
zabbix-01 ansible_host=192.168.3.102
grafana-01 ansible_host=192.168.3.103
netbox-01 ansible_host=192.168.3.104
[all:vars]
ansible_ssh_port=2121
ansible_user=lifailon
ansible_password=123098
path_user=/home/lifailon
ansible_python_interpreter=/usr/bin/python3
[ws]
huawei-book-01 ansible_host=192.168.3.99
plex-01 ansible_host=192.168.3.100
[ws:vars]
ansible_port=5985
#ansible_port=5986
ansible_user=Lifailon
#[email protected]
ansible_password=123098
ansible_connection=winrm
ansible_winrm_scheme=http
ansible_winrm_transport=basic
#ansible_winrm_transport=kerberos
ansible_winrm_server_cert_validation=ignore
validate_certs=false
[win_ssh]
huawei-book-01 ansible_host=192.168.3.99
plex-01 ansible_host=192.168.3.100
[win_ssh:vars]
ansible_python_interpreter=C:\Users\Lifailon\AppData\Local\Programs\Python\Python311\` добавиÑÑ Ð¿ÐµÑеменнÑÑ ÑÑÐµÐ´Ñ Ð¸Ð½ÑеÑпÑиÑаÑоÑа Python в Windows
ansible_connection=ssh
#ansible_shell_type=cmd
ansible_shell_type=powershell
ansible-inventory --list пÑовеÑиÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ (ÑиÑÐ°ÐµÑ Ð² ÑоÑмаÑе JSON) или YAML (-y) Ñ Ð¿ÑоÑмоÑÑом вÑе пÑименÑемÑÑ
пеÑеменнÑÑ
Win_Modules
ansible us -m ping
ansible win_ssh -m ping
ansible us -m shell -a "uptime && df -h | grep lv"
ansible us -m setup | grep -iP "mem|proc" инÑоÑмаÑÐ¸Ñ Ð¾ железе
ansible us -m apt -a "name=mc" -b повÑÑиÑÑ Ð¿Ñивилегии sudo (-b)
ansible us -m service -a "name=ssh state=restarted enabled=yes" -b пеÑезапÑÑÑиÑÑ ÑлÑжбÑ
echo "echo test" > test.sh
ansible us -m copy -a "src=test.sh dest=/root mode=777" -b
ansible us -a "ls /root" -b
ansible us -a "cat /root/test.sh" -b
ansible-doc -l | grep win_ ÑпиÑок вÑеÑ
модÑлей Windows
ansible ws -m win_ping windows модÑлÑ
ansible ws -m win_ping -u WinRM-Writer ÑказаÑÑ Ð»Ð¾Ð³Ð¸Ð½
ansible ws -m setup ÑобÑаÑÑ Ð¿Ð¾Ð´ÑобнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑиÑÑеме
ansible ws -m win_whoami инÑоÑмаÑÐ¸Ñ Ð¾ пÑаваÑ
доÑÑÑпаÑ
, гÑÑппаÑ
доÑÑÑпа
ansible ws -m win_shell -a '$PSVersionTable'
ansible ws -m win_shell -a 'Get-Service | where name -match "ssh|winrm"'
ansible ws -m win_service -a "name=sshd state=stopped"
ansible ws -m win_service -a "name=sshd state=started"
win_shell (vars/debug)
nano /etc/ansible/PowerShell-Vars.yml
- hosts: ws
` УказаÑÑ ÐºÐ¾Ð»Ð»ÐµÐºÑÐ¸Ñ Ð¼Ð¾Ð´Ñлей
collections:
- ansible.windows
` ÐадаÑÑ Ð¿ÐµÑеменнÑе
vars:
SearchName: PermitRoot
tasks:
- name: Get port ssh
win_shell: |
Get-Content "C:\Programdata\ssh\sshd_config" | Select-String "{{SearchName}}"
` ÐеÑедаÑÑ Ð²Ñвод в пеÑеменнÑÑ
register: command_output
- name: Output port ssh
` ÐÑвеÑÑи пеÑеменнÑÑ Ð½Ð° ÑкÑан
debug:
var: command_output.stdout_lines
ansible-playbook /etc/ansible/PowerShell-Vars.yml
ansible-playbook /etc/ansible/PowerShell-Vars.yml --extra-vars "SearchName='LogLevel|Syslog'" пеÑедаÑÑ Ð¿ÐµÑеменнÑÑ
win_powershell
nano /etc/ansible/powershell-param.yml
- hosts: ws
tasks:
- name: Run PowerShell script with parameters
ansible.windows.win_powershell:
parameters:
Path: C:\Temp
Force: true
script: |
[CmdletBinding()]
param (
[String]$Path,
[Switch]$Force
)
New-Item -Path $Path -ItemType Directory -Force:$Force
ansible-playbook /etc/ansible/powershell-param.yml
win_chocolatey
nano /etc/ansible/setup-adobe-acrobat.yml
- hosts: ws
tasks:
- name: Install Acrobat Reader
win_chocolatey:
name: adobereader
state: present
ansible-playbook /etc/ansible/setup-adobe-acrobat.yml
nano /etc/ansible/setup-openssh.yml
- hosts: ws
tasks:
- name: install the Win32-OpenSSH service
win_chocolatey:
name: openssh
package_params: /SSHServerFeature
state: present
ansible-playbook /etc/ansible/setup-openssh.yml
win_regedit
nano /etc/ansible/win-set-shell-ssh-ps7.yml
- hosts: ws
tasks:
- name: Set the default shell to PowerShell 7 for Windows OpenSSH
win_regedit:
path: HKLM:\SOFTWARE\OpenSSH
name: DefaultShell
` data: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
data: 'C:\Program Files\PowerShell\7\pwsh.exe'
type: string
state: present
ansible-playbook /etc/ansible/win-set-shell-ssh-ps7.yml
win_service
nano /etc/ansible/win-service.yml
- hosts: ws
tasks:
- name: Start service
win_service:
name: sshd
state: started
# state: stopped
# state: restarted
# start_mode: auto
ansible-playbook /etc/ansible/win-service.yml
win_service_info
nano /etc/ansible/get-service.yml
- hosts: ws
tasks:
- name: Get info for a single service
win_service_info:
name: sshd
register: service_info
- name: Print returned information
ansible.builtin.debug:
var: service_info.services
ansible-playbook /etc/ansible/get-service.yml
fetch/slurp
nano /etc/ansible/copy-from-win-to-local.yml
- hosts: ws
tasks:
- name: Retrieve remote file on a Windows host
# СкопиÑоваÑÑ Ñайл из Windows-ÑиÑÑемÑ
ansible.builtin.fetch:
# ÐÑоÑиÑаÑÑ Ñайл (пеÑедаÑÑ Ð² памÑÑÑ Ð² ÑоÑмаÑе Base64)
# ansible.builtin.slurp:
src: C:\Telegraf\telegraf.conf
dest: /root/telegraf.conf
flat: yes
register: telegraf_conf
- name: Print returned information
ansible.builtin.debug:
msg: "{{ telegraf_conf['content'] | b64decode }}"
ansible-playbook /etc/ansible/copy-from-win-to-local.yml
win_copy
echo "Get-Service | where name -eq vss | Start-Service" > /home/lifailon/Start-Service-VSS.ps1
nano /etc/ansible/copy-file-to-win.yml
- hosts: ws
tasks:
- name: Copy file to win hosts
win_copy:
src: /home/lifailon/Start-Service-VSS.ps1
dest: C:\Users\Lifailon\Desktop\Start-Service-VSS.ps1
ansible-playbook /etc/ansible/copy-file-to-win.yml
curl -OL https://github.com/PowerShell/PowerShell/releases/download/v7.3.6/PowerShell-7.3.6-win-x64.msi
nano /etc/ansible/copy-file-to-win.yml
- hosts: ws
tasks:
- name: Copy file to win hosts
win_copy:
src: /home/lifailon/PowerShell-7.3.6-win-x64.msi
dest: C:\Install\PowerShell-7.3.6.msi
ansible-playbook /etc/ansible/copy-file-to-win.yml
win_command
nano /etc/ansible/run-script-ps1.yml
- hosts: ws
tasks:
- name: Run PowerShell Script
win_command: powershell -ExecutionPolicy ByPass -File C:\Users\Lifailon\Desktop\Start-Service-VSS.ps1
ansible-playbook /etc/ansible/run-script-ps1.yml
win_package
nano /etc/ansible/setup-msi-package.yml
- hosts: ws
tasks:
- name: Install MSI Package
win_package:
# path: C:\Install\7z-23.01.msi
path: C:\Install\PowerShell-7.3.6.msi
arguments:
- /quiet
- /passive
- /norestart
ansible-playbook /etc/ansible/setup-msi-package.yml
win_firewall_rule
nano /etc/ansible/win-fw-open.yml
- hosts: ws
tasks:
- name: Open RDP port
win_firewall_rule:
name: Open RDP port
localport: 3389
action: allow
direction: in
protocol: tcp
state: present
enabled: yes
ansible-playbook /etc/ansible/win-fw-open.yml
win_group
nano /etc/ansible/win-creat-group.yml
- hosts: ws
tasks:
- name: Create a new group
win_group:
name: deploy
description: Deploy Group
state: present
ansible-playbook /etc/ansible/win-creat-group.yml
win_group_membership
nano /etc/ansible/add-user-to-group.yml
- hosts: ws
tasks:
- name: Add a local and domain user to a local group
win_group_membership:
name: deploy
members:
- WinRM-Writer
state: present
ansible-playbook /etc/ansible/add-user-to-group.yml
win_user
nano /etc/ansible/creat-win-user.yml
- hosts: ws
tasks:
- name: Creat user
win_user:
name: test
password: 123098
state: present
groups:
- deploy
ansible-playbook /etc/ansible/creat-win-user.yml
nano /etc/ansible/delete-win-user.yml
- hosts: ws
tasks:
- name: Delete user
ansible.windows.win_user:
name: test
state: absent
ansible-playbook /etc/ansible/delete-win-user.yml
win_feature
nano /etc/ansible/install-feature.yml
- hosts: ws
tasks:
- name: Install Windows Feature
win_feature:
name: SNMP-Service
state: present
ansible-playbook /etc/ansible/install-feature.yml
win_reboot
nano /etc/ansible/win-reboot.yml
- hosts: ws
tasks:
- name: Reboot a slow machine that might have lots of updates to apply
win_reboot:
reboot_timeout: 3600
ansible-playbook /etc/ansible/win-reboot.yml
win_find
nano /etc/ansible/win-ls.yml
- hosts: ws
tasks:
- name: Find files in multiple paths
ansible.windows.win_find:
paths:
- D:\Install\OpenSource
patterns: ['*.rar','*.zip','*.msi']
` Файл ÑозданнÑй менее 7 дней назад
age: -7d
` Ð Ð°Ð·Ð¼ÐµÑ Ñайла болÑÑе 10MB
size: 10485760
` РекÑÑÑивнÑй поиÑк (в доÑеÑниÑ
диÑекÑоÑиÑÑ
)
recurse: true
register: command_output
- name: Output
debug:
var: command_output
ansible-playbook /etc/ansible/win-ls.yml
win_uri
nano /etc/ansible/rest-get.yml
- hosts: ws
tasks:
- name: REST GET request to endpoint github
ansible.windows.win_uri:
url: https://api.github.com/repos/Lifailon/pSyslog/releases/latest
register: http_output
- name: Output
debug:
var: http_output
ansible-playbook /etc/ansible/rest-get.yml
win_updates
nano /etc/ansible/win-update.yml
- hosts: ws
tasks:
- name: Install only particular updates based on the KB numbers
ansible.windows.win_updates:
category_names:
- SecurityUpdates
- CriticalUpdates
- UpdateRollups
- Drivers
` ФилÑÑÑаÑиÑ
` accept_list:
` - KB2267602
` ÐоиÑк обновлений
` state: searched
` ÐагÑÑзиÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ
` state: downloaded
` УÑÑановиÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ
state: installed
log_path: C:\Ansible-Windows-Upadte-Log.txt
reboot: false
register: wu_output
- name: Output
debug:
var: wu_output
ansible-playbook /etc/ansible/win-update.yml
win_chocolatey
- name: Ensure Chocolatey installed from internal repo
win_chocolatey:
name: chocolatey
state: present
# source: URL-адÑÐµÑ Ð²Ð½ÑÑÑеннего ÑепозиÑоÑиÑ
source: https://community.chocolatey.org/api/v2/ChocolateyInstall.ps1
GigaChat
1. УÑÑановка ÑеÑÑиÑикаÑов:
Invoke-WebRequest "https://gu-st.ru/content/lending/russian_trusted_root_ca_pem.crt" -OutFile "$home\Downloads\russian_trusted_root_ca.cer" ÑкаÑаÑÑ ÑеÑÑиÑÐ¸ÐºÐ°Ñ Ð¼Ð¸Ð½ÑиÑÑÑ
Invoke-WebRequest "https://gu-st.ru/content/lending/russian_trusted_sub_ca_pem.crt" -OutFile "$home\Downloads\russian_trusted_sub_ca.cer"
Import-Certificate -FilePath "$home\Downloads\russian_trusted_root_ca.cer" -CertStoreLocation "Cert:\CurrentUser\Root" ÑÑÑановиÑÑ ÑеÑÑиÑÐ¸ÐºÐ°Ñ Ð¼Ð¸Ð½ÑиÑÑÑ
Import-Certificate -FilePath "$home\Downloads\russian_trusted_sub_ca.cer" -CertStoreLocation "Cert:\CurrentUser\CA"
2. ÐвÑоÑизаÑÐ¸Ñ Ð¿Ð¾ Sber ID и генеÑаÑÐ¸Ñ Ð½Ð¾Ð²ÑÑ Ð°Ð²ÑоÑизаÑионнÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ñокена: Developers (вÑÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ 30 минÑÑ)
3. ФоÑмиÑование авÑоÑизаÑионнÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð² ÑоÑмаÑе Base64 из Client ID и Client Secret:
$Client_ID = "7e6d2f9f-825e-49b7-98f4-62fbb7506427" # [System.Guid]::Parse("7e6d2f9f-825e-49b7-98f4-62fbb7506427")
$Client_Secret = "c35113ee-6757-47ba-9853-ea1d0d9db1ef" # [System.Guid]::Parse("c35113ee-6757-47ba-9853-ea1d0d9db1ef")
$Client_Join = $Client_ID+":"+$Client_Secret # обÑединÑем два UUID в Ð¾Ð´Ð½Ñ ÑÑÑокÑ, ÑазделÑÑ Ð¸Ñ
Ñимволом ':'
$Bytes = [System.Text.Encoding]::UTF8.GetBytes($Client_Join) # пÑеобÑазÑем ÑÑÑÐ¾ÐºÑ Ð² маÑÑив байÑ
$Cred_Base64 = [Convert]::ToBase64String($Bytes) # кодиÑÑем байÑÑ Ð² ÑÑÑÐ¾ÐºÑ Base64
4. ÐолÑÑение Ñокена:
$Cred_Base64 = "N2U2ZDJmOWYtODI1ZS00OWI3LTk4ZjQtNjJmYmI3NTA2NDI3OmIyYzgwZmZmLTEzOGUtNDg1Mi05MjgwLWE2MGI4NTc0YTM2MQ=="
$UUID = [System.Guid]::NewGuid() генеÑиÑÑем UUID Ð´Ð»Ñ Ð¶ÑÑналиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñ
одÑÑиÑ
вÑзовов и ÑазбоÑа инÑиденÑов
$url = "https://ngw.devices.sberbank.ru:9443/api/v2/oauth"
$headers = @{
"Authorization" = "Basic $Cred_Base64"
"RqUID" = "$UUID"
"Content-Type" = "application/x-www-form-urlencoded"
}
$body = @{
scope = "GIGACHAT_API_PERS"
}
$GIGA_TOKEN = $(Invoke-RestMethod -Uri $url -Method POST -Headers $headers -Body $body).access_token
5. ÐаÑамеÑÑÑ:
[string]$content = "ÐоÑÑиÑай ÑÑÐ¼Ð¼Ñ ÑиÑел: 22+33"
[string]$role = "user" # ÑÐ¾Ð»Ñ Ð°Ð²ÑоÑа ÑообÑÐµÐ½Ð¸Ñ (user/assistant/system)
[float]$temperature = 0.7 # ÑемпеÑаÑÑÑа вÑбоÑки в диапазоне Ð¾Ñ 0 до 2. Чем вÑÑе знаÑение, Ñем более ÑлÑÑайнÑм бÑÐ´ÐµÑ Ð¾ÑÐ²ÐµÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸.
[float]$top_p = 0.1 # иÑполÑзÑеÑÑÑ ÐºÐ°Ðº алÑÑеÑнаÑива temperature и изменÑеÑÑÑ Ð² диапазоне Ð¾Ñ 0 до 1. ÐÐ°Ð´Ð°ÐµÑ Ð²ÐµÑоÑÑноÑÑнÑÑ Ð¼Ð°ÑÑÑ Ñокенов, коÑоÑÑе должна ÑÑиÑÑваÑÑ Ð¼Ð¾Ð´ÐµÐ»Ñ. Так, еÑли пеÑедаÑÑ Ð·Ð½Ð°Ñение 0.1, Ð¼Ð¾Ð´ÐµÐ»Ñ Ð±ÑÐ´ÐµÑ ÑÑиÑÑваÑÑ ÑолÑко ÑокенÑ, ÑÑÑ Ð²ÐµÑоÑÑноÑÑÐ½Ð°Ñ Ð¼Ð°ÑÑа вÑ
Ð¾Ð´Ð¸Ñ Ð² веÑÑ
ние 10%.
[int64]$n = 1 # колиÑеÑÑво ваÑианÑов оÑвеÑов (1..4), коÑоÑÑе нÑжно ÑгенеÑиÑоваÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ вÑ
одного ÑообÑениÑ
[int64]$max_tokens = 512 # макÑималÑное колиÑеÑÑво Ñокенов, коÑоÑÑе бÑдÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾ÑвеÑов
[boolean]$stream = $false # пеÑедаваÑÑ ÑообÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑаÑÑÑм в поÑоке
6. СоÑÑавление запÑоÑов:
$url = "https://gigachat.devices.sberbank.ru/api/v1/chat/completions"
$headers = @{
"Authorization" = "Bearer $GIGA_TOKEN"
"Content-Type" = "application/json"
}
$(Invoke-RestMethod -Uri "https://gigachat.devices.sberbank.ru/api/v1/models" -Headers $headers).data # ÑпиÑок доÑÑÑпнÑÑ
моделей
$body = @{
model = "GigaChat:latest"
messages = @(
@{
role = $role
content = $content
}
)
temperature = $temperature
n = $n
max_tokens = $max_tokens
stream = $stream
} | ConvertTo-Json
$Request = Invoke-RestMethod -Method POST -Uri $url -Headers $headers -Body $body
$Request.choices.message.content
Curl
УÑÑановка ÑеÑÑиÑикаÑов в Ubuntu:
wget https://gu-st.ru/content/lending/russian_trusted_root_ca_pem.crt
wget https://gu-st.ru/content/lending/russian_trusted_sub_ca_pem.crt
mkdir /usr/local/share/ca-certificates/russian_trusted
cp russian_trusted_root_ca_pem.crt russian_trusted_sub_ca_pem.crt /usr/local/share/ca-certificates/russian_trusted
update-ca-certificates -v
wget -qS --spider --max-redirect=0 https://www.sberbank.ru
ÐолÑÑение Ñокена:
Cred_Base64="N2U2ZDJmOWYtODI1ZS00OWI3LTk4ZjQtNjJmYmI3NTA2NDI3OmIyYzgwZmZmLTEzOGUtNDg1Mi05MjgwLWE2MGI4NTc0YTM2MQ=="
UUID=$(uuidgen)
GIGA_TOKEN=$(curl -s --location --request POST "https://ngw.devices.sberbank.ru:9443/api/v2/oauth" \
--header "Authorization: Basic $Cred_Base64" \
--header "RqUID: $UUID" \
--header "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode 'scope=GIGACHAT_API_PERS' | jq -r .access_token)
curl -s --location "https://gigachat.devices.sberbank.ru/api/v1/models" --header "Authorization: Bearer $GIGA_TOKEN" | jq . Ð´Ð»Ñ Ð¿ÑовеÑки
СоÑÑавление запÑоÑа:
request=$(curl -s https://gigachat.devices.sberbank.ru/api/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $GIGA_TOKEN" \
-d '{
"model": "GigaChat:latest",
"messages": [
{
"role": "user",
"content": "Ðогда Ñже ÐРзаÑ
ваÑÐ¸Ñ ÑÑÐ¾Ñ Ð¼Ð¸Ñ?"
}
],
"temperature": 0.7
}')
echo $request | jq -r .choices[].message.content
YandexGPT
ÐолÑÑиÑÑ OAuth-Token:
Create AIM Token вÑÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ IAM-Ñокена не болÑÑе 12 ÑаÑов
yandexPassportOauthToken="y0_AgAAAAAGaLFLAATuwQAAAAD3xtRLQE4hvlazQ5euKO43XXXXXXXXXXX" Ð´Ð»Ñ bash
$yandexPassportOauthToken = "y0_AgAAAAAGaLFLAATuwQAAAAD3xtRLQE4hvlazQ5euKO43XXXXXXXXXXX" Ð´Ð»Ñ PowerShell
ÐбменÑÑÑ OAuth-Token на IAM-Token:
IAM_TOKEN=$(curl -s -d "{\"yandexPassportOauthToken\":\"$yandexPassportOauthToken\"}" "https://iam.api.cloud.yandex.net/iam/v1/tokens" | jq -r .iamToken)
$IAM_TOKEN = $(Invoke-RestMethod -Method POST -Uri "https://iam.api.cloud.yandex.net/iam/v1/tokens" -Body $(@{yandexPassportOauthToken = "$yandexPassportOauthToken"} | ConvertTo-Json -Compress)).iamToken
ÐолÑÑиÑÑ FOLDER_ID:
CLOUD_ID=$(curl -s -H "Authorization: Bearer $IAM_TOKEN" https://resource-manager.api.cloud.yandex.net/resource-manager/v1/clouds | jq -r .clouds[].id) # полÑÑиÑÑ cloud id
curl -s --request GET -H "Authorization: Bearer $IAM_TOKEN" https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders -d "{\"cloudId\": \"$CLOUD_ID\"}" # полÑÑиÑÑ ÑпиÑок диÑекÑоÑий в облаке
curl -s --request POST -H "Authorization: Bearer $IAM_TOKEN" https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders -d "{\"cloudId\": \"$CLOUD_ID\", \"name\": \"test\"}" # ÑоздаÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ Ð² облаке
FOLDER_ID=$(curl -s --request GET -H "Authorization: Bearer $IAM_TOKEN" https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders -d '{"cloudId": "b1gf9n6heihqj0pt5piu"}' | jq -r '.folders[] | select(.name == "test") | .id') # забÑаÑÑ id диÑекÑоÑии
$CLOUD_ID = $(Invoke-RestMethod -Method Get -Uri "https://resource-manager.api.cloud.yandex.net/resource-manager/v1/clouds" -Headers @{"Authorization"="Bearer $IAM_TOKEN"; "Content-Type"="application/json"}).clouds.id
$FOLDER_ID = $(Invoke-RestMethod -Method Get -Uri "https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders" -Headers @{"Authorization"="Bearer $IAM_TOKEN"; "Content-Type"="application/json"} -Body (@{"cloudId"= $CLOUD_ID} | ConvertTo-Json)).folders | Where-Object name -eq test | Select-Object -ExpandProperty id
СоÑÑавление запÑоÑа:
model="gpt://$FOLDER_ID/yandexgpt/latest" # https://cloud.yandex.ru/ru/docs/yandexgpt/concepts/models
body=$(cat <<EOF
{
"modelUri": "$model",
"completionOptions": {
"stream": false,
"temperature": 0.6,
"maxTokens": 2000
},
"messages": [
{
"role": "user",
"text": "ÐоÑÑиÑай ÑÑÐ¼Ð¼Ñ 22+33"
}
]
}
EOF)
curl --request POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $IAM_TOKEN" \
-H "x-folder-id: $FOLDER_ID" \
-d "$body" \
"https://llm.api.cloud.yandex.net/foundationModels/v1/completion"
$model = "gpt://$FOLDER_ID/yandexgpt/latest"
$body = @"
{
"modelUri": "$model",
"completionOptions": {
"stream": false,
"temperature": 0.6,
"maxTokens": 2000
},
"messages": [
{
"role": "user",
"text": "ÐоÑÑиÑай ÑÑÐ¼Ð¼Ñ 22+33"
}
]
}
"@
Invoke-RestMethod -Method POST -Uri "https://llm.api.cloud.yandex.net/foundationModels/v1/completion" -Headers @{"Content-Type"="application/json"; "Authorization"="Bearer $IAM_TOKEN"; "x-folder-id"="$FOLDER_ID"} -Body $body
SuperAGI
Source
Playground generate
API Doc (exaples)
SUPERAGI_API_KEY="31f72164129XXXXX"
prompt="поÑÑиÑай ÑÑÐ¼Ð¼Ñ 22+33, дай ÑолÑко оÑÐ²ÐµÑ Ð±ÐµÐ· лиÑнего ÑекÑÑа"
request=$(curl -s -X POST 'https://api.superagi.com/v1/generate/65437cbf227a4018516ad1ce' \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $SUPERAGI_API_KEY" \
-d '{
"prompt": ["$prompt"],
"max_tokens": 500,
"temperature": 0.9,
"top_p": 0.15,
"repetition_penalty": 0,
"best_of": 1.05,
"top_k": 50,
"stream": false
}')
echo $request | sed "s/data: //" | jq -r .choices[].text
$SUPERAGI_API_KEY = "31f72164129XXXXX"
$prompt = "поÑÑиÑай ÑÑÐ¼Ð¼Ñ 22+33, дай ÑолÑко оÑÐ²ÐµÑ Ð±ÐµÐ· лиÑнего ÑекÑÑа"
$request = Invoke-RestMethod -Method Post -Uri 'https://api.superagi.com/v1/generate/65437cbf227a4018516ad1ce' -Headers @{
'Content-Type' = 'application/json'
'Authorization' = "Bearer $SUPERAGI_API_KEY"
} -Body (@{
prompt = @($prompt)
max_tokens = 500
temperature = 0.9
top_p = 0.15
repetition_penalty = 0
best_of = 1.05
top_k = 50
stream = $false
} | ConvertTo-Json)
$($request -replace "^data: " | ConvertFrom-Json).choices.text
Replicate
REPLICATE_API_TOKEN="r8_STyeUNXiGonkLfxE1FSKaqll26lXXXXXXXXXX"
prompt="ÐиÑÐ°Ñ Ð² полоÑÐºÑ Ð·ÐµÐ±ÑÑ"
request=$(curl -s -X POST \
-H "Authorization: Token $REPLICATE_API_TOKEN" \
-H "Content-Type: application/json" \
-d $'{
"version": "ac732df83cea7fff18b8472768c88ad041fa750ff7682a21affe81863cbe77e4",
"input": {
"prompt": "$prompt"
}
}' \
https://api.replicate.com/v1/predictions)
request_url=$(echo $request | jq -r .urls.get)
response_status=$(curl -s -H "Authorization: Token $REPLICATE_API_TOKEN" $request_url | jq -r .status)
while [[ $response_status != succeeded ]]; do
response_status=$(curl -s -H "Authorization: Token $REPLICATE_API_TOKEN" $request_url | jq -r .status)
done
curl -s -H "Authorization: Token $REPLICATE_API_TOKEN" $request_url | jq -r .output[]
$REPLICATE_API_TOKEN = "r8_STyeUNXiGonkLfxE1FSKaqll26lXXXXXXXXXX"
$prompt = "ÐиÑÐ°Ñ Ð² полоÑÐºÑ Ð·ÐµÐ±ÑÑ"
$body = @{
version = "ac732df83cea7fff18b8472768c88ad041fa750ff7682a21affe81863cbe77e4"
input = @{
prompt = $prompt
}
} | ConvertTo-Json
$headers = @{
"Authorization" = "Token $REPLICATE_API_TOKEN"
"Content-Type" = "application/json"
}
$request = Invoke-RestMethod -Uri "https://api.replicate.com/v1/predictions" -Method POST -Body $body -Headers $headers
$response = Invoke-RestMethod $($request.urls.get) -Headers @{"Authorization" = "Token $REPLICATE_API_TOKEN"}
while ($response.status -ne "succeeded") {
$response = Invoke-RestMethod $($request.urls.get) -Headers @{"Authorization" = "Token $REPLICATE_API_TOKEN"}
}
$response.output
Google-Filter
https://www.google.com/search?q=the+rookie+2018+imdb ÑоÑÐ¼Ð°Ñ url-запÑоÑа поиÑка Ñ Ð¿Ñобелами
https://www.google.com/search?q=the+rookie+2018+site:imdb.com поиÑк по ÑайÑÑ
https://www.google.com/search?q=the+rookie+intitle:index.of+"last modified"+(mkv|avi) иÑкаÑÑ ÑÑÑаниÑÑ, на коÑоÑÑÑ
Ñказано "last modified" (поÑледние изменениÑ), заголовок ÑÑÑаниÑÑ ÑеÑез ÑаÑÑиÑеннÑй опеÑаÑÐ¾Ñ Ð¿Ð¾Ð¸Ñка (вÑе пеÑеÑиÑленнÑе Ñлова Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑÑÑеÑаÑÑÑÑ Ð² заголовке) ÑодеÑÐ¶Ð¸Ñ Ñлово "index.of" (ÑказÑÐ²Ð°ÐµÑ Ð½Ð° диÑекÑоÑÐ¸Ñ Ð½Ð° веб-ÑеÑвеÑе, коÑоÑÐ°Ñ ÑодеÑÐ¶Ð¸Ñ ÑпиÑок Ñайлов) и иÑкаÑÑ ÑÐ°Ð¹Ð»Ñ Ñ ÑаÑÑиÑениÑми .mkv или (|) .avi
https://www.google.com/search?q=the+rookie+2018+filetype:torrent
инÑÑÑÑкÑÐ¸Ñ gopro hero 11 filetype:pdf иÑкаÑÑ ÑÑÐ°Ð·Ñ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ (на ÑÑÑаниÑе .pdf или загÑÑзка)
"дейÑÑвиÑ/глаголÑ, ÑÑвеÑжденнÑе Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² командлеÑаÑ
" иÑкаÑÑ Ð¿Ð¾ ÑÑазе Ñеликом, без ÑÐ°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ð½Ð° оÑделÑнÑе Ñлова
"ÑгÑÐ°Ñ ÑкоÑоÑÑÑ -живоÑное -xe -xj" Ñзнаем ÑкоÑоÑÑÑ Ð¯Ð³ÑаÑа, иÑклÑÑаем живоÑное и модели авÑомобилÑ
"intitle:лÑÑÑие ÑилÑÐ¼Ñ 2023" запÑÐ¾Ñ Ð¸ÑÐµÑ ÑÑÑаниÑÑ, заголовки (title HTML докÑменÑа) коÑоÑÑÑ
ÑодеÑÐ¶Ð°Ñ Ñлова "лÑÑÑие", "ÑилÑмÑ" и "2023" (вÑе Ñлова Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð² заголовке)
"allintitle:лÑÑÑие ÑилÑÐ¼Ñ 2023" запÑÐ¾Ñ Ð¸ÑÐµÑ ÑÑÑаниÑÑ, заголовки (title HTML докÑменÑа) коÑоÑÑÑ
ÑодеÑÐ¶Ð°Ñ Ñлова "лÑÑÑие", "ÑилÑмÑ" или "2023" (одно из)
"intext:telegram Ð±Ð¾Ñ powershell" поиÑк ÑÑÑаниÑ, ÑодеÑжаÑиÑ
Ñказанное клÑÑевое Ñлово в ÑекÑÑе ÑÑÑаниÑÑ (а не ÑолÑко в заголовке)
"inurl:lifailon" поиÑк ÑÑÑаниÑ, в URL коÑоÑÑÑ
ÑодеÑжиÑÑÑ Ñказанное клÑÑевое Ñлово
intitle:index.of "game of thrones" mkv daterange:2010..2015 ÑилÑÑÑаÑÐ¸Ñ Ð¿Ð¾ даÑе изменениÑ, опеÑаÑÐ¾Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ Ð´Ð°Ñ Ð² ÑоÑмаÑе YYYYMMDD..YYYYMMDD
intitle:index.of "game of thrones" mkv after:2015 огÑаниÑиÑÑ ÑезÑлÑÑаÑÑ Ð¿Ð¾Ð¸Ñка Ñайлов, измененнÑÑ
до (before) или поÑле (after) Ñказанной даÑÑ
intitle:index.of "game of thrones" mkv from:2010 to:2015 ÑилÑÑÑаÑÐ¸Ñ Ð¿Ð¾ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ Ð´Ð°Ñ
https://www.google.com/search?q=the-rookie-2018+site:imdb.com&btnI ÑедиÑÐµÐºÑ Ð½Ð° пеÑвÑй url
Google-API
Google-Translate
$Key = "<TOKEN_API>" # полÑÑиÑÑ Ñокен: https://console.cloud.google.com/apis/credentials
$Text = "You can see in the right corner how long each translation request takes (this does not depend on the amount of text being transferred)."
$LanguageTarget = "RU"
$LanguageSource = "EN"
$url = "https://translation.googleapis.com/language/translate/v2?key=$key"
$Header = @{
"Content-Type" = "application/json"
}
$Body = @{
"q" = "$Text"
"target" = "$LanguageTarget"
"source" = "$LanguageSource"
} | ConvertTo-Json
$WebClient = New-Object System.Net.WebClient
foreach ($key in $Header.Keys) {
$WebClient.Headers.Add($key, $Header[$key])
}
$Response = $WebClient.UploadString($url, "POST", $Body) | ConvertFrom-Json
$Response.data.translations.translatedText
Google-Search
$Key = "<TOKEN_API>" # полÑÑиÑÑ Ñокен: https://developers.google.com/custom-search/v1/overview?hl=ru (полÑзоваÑелÑÑкий поиÑк JSON API пÑедоÑÑавлÑÐµÑ 100 поиÑковÑÑ
запÑоÑов в Ð´ÐµÐ½Ñ Ð±ÐµÑплаÑно)
$cx = "35c78340f49eb474a" # ÑоздаÑÑ Ð¿Ð¾Ð¸ÑковÑÑ ÑиÑÑÐµÐ¼Ñ https://programmablesearchengine.google.com/controlpanel/all
$Query = "как ÑоздаÑÑ Ð±Ð¾Ñа discord"
$Lang = "ru"
$Num = 10
$Start = 0
$response = Invoke-RestMethod "https://www.googleapis.com/customsearch/v1?q=$Query&key=$Key&cx=$cx&lr=lang_$Lang&num=$Num&$start=$Start"
$response.items | Select-Object title,snippet,displayLink,link | Format-List
RapidAPI
$Key = "<TOKEN_API>"
$headers=@{}
$headers.Add("X-RapidAPI-Key", "$Key")
$headers.Add("X-RapidAPI-Host", "google-search72.p.rapidapi.com")
$query = "как ÑоздаÑÑ Ð±Ð¾Ñа discord"
$response = Invoke-RestMethod "https://google-search72.p.rapidapi.com/search?q=$query%20gitgub&gl=us&lr=lang_ru&num=20&start=0" -Method GET -Headers $headers
$response.items | Select-Object title,snippet,displayLink,link | Format-List
IMDb
$key = "<TOKEN_API>" # 500 запÑоÑов в меÑÑÑ
$query="Break"
$headers=@{}
$headers.Add("X-RapidAPI-Key", "$key")
$headers.Add("X-RapidAPI-Host", "imdb8.p.rapidapi.com")
$response = Invoke-RestMethod "https://imdb8.p.rapidapi.com/title/find?q=$query" -Method GET -Headers $headers
$response.results | select title,titletype,year,runningTimeInMinutes,id | Format-Table
"https://www.imdb.com$($response.results.id[0])"
$response.results.principals # акÑеÑÑ
$response.results.image
MoviesDatabase
$key = "<TOKEN_API>"
$imdb_id = "tt0455275"
$headers=@{}
$headers.Add("X-RapidAPI-Key", "$key")
$headers.Add("X-RapidAPI-Host", "moviesdatabase.p.rapidapi.com")
$response = Invoke-RestMethod "https://moviesdatabase.p.rapidapi.com/titles/$imdb_id" -Method GET -Headers $headers
$response.results
TMDB
$TOKEN = "548e444e7812575caa0a7eXXXXXXXXXX"
$Endpoint = "search/tv" # поиÑк ÑеÑиала (tv) и ÑилÑма (movie) по названиÑ
$Query = "зимоÑодок"
$url = $("https://api.themoviedb.org/3/$Endpoint"+"?api_key=$TOKEN&query=$Query")
$(Invoke-RestMethod -Uri $url -Method Get).results
$id = $(Invoke-RestMethod -Uri $url -Method Get).results.id # забÑаÑÑ id ÑеÑиала (210865) https://www.themoviedb.org/tv/210865
$Endpoint = "tv/$id" # полÑÑение инÑоÑмаÑии о ÑеÑиале по его ID
$url = $("https://api.themoviedb.org/3/$Endpoint"+"?api_key=$TOKEN")
$(Invoke-RestMethod -Uri $url -Method Get) # ÑпиÑок Ñезонов (.seasons), колиÑеÑÑво Ñпизодов (.seasons.episode_count)
(Invoke-RestMethod -Uri "https://api.themoviedb.org/3/tv/$id/season/2?api_key=$Token" -Method Get).episodes # вÑвеÑÑи 2 Ñезон
Invoke-RestMethod -Uri "https://api.themoviedb.org/3/tv/$id/season/2/episode/8?api_key=$Token" -Method Get # вÑвеÑÑи 8 Ñпизод
OMDb
ÐолÑÑение API клÑÑа по email
$API_KEY = "XXXXXXXX"
$IMDb_ID = "tt7587890"
curl -s "https://omdbapi.com/?apikey=$($API_KEY)&i=$($IMDb_ID)" | jq .
curl -s "https://omdbapi.com/?apikey=$($API_KEY)&i=$($IMDb_ID)" | ConvertFrom-Json
Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&s=The Rookie"
Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&t=The Rookie" поиÑк по Title
Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&t=The Rookie&y=1990" поиÑк по Title и Ð³Ð¾Ð´Ñ Ð²ÑÑ
ода
Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&t=The Rookie&type=movie" поиÑк ÑолÑко ÑилÑма (movie) или ÑеÑиала (series)
$(Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&s=The Rookie").Search поиÑк вÑеÑ
Ñовпадений (ÑилÑÐ¼Ñ Ð¸ ÑеÑиалÑ)
ivi
Invoke-RestMethod https://api.ivi.ru/mobileapi/categories ÑпиÑок каÑегоÑий и жанÑов (genres/meta_genres)
Invoke-RestMethod https://api.ivi.ru/mobileapi/collections подбоÑки
(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.seasons.number кол-во Ñезонов
(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.seasons[1].episode_count кол-во ÑеÑий во вÑоÑом Ñезоне
(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.seasons[1].ivi_release_info.date_interval_min даÑа вÑÑ
ода ÑледÑÑÑей ÑеÑии
(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.kp_rating ÑейÑинг в ÐинопоиÑк (8.04)
$id = (Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.kp_id полÑÑиÑÑ id в ÐинопоиÑк (5106881)
id=$(curl -s https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok | jq .result[].kp_id) полÑÑиÑÑ id в ÐинопоиÑк
Kinopoisk
id=5106881
get=$(curl -s https://www.kinopoisk.ru/film/$id/episodes/)
printf "%s\n" "${get[@]}" | grep -A 1 "Сезон 2" | grep "Ñпизодов" | sed -r "s/^.+\: //" # колиÑеÑÑво Ñпиздовод во вÑоÑом Ñезоне
kinopoisk.dev
ÐолÑÑиÑÑ Ñокен
ÐокÑменÑаÑÐ¸Ñ Ð¿Ð¾ API в ÑоÑмаÑе OpenAPI
GET /v1.4/movie/{id} поиÑк по id
$id = 5106881
$API_KEY = "ZYMNJJA-0J8MNPN-PB4N7R7-XXXXXXX"
$Header = @{
"accept" = "application/json"
"X-API-KEY" = "$API_KEY"
}
$irm = Invoke-RestMethod "https://api.kinopoisk.dev/v1.4/movie/$id" -Method GET -Headers $Header
$irm.rating.kp # ÑейÑинг в ÐинопоиÑк (8,079)
$irm.seasonsInfo # колиÑеÑÑво Ñезонов и Ñпизодов в ниÑ
id=5106881
API_KEY="ZYMNJJA-0J8MNPN-PB4N7R7-XXXXXXX"
get=$(curl -s -X GET \
"https://api.kinopoisk.dev/v1.4/movie/$id" \
-H "accept: application/json" \
-H "X-API-KEY: $API_KEY")
echo $get | jq .rating.kp # ÑейÑинг в ÐинопоиÑк (8,079)
echo $get | jq .seasonsInfo[1].episodesCount # колиÑеÑÑво Ñпизодов во вÑоÑом [1] Ñезоне (6)
GET /v1.4/movie/search
query="zimorodok"
page=1 # кол-во ÑÑÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð²ÑбоÑки
limit=1 # кол-во ÑлеменÑов на ÑÑÑаниÑе
curl -s -X GET \
"https://api.kinopoisk.dev/v1.4/movie/search?page=$page&limit=$limit&query=$query" \
-H "accept: application/json" \
-H "X-API-KEY: $API_KEY" | jq .
limit=5
request=$(curl -s -X GET \
"https://api.kinopoisk.dev/v1.4/movie/search?page=$page&limit=$limit&query=%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA" \
-H "accept: application/json" \
-H "X-API-KEY: $API_KEY" | jq .)
echo $request | jq '.docs[] | select(.year == 2022)' # оÑÑилÑÑÑоваÑÑ Ð²Ñвод по Ð³Ð¾Ð´Ñ Ð²ÑÑ
ода
$API_KEY = "ZYMNJJA-0J8MNPN-PB4N7R7-XXXXXXX"
$page = 1
$limit = 5
$query = "%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA"
$request = Invoke-RestMethod -Uri "https://api.kinopoisk.dev/v1.4/movie/search?page=$page&limit=$limit&query=$query" -Headers @{"accept"="application/json"; "X-API-KEY"="$API_KEY"}
$request.docs | Where-Object year -eq 2022
UrlCode
function Get-PercentEncode ($str) {
$bytes = [System.Text.Encoding]::UTF8.GetBytes($str)
($bytes | ForEach-Object { "{0:X2}" -f $_ }) -join '%' -replace "^","%"
}
Get-PercentEncode "зимоÑодок"
function Get-UrlEncode($str) {
[System.Web.HttpUtility]::UrlEncode($str)
}
UrlEncode "зимоÑодок"
percent-encode() {
str=$1
echo -n "$1" | iconv -t utf8 | od -An -tx1 | tr ' ' % | tr -d '\n'
}
percent-encode "зимоÑодок"
function Get-UrlDecode($encoded) {
[System.Uri]::UnescapeDataString($encoded)
}
Get-UrlDecode "%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA"
percent-decode() {
encoded=$1
local url_encoded="${1//+/ }"
printf '%b' "${url_encoded//%/\\x}"
}
percent-decode "%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA"
KinopoiskApiUnofficial
ÐеÑплаÑно 500 запÑоÑов в ÑÑÑки. Swagger documentation
API_KEY="828ec96a-f45d-4e3d-84b1-XXXXXXXXXXXX"
$headers = @{
"accept" = "application/json"
"X-API-KEY" = "$API_KEY"
}
Invoke-RestMethod -Uri 'https://kinopoiskapiunofficial.tech/api/v2.2/films/1142153' -Headers $headers
curl -s "https://kinopoiskapiunofficial.tech/api/v2.2/films/1142153" -H "accept: application/json" -H "X-API-KEY: $API_KEY" | jq .
Kinobox
$url = "https://www.kinopoisk.ru/film/694051"
$kp_id = $url -replace ".+/"
https://kinomix.web.app/#694051
curl -s -X GET "https://kinobox.tv/api/players/main?kinopoisk=$kp_id" -H "accept: application/json" поиÑк по id ÐинопоиÑк
curl -s -X GET "https://kinobox.tv/api/players/main?imdb=tt2293640" -H "accept: application/json" поиÑк по id IMDb
curl -s -X GET "https://kinobox.tv/api/players/main?title=minions" -H "accept: application/json" поиÑк оÑновнÑÑ
плееÑов по названиÑ
curl -s -X GET "https://kinobox.tv/api/players/all?title=minions" -H "accept: application/json" поиÑк вÑеÑ
плееÑов
curl -s -X GET "https://kinobox.tv/api/popular/films" -H "accept: application/json" попÑлÑÑнÑе ÑилÑмÑ
curl -s -X GET "https://kinobox.tv/api/popular/series" -H "accept: application/json" попÑлÑÑнÑе ÑеÑиалÑ
VideoCDN
$kp_id = 5106881
$token = "YfTWH2p3Mai7ziqDoGjS3yXXXXXXXXXX"
$ep = "tv-series"
$(Invoke-RestMethod $("https://videocdn.tv/api/$ep"+"?api_token=$token&field=kinopoisk_id&query=$kp_id")).data.episodes | Where-Object season_num -eq 2 | Select-Object @{Name="Episode"; Expression={$_.num}}, @{Name="Voice"; Expression={$_.media.translation.title}} # оÑÑилÑÑÑоваÑÑ ÑеÑии по вÑоÑÐ¾Ð¼Ñ ÑÐµÐ·Ð¾Ð½Ñ Ð¸ оÑобÑазиÑÑ Ð²Ñе озвÑÑки к ÑеÑиÑм
kp_id=5106881
token="YfTWH2p3Mai7ziqDoGjS3yXXXXXXXXXX"
ep="tv-series"
curl -s "https://videocdn.tv/api/$ep?api_token=$token&field=kinopoisk_id&query=$kp_id" | jq ".data[].episodes | length" # колиÑеÑÑво ÑеÑий
curl -s "https://videocdn.tv/api/$ep?api_token=$token&field=kinopoisk_id&query=$kp_id" | jq ".data[].episodes[] | select(.season_num == 2) | {episode: .ru_title, voice: .media[].translation.title}" # оÑÑилÑÑÑоваÑÑ Ð¿Ð°ÑамеÑÑÑ Ð²Ñвода
Telegram
@BotFather (https://t.me/BotFather) /newbot
Format: https://api.telegram.org/bot<token>/<endpoint>
function Get-FromTelegram {
param (
$Token = "687...:AAF...",
[switch]$Date,
[switch]$Last,
[switch]$ChatID
)
$endpoint = "getUpdates"
$url = "https://api.telegram.org/bot$Token/$endpoint"
$result = Invoke-RestMethod -Uri $url
if ($Date) {
$Collections = New-Object System.Collections.Generic.List[System.Object]
foreach ($r in $($result.result)) {
$EpochTime = [DateTime]"1/1/1970"
$TimeZone = Get-TimeZone
$UTCTime = $EpochTime.AddSeconds($r.message.date)
$d = $UTCTime.AddMinutes($TimeZone.BaseUtcOffset.TotalMinutes)
$Collections.Add([PSCustomObject]@{
Message = $r.message.text;
Date = $d
})
}
$Collections
}
else {
if ($Last) {
$result.result.message.text[-1]
}
elseif ($ChatID) {
$Collections = New-Object System.Collections.Generic.List[System.Object]
foreach ($r in $($result.result)) {
$Collections.Add([PSCustomObject]@{
Message = $r.message.text;
UserName = $r.message.chat.username;
ChatID = $r.message.chat.id;
ChatType = $r.message.chat.type
})
}
$Collections
}
else {
$result.result.message.text
}
}
}
Get-FromTelegram
Get-FromTelegram -Last
Get-FromTelegram -Date
Get-FromTelegram -ChatID
function Send-ToTelegram {
param (
[Parameter(Mandatory = $True)]$Text,
$Token = "687...:AAF...",
$Chat = "125468108",
$Keyboard
)
$endpoint = "sendMessage"
$url = "https://api.telegram.org/bot$Token/$endpoint"
$Body = @{
chat_id = $Chat
text = $Text
}
if ($keyboard -ne $null) {
$Body += @{reply_markup = $keyboard}
}
Invoke-RestMethod -Uri $url -Body $Body
}
Send-ToTelegram -Text "Send test from powershell"
$LastDate = (Get-FromTelegram -date)[-1].Date
while ($true) {
$LastMessage = (Get-FromTelegram -date)[-1]
Start-Sleep 1
$LastDateTest = $LastMessage.Date
if (($LastMessage.Message -match "/Service") -and ($LastDate -ne $LastDateTest)) {
$ServiceName = $($LastMessage.Message -split " ")[-1]
$Result = $(Get-Service $ServiceName -ErrorAction Ignore).Status
if ($Result) {
Send-ToTelegram -Text $Result
} else {
Send-ToTelegram -Text "Service not found"
}
$LastDate = $LastDateTest
}
}
/Service vpnagent
/Service WinRM
/Service test
Button
$keyboard = '{
"inline_keyboard":[[
{"text":"Uptime","callback_data":"/Uptime"},
{"text":"Test","callback_data":"/Test"}
]]
}'
Send-ToTelegram -Text "Test buttons" -Keyboard $keyboard
$request = (Invoke-RestMethod -Uri "https://api.telegram.org/bot$Token/getUpdates").result.callback_query
$request.data # пÑоÑиÑаÑÑ callback_data нажаÑой кнопки
$request.message.date
Discord
Создаем Applications (General Information). Ð Bot пÑивÑзÑваем к Application и копиÑÑем Ñокен авÑоÑизаÑии. Ð OAuth2 - URL Generator вÑбиÑаем bot и пÑава Administrator и копиÑÑем ÑозданнÑй URL Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð° канал. ÐеÑÐµÑ Ð¾Ð´Ð¸Ð¼ по url и добавлÑем боÑа на ÑеÑвеÑ. ÐолÑÑаем ID канала на ÑеÑвеÑе (ÑекÑÑовÑе каналÑ, пÑавой кнопкой мÑÑи копиÑÑем ÑÑÑÐ»ÐºÑ Ð¸ забиÑаем поÑледний id в url).
Send to Discord
DISCORD_TOKEN="MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX"
DISCORD_CHANNEL_ID="119403124XXXXXXXXXX"
TEXT="test from bash"
URL="https://discordapp.com/api/channels/$DISCORD_CHANNEL_ID/messages"
curl -s -X POST $URL \
-H "Authorization: Bot $DISCORD_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"content\": \"$TEXT\"}"
$DISCORD_TOKEN = "MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX"
$DISCORD_CHANNEL_ID = "119403124XXXXXXXXXX"
$TEXT = "test from PowerShell"
$URL = "https://discordapp.com/api/channels/$DISCORD_CHANNEL_ID/messages"
$Body = @{
content = $TEXT
} | ConvertTo-Json
curl -s $URL -X POST -H "Authorization: Bot $DISCORD_TOKEN" -H "Content-Type: application/json" -d $Body
Read from Discord
curl -s -X GET $URL \
-H "Authorization: Bot $DISCORD_TOKEN" \
-H "Content-Type: application/json" | jq -r .[0].content
$messages = (curl -s -X GET $URL -H "Authorization: Bot $DISCORD_TOKEN" -H "Content-Type: application/json" | ConvertFrom-Json)
$messages | Select-Object content,timestamp,{$_.author.username}
HttpClient
$DISCORD_TOKEN = "MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX"
$DISCORD_CHANNEL_ID = "119403124XXXXXXXXXX"
$URL = "https://discordapp.com/api/channels/$DISCORD_CHANNEL_ID/messages"
$HttpClient = New-Object System.Net.Http.HttpClient
$HttpClient.DefaultRequestHeaders.Authorization = "Bot $DISCORD_TOKEN"
$response = $HttpClient.GetAsync($URL).Result
$messages = $response.Content.ReadAsStringAsync().Result
($messages | ConvertFrom-Json).content
Button
curl -X POST $URL \
-H "Content-Type: application/json" \
-H "Authorization: Bot $DISCORD_TOKEN" \
-d '
{
"content": "Test text for button",
"components": [
{
"type": 1,
"components": [
{
"type": 2,
"label": "Button",
"style": 1,
"custom_id": "button_click"
}
]
}
]
}'
Discord.Net.Webhook
Add-Type -Path $(ls "$home\Documents\Discord.NET\*.dll").FullName
# https://discordapp.com/api/webhooks/<webhook_id>/<webhook_token> (ÐаÑÑÑоиÑÑ ÐºÐ°Ð½Ð°Ð» - ÐнÑегÑаÑиÑ)
$webhookId = 1197577280000000000
$webhookToken = "rs8AA-XXXXXXXXXXX_Vk5RUI4A6HuSGhpCCTepq25duwCwLXasfv6u23a7XXXXXXXXXX"
$messageContent = "Test dotNET"
$client = New-Object Discord.Webhook.DiscordWebhookClient($webhookId, $webhookToken)
$client.SendMessageAsync($messageContent).Wait()
Discord.Net.WebSocket
$DiscordAssemblies = $(ls "$home\Documents\Discord.NET\*.dll").FullName
foreach ($assembly in $DiscordAssemblies) {
Add-Type -Path $assembly
}
$DISCORD_TOKEN = "MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX"
$Client = New-Object Discord.WebSocket.DiscordSocketClient
$Client.Add_MessageReceived({
param($message)
if ($message.Author.Id -ne $Client.CurrentUser.Id) {
Write-Host ("Received message from " + $message.Author.Username + ": " + $message.Content)
if ($message.Content.Contains("ping")) {
$message.Channel.SendMessageAsync("pong").GetAwaiter().GetResult()
}
}
})
$Client.LoginAsync([Discord.TokenType]::Bot, $DISCORD_TOKEN).GetAwaiter().GetResult()
#$Client.StartAsync().Wait()
$Client.StartAsync().GetAwaiter().GetResult()
$Client.ConnectionState
[console]::ReadKey($true)
$Client.LogoutAsync().GetAwaiter().GetResult()
$Client.Dispose()
oh-my-posh
winget install JanDeDobbeleer.OhMyPosh -s winget
choco install oh-my-posh -y
scoop install https://github.com/JanDeDobbeleer/oh-my-posh/releases/latest/download/oh-my-posh.json
Set-ExecutionPolicy Bypass -Scope Process -Force; Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://ohmyposh.dev/install.ps1'))
Get-PoshThemes
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/di4am0nd.omp.json" | Invoke-Expression
oh-my-posh init pwsh --config "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/cert.omp.json" | Invoke-Expression
New-Item -Path $PROFILE -Type File -Force
notepad $PROFILE
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/di4am0nd.omp.json" | Invoke-Expression
themes-performance
Install-Module themes-performance -Repository NuGet
Import-Module themes-performance
Set-PoshTheme -Theme System-Sensors # -Save
Set-PoshTheme -Theme System-Performance # -Save
Set-PoshTheme -Theme Pwsh-Process-Performance # -Save
Terminal-Icons
Install-Module -Name Terminal-Icons -Repository PSGallery
scoop bucket add extras
scoop install terminal-icons
notepad $PROFILE
Import-Module -Name Terminal-Icons
ÐÑполÑзÑÐµÑ ÑÑиÑÑÑ, коÑоÑÑе необÑ
одимо ÑÑÑановиÑÑ Ð¸ наÑÑÑоиÑÑ Ð² паÑамеÑÑаÑ
пÑоÑÐ¸Ð»Ñ PowerShell: Nerd Fonts
СпиÑок ÑÑиÑÑов
СкаÑаÑÑ Ð¸ ÑÑÑановиÑÑ ÑÑиÑÑ Ð¿Ð¾Ñ
ожий на Cascadia Code - CaskaydiaCove
Pester
Install-Module -Name Pester -Repository PSGallery -Force -AllowClobber
Import-Module Pester
$(Get-Module Pester -ListAvailable).Version
.Tests.ps1
function Add-Numbers {
param (
[int]$a,
[int]$b
)
$a + $b
}
Describe "Add-Numbers" {
Context "ÐÑи Ñложении двÑÑ
ÑиÑел" {
It "Ðолжна веÑнÑÑÑÑÑ Ð¿ÑавилÑÐ½Ð°Ñ ÑÑмма" {
$result = Add-Numbers -a 3 -b 4
$result | Should -Be 7
}
}
Context "ÐÑи Ñложении двÑÑ
ÑиÑел" {
It "Ðолжна веÑнÑÑÑÑÑ Ð¾Ñибка (5+0 -ne 4)" {
$result = Add-Numbers -a 5 -b 0
$result | Should -Be 4
}
}
}
function Get-RunningProcess {
return Get-Process | Select-Object -ExpandProperty Name
}
Describe "Get-RunningProcess" {
Context "ÐÑи налиÑии запÑÑеннÑÑ
пÑоÑеÑÑов" {
It "Ðолжен возвÑаÑаÑÑ ÑпиÑок имен пÑоÑеÑÑов" {
$result = Get-RunningProcess
$result | Should -Contain "svchost"
$result | Should -Contain "explorer"
}
}
Context "Ðогда Ð½ÐµÑ Ð·Ð°Ð¿ÑÑеннÑÑ
пÑоÑеÑÑов" {
It "Ðолжен возвÑаÑаÑÑ Ð¿ÑÑÑой ÑпиÑок" {
# ÐамокаÑÑ ÑÑнкÑÐ¸Ñ Get-Process, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð° вÑегда возвÑаÑала пÑÑÑой ÑпиÑок пÑоÑеÑÑов
Mock Get-Process { return @() }
$result = Get-RunningProcess
$result | Should -BeEmpty
}
}
}
Pandoc
$release_latest = Invoke-RestMethod "https://api.github.com/repos/jgm/pandoc/releases/latest"
$url = $($release_latest.assets | Where-Object name -match "windows-x86_64.zip").browser_download_url
Invoke-RestMethod $url -OutFile $home\Downloads\pandoc.zip
Expand-Archive -Path "$home\Downloads\pandoc.zip" -DestinationPath "$home\Downloads\"
$path = $(Get-ChildItem "$home\Downloads\pandoc-*\*.exe").FullName
Copy-Item -Path $path -Destination "C:\Windows\System32\pandoc.exe"
Remove-Item "$home\Downloads\pandoc*" -Force -Recurse
pandoc -s README.md -o index.html конвеÑÑаÑÐ¸Ñ Ð¸Ð· Markdown в HTML
pandoc README.md -o index.html --css=styles.css пÑимениÑÑ ÑÑили из css
pandoc -s index.html -o README.md конвеÑÑаÑÐ¸Ñ Ð¸Ð· HTML в Markdown
pandoc -s README.md -o README.docx конвеÑÑаÑÐ¸Ñ Ð² Word
pandoc -s README.md -o README.epub конвеÑÑаÑÐ¸Ñ Ð² оÑкÑÑÑÑй ÑоÑÐ¼Ð°Ñ ÑлекÑÑоннÑÑ
веÑÑий книг
pandoc -s README.md -o README.pdf конвеÑÑаÑÐ¸Ñ Ð² PDF (ÑÑебÑеÑÑÑ rsvg-convert)
Import-Module ImportExcel
Import-Excel -Path srv.xlsx | Export-Csv -Path $csvFilePath -NoTypeInformation -Encoding UTF8 # конвеÑÑаÑÐ¸Ñ Excel в csv
pandoc -s -f csv -t markdown input.csv -o output.md # конвеÑÑаÑÐ¸Ñ ÑаблиÑÑ csv в markdown
FFmpeg
$release_latest = Invoke-RestMethod "https://api.github.com/repos/BtbN/FFmpeg-Builds/releases/latest"
$url = $($release_latest.assets | Where-Object name -match "ffmpeg-master-latest-win64-gpl.zip").browser_download_url
Invoke-RestMethod $url -OutFile $home\Downloads\ffmpeg-master-latest-win64-gpl.zip
Expand-Archive -Path "$home\Downloads\ffmpeg-master-latest-win64-gpl.zip" -DestinationPath "$home\Downloads\"
Copy-Item -Path "$home\Downloads\ffmpeg-master-latest-win64-gpl\bin\ffmpeg.exe" -Destination "C:\Windows\System32\ffmpeg.exe"
Remove-Item "$home\Downloads\ffmpeg-*" -Force -Recurse
ffmpeg -i input.mp4 output.gif конвеÑÑиÑоваÑÑ mp4 в gif
ffmpeg -i input.mp4 -filter_complex "scale=1440:-1:flags=lanczos" output.gif измениÑÑ ÑазÑеÑение на вÑÑ
оде
ffmpeg -i input.mp4 -filter_complex "scale=1440:-1:flags=lanczos" -r 10 output.gif измениÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво кадÑов в ÑекÑÐ½Ð´Ñ Ð½Ð° вÑÑ
оде
ffmpeg -i input.mp4 -filter_complex "fps=5,scale=960:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=32[p];[s1][p]paletteuse=dither=bayer" output.gif ÑжаÑие за ÑÑÐµÑ ÑвеÑовой полиÑÑÑ
ffmpeg -i input.mp4 -ss 00:00:10 -frames:v 1 -q:v 1 output.jpg вÑÑаÑиÑÑ ÑкÑинÑÐ¾Ñ Ð¸Ð· видео на 10 ÑекÑнде
ffmpeg -i input.mp4 -ss 00:00:05 -to 00:00:10 -c copy output.mp4 вÑÑаÑиÑÑ ÐºÑÑок видео
ffmpeg -i "%d.jpeg" -framerate 2 -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4 ÑоздаÑÑ Ð²Ð¸Ð´ÐµÐ¾ из ÑоÑо (1.jpeg, 2.jpeg и Ñ.д.) Ñ framerate (ÑаÑÑоÑой кадÑов) в Ñоздаваемом видео 2 кадÑа в ÑекÑндÑ
ffmpeg -i "rtsp://admin:[email protected]:554" -rtsp_transport tcp -c:v copy -c:a aac -strict experimental output.mp4 запиÑÑ Ð±ÐµÐ· пеÑекодиÑÐ¾Ð²Ð°Ð½Ð¸Ñ (copy) RTSP-поÑока Ñ ÐºÐ°Ð¼ÐµÑÑ Ð²Ð¸Ð´ÐµÐ¾Ð½Ð°Ð±Ð»ÑÐ´ÐµÐ½Ð¸Ñ (+ аÑдио в кодеке AAC) в Ñайл
ffmpeg -i "rtsp://admin:[email protected]:554" -rtsp_transport tcp -c:v copy -c:a aac -strict experimental -movflags +faststart+frag_keyframe+empty_moov output.mp4 пеÑемеÑÑиÑÑ Ð¼ÐµÑаданнÑе в наÑало Ñайла, ÑÑо позволÑÐµÑ Ð½Ð°ÑаÑÑ Ð²Ð¾ÑпÑоизведение Ñайла в видеоплееÑе до его полной загÑÑзки
ffmpeg -i "rtsp://admin:[email protected]:554" -rtsp_transport tcp -frames:v 1 -c:v mjpeg output.jpg ÑделаÑÑ ÑкÑинÑоÑ
ImageMagick
Source: ImageMagick
magick identify -verbose PowerShell-Commands.png извлеÑÑ Ð¼ÐµÑаданнÑе изобÑажениÑ
magick PowerShell-Commands.png output.jpg конвеÑÑаÑÐ¸Ñ ÑоÑмаÑа изобÑажениÑ
magick PowerShell-Commands.png -resize 800x600 output.jpg измениÑÑ ÑÐ°Ð·Ð¼ÐµÑ (ÑвелиÑиÑÑ Ð¸Ð»Ð¸ ÑменÑÑиÑÑ)
magick PowerShell-Commands.png -crop 400x300+100+50 output.jpg обÑезаÑÑ
magick PowerShell-Commands.png -rotate 90 output.jpg повеÑнÑÑÑ Ð¸Ð·Ð¾Ð±Ñажение
magick PowerShell-Commands.png -fill white -pointsize 24 -gravity center -annotate +0+0 "PowerShell" output.jpg наложиÑÑ ÑекÑÑ Ð½Ð° изобÑажение
magick PowerShell-Commands.png -brightness-contrast +20x+10 output.jpg измениÑÑ ÑÑкоÑÑÑ Ð¸ конÑÑаÑÑноÑÑÑ
magick convert -delay 100 1.png 2.png 3.png output.gif ÑоздаÑÑ gif из изобÑажений
magick convert image1.jpg image2.jpg -append output.jpg веÑÑикалÑно обÑединениÑÑ Ð¸Ð·Ð¾Ð±ÑажениÑ
Hugo
winget install Hugo.Hugo.Extended
scoop install hugo-extended
choco install hugo-extended
$user = "gohugoio"
$repository = "hugo"
$release_latest = Invoke-RestMethod "https://api.github.com/repos/$($user)/$($repository)/releases/latest"
$url = $($release_latest.assets | Where-Object name -match "hugo_extended_[\d.]+_windows-amd64\.zip").browser_download_url
Invoke-RestMethod $url -OutFile $home\Downloads\hugo.zip
Expand-Archive -Path "$home\Downloads\hugo.zip" -DestinationPath "$home\Downloads\hugo\"
Copy-Item -Path "$home\Downloads\hugo\hugo.exe" -Destination "C:\Windows\System32\hugo.exe"
Remove-Item "$home\Downloads\hugo*" -Force -Recurse
СпиÑок Ñем
СпиÑок команд
hugo completion powershell | Out-String | Invoke-Expression вклÑÑиÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Ð°Ð²ÑозавеÑÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов
hugo version
hugo new site lifailon.github.io.hugo # ÑоздаÑÑ Ð¸ иниÑиализиÑоваÑÑ Ð½Ð¾Ð²Ñй ÑайÑ
cd lifailon.github.io.hugo
git init # иниÑиализиÑÑйÑе пÑÑÑой ÑепозиÑоÑий Git в ÑекÑÑем каÑалоге Ð´Ð»Ñ Ð¸Ð½Ð¸ÑиализаÑии ÑÐµÐ¼Ñ ÐºÐ°Ñалог themes, добавив ее в Ñвой пÑÐ¾ÐµÐºÑ ÐºÐ°Ðº подмодÑÐ»Ñ Git (еÑли не иÑполÑзÑеÑÑÑ ÐºÐ»Ð¾Ð½Ð¸Ñование)
git submodule add -f https://github.com/JingWangTW/dark-theme-editor.git themes/dark-theme-editor
echo 'theme = "dark-theme-editor"' >> hugo.toml
#git submodule add https://github.com/rhazdon/hugo-theme-hello-friend-ng.git themes/hello-friend-ng
#echo 'theme = "hello-friend-ng"' >> hugo.toml
mkdir "$home\Downloads\lifailon.github.io.hugo\content\powershell\"
cp "$home\Downloads\README.md" "$home\Downloads\lifailon.github.io.hugo\content\powershell\index.md" # ÑкопиÑоваÑÑ markdown докÑÐ¼ÐµÐ½Ñ Ð² диÑекÑоÑÐ¸Ñ ÐºÐ¾Ð½ÑенÑа
hugo server # запÑÑÑиÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑй веб-ÑеÑÐ²ÐµÑ Ñ Ð¿ÑоекÑом (http://localhost:1313)
code hugo.toml
baseURL = 'https://lifailon.github.io'
languageCode = 'en-us'
title = 'PS-Commands'
theme = "dark-theme-editor"
[taxonomies]
autor = "Lifailon"
tag = "Code"
category = "PowerShell"
[params]
[params.site]
faviconUrl = ""
[params.header]
title = "Lifailon.GitHub.io"
subtitle = "ÐолÑÑÐ°Ñ Ð±Ð°Ð·Ð° замеÑок PowerShell на ÑÑÑÑком ÑзÑке."
[params.header.logo]
imgUrl = ""
logoLink = ""
[params.footer]
copyrightStr = "GitHub"
counter = false
language = false
hugoVersion = true
theme = true
modifiedTime = true
dateFormat = "Jan 02 2006"
gitHash = false
[params.footer.socialLink]
github = "https://github.com/Lifailon"
[params.globalFrontmatter]
author = "Lifailon"
description = "Large base of PowerShell notes in Russian language"
keywords = "PowerShell"
[params.homePage]
siteLongDescriptionTitle = "PowerShell Commands"
siteLongDescription = "СÑÑÑкÑÑÑа ÑзÑка, ÑинÑакÑÐ¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð»ÐµÑов и модÑлей, ÑабоÑа Ñ ÑиÑÑемнÑми и внеÑними ÑÑилиÑами, плаÑÑоÑмой .NET, ÑазлиÑнÑми ÑеÑвиÑами ÑеÑез REST API, а Ñак же ÑиÑÑемами AD, Exchange, Hyper-V, VMWare, базами даннÑÑ
и Ñ.д."
showRecentPostsBlock = false
numOfRecentPosts = 5
recentPostShowUrl = false
[params.page]
includeToc = false
showAuthor = true
showDate = true
dateFormat = "Jan 02 2006"
showTimeToRead = true
showBreadcrumb = true
codeBlockCopible = true
code "content\powershell\index.md"
---
title: "PowerShell Commands"
author: "Lifailon"
date: "2024-03-14T03:00:00+03:00"
categories: ["PowerShell"]
tags: ["dotNET", "REST API", "Active Dirtctory", "EMShell", "PowerCLI", "Database"]
---
baseURL = 'https://lifailon.github.io'
title = "Shell Commands"
languageCode = "en-us"
theme = "hello-friend-ng"
contentDir = "content"
[taxonomies]
autor = "Lifailon"
tag = "PowerShell"
category = "Code"
[params.author]
name = "Lifailon"
[params.footer]
trademark = "2022-2024"
bottomText = ["GitHub â¶ï¸ <a href=\"https://github.com/Lifailon\">Lifailon</a>"]
[params.logo]
logoMark = ">"
logoText = "$ /home/lifailon/"
logoHomeLink = "/"
logoCursorColor = "#67a2c9"
logoCursorAnimate = "2s"
logoCursorPathname = true
logoCursorDisabled = false
#[params.portrait]
#path = "/img/image.jpg"
#alt = "Portrait"
#maxWidth = "1500px"
[[params.social]]
name = "github"
url = "https://github.com/Lifailon"
[menu]
[[menu.main]]
identifier = "ps"
name = "PowerShell Commands"
url = "/powershell/"
hugo генеÑаÑÐ¸Ñ ÑайÑа (ÑоздаÑÑ Ð¿Ð°Ð¿ÐºÑ public Ñ Ð³Ð¾ÑовÑми Ñайлами ÑайÑа Ð´Ð»Ñ ÑазвеÑÑÑваниÑ)