8106 lines
		
	
	
	
		
			923 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			8106 lines
		
	
	
	
		
			923 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!DOCTYPE html>
 | ||
| <html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
 | ||
| <head>
 | ||
|   <meta charset="utf-8" />
 | ||
|   <meta name="generator" content="pandoc" />
 | ||
|   <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
 | ||
|   <title>README</title>
 | ||
|   <style>
 | ||
|     html {
 | ||
|       color: #1a1a1a;
 | ||
|       background-color: #fdfdfd;
 | ||
|     }
 | ||
|     body {
 | ||
|       margin: 0 auto;
 | ||
|       max-width: 36em;
 | ||
|       padding-left: 50px;
 | ||
|       padding-right: 50px;
 | ||
|       padding-top: 50px;
 | ||
|       padding-bottom: 50px;
 | ||
|       hyphens: auto;
 | ||
|       overflow-wrap: break-word;
 | ||
|       text-rendering: optimizeLegibility;
 | ||
|       font-kerning: normal;
 | ||
|     }
 | ||
|     @media (max-width: 600px) {
 | ||
|       body {
 | ||
|         font-size: 0.9em;
 | ||
|         padding: 12px;
 | ||
|       }
 | ||
|       h1 {
 | ||
|         font-size: 1.8em;
 | ||
|       }
 | ||
|     }
 | ||
|     @media print {
 | ||
|       html {
 | ||
|         background-color: white;
 | ||
|       }
 | ||
|       body {
 | ||
|         background-color: transparent;
 | ||
|         color: black;
 | ||
|         font-size: 12pt;
 | ||
|       }
 | ||
|       p, h2, h3 {
 | ||
|         orphans: 3;
 | ||
|         widows: 3;
 | ||
|       }
 | ||
|       h2, h3, h4 {
 | ||
|         page-break-after: avoid;
 | ||
|       }
 | ||
|     }
 | ||
|     p {
 | ||
|       margin: 1em 0;
 | ||
|     }
 | ||
|     a {
 | ||
|       color: #1a1a1a;
 | ||
|     }
 | ||
|     a:visited {
 | ||
|       color: #1a1a1a;
 | ||
|     }
 | ||
|     img {
 | ||
|       max-width: 100%;
 | ||
|     }
 | ||
|     svg {
 | ||
|       height: auto;
 | ||
|       max-width: 100%;
 | ||
|     }
 | ||
|     h1, h2, h3, h4, h5, h6 {
 | ||
|       margin-top: 1.4em;
 | ||
|     }
 | ||
|     h5, h6 {
 | ||
|       font-size: 1em;
 | ||
|       font-style: italic;
 | ||
|     }
 | ||
|     h6 {
 | ||
|       font-weight: normal;
 | ||
|     }
 | ||
|     ol, ul {
 | ||
|       padding-left: 1.7em;
 | ||
|       margin-top: 1em;
 | ||
|     }
 | ||
|     li > ol, li > ul {
 | ||
|       margin-top: 0;
 | ||
|     }
 | ||
|     blockquote {
 | ||
|       margin: 1em 0 1em 1.7em;
 | ||
|       padding-left: 1em;
 | ||
|       border-left: 2px solid #e6e6e6;
 | ||
|       color: #606060;
 | ||
|     }
 | ||
|     code {
 | ||
|       font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
 | ||
|       font-size: 85%;
 | ||
|       margin: 0;
 | ||
|       hyphens: manual;
 | ||
|     }
 | ||
|     pre {
 | ||
|       margin: 1em 0;
 | ||
|       overflow: auto;
 | ||
|     }
 | ||
|     pre code {
 | ||
|       padding: 0;
 | ||
|       overflow: visible;
 | ||
|       overflow-wrap: normal;
 | ||
|     }
 | ||
|     .sourceCode {
 | ||
|      background-color: transparent;
 | ||
|      overflow: visible;
 | ||
|     }
 | ||
|     hr {
 | ||
|       background-color: #1a1a1a;
 | ||
|       border: none;
 | ||
|       height: 1px;
 | ||
|       margin: 1em 0;
 | ||
|     }
 | ||
|     table {
 | ||
|       margin: 1em 0;
 | ||
|       border-collapse: collapse;
 | ||
|       width: 100%;
 | ||
|       overflow-x: auto;
 | ||
|       display: block;
 | ||
|       font-variant-numeric: lining-nums tabular-nums;
 | ||
|     }
 | ||
|     table caption {
 | ||
|       margin-bottom: 0.75em;
 | ||
|     }
 | ||
|     tbody {
 | ||
|       margin-top: 0.5em;
 | ||
|       border-top: 1px solid #1a1a1a;
 | ||
|       border-bottom: 1px solid #1a1a1a;
 | ||
|     }
 | ||
|     th {
 | ||
|       border-top: 1px solid #1a1a1a;
 | ||
|       padding: 0.25em 0.5em 0.25em 0.5em;
 | ||
|     }
 | ||
|     td {
 | ||
|       padding: 0.125em 0.5em 0.25em 0.5em;
 | ||
|     }
 | ||
|     header {
 | ||
|       margin-bottom: 4em;
 | ||
|       text-align: center;
 | ||
|     }
 | ||
|     #TOC li {
 | ||
|       list-style: none;
 | ||
|     }
 | ||
|     #TOC ul {
 | ||
|       padding-left: 1.3em;
 | ||
|     }
 | ||
|     #TOC > ul {
 | ||
|       padding-left: 0;
 | ||
|     }
 | ||
|     #TOC a:not(:hover) {
 | ||
|       text-decoration: none;
 | ||
|     }
 | ||
|     code{white-space: pre-wrap;}
 | ||
|     span.smallcaps{font-variant: small-caps;}
 | ||
|     div.columns{display: flex; gap: min(4vw, 1.5em);}
 | ||
|     div.column{flex: auto; overflow-x: auto;}
 | ||
|     div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
 | ||
|     /* The extra [class] is a hack that increases specificity enough to
 | ||
|        override a similar rule in reveal.js */
 | ||
|     ul.task-list[class]{list-style: none;}
 | ||
|     ul.task-list li input[type="checkbox"] {
 | ||
|       font-size: inherit;
 | ||
|       width: 0.8em;
 | ||
|       margin: 0 0.8em 0.2em -1.6em;
 | ||
|       vertical-align: middle;
 | ||
|     }
 | ||
|     .display.math{display: block; text-align: center; margin: 0.5rem auto;}
 | ||
|     /* CSS for syntax highlighting */
 | ||
|     pre > code.sourceCode { white-space: pre; position: relative; }
 | ||
|     pre > code.sourceCode > span { line-height: 1.25; }
 | ||
|     pre > code.sourceCode > span:empty { height: 1.2em; }
 | ||
|     .sourceCode { overflow: visible; }
 | ||
|     code.sourceCode > span { color: inherit; text-decoration: inherit; }
 | ||
|     div.sourceCode { margin: 1em 0; }
 | ||
|     pre.sourceCode { margin: 0; }
 | ||
|     @media screen {
 | ||
|     div.sourceCode { overflow: auto; }
 | ||
|     }
 | ||
|     @media print {
 | ||
|     pre > code.sourceCode { white-space: pre-wrap; }
 | ||
|     pre > code.sourceCode > span { display: inline-block; text-indent: -5em; padding-left: 5em; }
 | ||
|     }
 | ||
|     pre.numberSource code
 | ||
|       { counter-reset: source-line 0; }
 | ||
|     pre.numberSource code > span
 | ||
|       { position: relative; left: -4em; counter-increment: source-line; }
 | ||
|     pre.numberSource code > span > a:first-child::before
 | ||
|       { content: counter(source-line);
 | ||
|         position: relative; left: -1em; text-align: right; vertical-align: baseline;
 | ||
|         border: none; display: inline-block;
 | ||
|         -webkit-touch-callout: none; -webkit-user-select: none;
 | ||
|         -khtml-user-select: none; -moz-user-select: none;
 | ||
|         -ms-user-select: none; user-select: none;
 | ||
|         padding: 0 4px; width: 4em;
 | ||
|         color: #aaaaaa;
 | ||
|       }
 | ||
|     pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
 | ||
|     div.sourceCode
 | ||
|       {   }
 | ||
|     @media screen {
 | ||
|     pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
 | ||
|     }
 | ||
|     code span.al { color: #ff0000; font-weight: bold; } /* Alert */
 | ||
|     code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
 | ||
|     code span.at { color: #7d9029; } /* Attribute */
 | ||
|     code span.bn { color: #40a070; } /* BaseN */
 | ||
|     code span.bu { color: #008000; } /* BuiltIn */
 | ||
|     code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
 | ||
|     code span.ch { color: #4070a0; } /* Char */
 | ||
|     code span.cn { color: #880000; } /* Constant */
 | ||
|     code span.co { color: #60a0b0; font-style: italic; } /* Comment */
 | ||
|     code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
 | ||
|     code span.do { color: #ba2121; font-style: italic; } /* Documentation */
 | ||
|     code span.dt { color: #902000; } /* DataType */
 | ||
|     code span.dv { color: #40a070; } /* DecVal */
 | ||
|     code span.er { color: #ff0000; font-weight: bold; } /* Error */
 | ||
|     code span.ex { } /* Extension */
 | ||
|     code span.fl { color: #40a070; } /* Float */
 | ||
|     code span.fu { color: #06287e; } /* Function */
 | ||
|     code span.im { color: #008000; font-weight: bold; } /* Import */
 | ||
|     code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
 | ||
|     code span.kw { color: #007020; font-weight: bold; } /* Keyword */
 | ||
|     code span.op { color: #666666; } /* Operator */
 | ||
|     code span.ot { color: #007020; } /* Other */
 | ||
|     code span.pp { color: #bc7a00; } /* Preprocessor */
 | ||
|     code span.sc { color: #4070a0; } /* SpecialChar */
 | ||
|     code span.ss { color: #bb6688; } /* SpecialString */
 | ||
|     code span.st { color: #4070a0; } /* String */
 | ||
|     code span.va { color: #19177c; } /* Variable */
 | ||
|     code span.vs { color: #4070a0; } /* VerbatimString */
 | ||
|     code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
 | ||
|   </style>
 | ||
| </head>
 | ||
| <body>
 | ||
| <figure>
 | ||
| <img
 | ||
| src="https://github.com/Lifailon/PS-Commands/blob/rsa/Logo/PowerShell-Commands.png"
 | ||
| alt="Image alt" />
 | ||
| <figcaption aria-hidden="true">Image alt</figcaption>
 | ||
| </figure>
 | ||
| <p><img
 | ||
| src="https://img.shields.io/github/languages/top/lifailon/PS-Commands"
 | ||
| alt="GitHub top language" /> <img
 | ||
| src="https://img.shields.io/github/last-commit/lifailon/PS-Commands"
 | ||
| alt="GitHub last commit (by committer)" /> <img
 | ||
| src="https://img.shields.io/github/languages/code-size/lifailon/PS-Commands"
 | ||
| alt="GitHub code size in bytes" /> <img
 | ||
| src="https://img.shields.io/github/stars/Lifailon/PS-Commands"
 | ||
| alt="GitHub Repo stars" /></p>
 | ||
| <p>?? Habr: <a href="https://habr.com/ru/articles/782592/">PowerShell и
 | ||
| его возможности</a></p>
 | ||
| <ul>
 | ||
| <li><a href="#help">Help</a></li>
 | ||
| <li><a href="#object">Object</a></li>
 | ||
| <li><a href="#npp">npp</a></li>
 | ||
| <li><a href="#regex">Regex</a></li>
 | ||
| <li><a href="#datatype">DataType</a></li>
 | ||
| <li><a href="#bit">Bit</a></li>
 | ||
| <li><a href="#files">Files</a></li>
 | ||
| <li><a href="#credential">Credential</a></li>
 | ||
| <li><a href="#winevent">WinEvent</a></li>
 | ||
| <li><a href="#firewall">Firewall</a></li>
 | ||
| <li><a href="#defender">Defender</a></li>
 | ||
| <li><a href="#windowsupdate">WindowsUpdate</a></li>
 | ||
| <li><a href="#dism">DISM</a></li>
 | ||
| <li><a href="#scheduled">Scheduled</a></li>
 | ||
| <li><a href="#network">Network</a></li>
 | ||
| <li><a href="#rdp">RDP</a></li>
 | ||
| <li><a href="#shutdown">Shutdown</a></li>
 | ||
| <li><a href="#localaccounts">LocalAccounts</a></li>
 | ||
| <li><a href="#smb">SMB</a></li>
 | ||
| <li><a href="#activedirectory">ActiveDirectory</a></li>
 | ||
| <li><a href="#repadmin">repadmin</a></li>
 | ||
| <li><a href="#dcdiag">dcdiag</a></li>
 | ||
| <li><a href="#ntdsutil">ntdsutil</a></li>
 | ||
| <li><a href="#gpo">GPO</a></li>
 | ||
| <li><a href="#servermanager">ServerManager</a></li>
 | ||
| <li><a href="#dnsserver">DNS</a></li>
 | ||
| <li><a href="#dhcpserver">DHCP</a></li>
 | ||
| <li><a href="#dfs">DFS</a></li>
 | ||
| <li><a href="#storagereplica">StorageReplica</a></li>
 | ||
| <li><a href="#ps2exe">PS2EXE</a></li>
 | ||
| <li><a href="#nssm">NSSM</a></li>
 | ||
| <li><a href="#jobs">Jobs</a></li>
 | ||
| <li><a href="#smtp">SMTP</a></li>
 | ||
| <li><a href="#hyper-v">Hyper-V</a></li>
 | ||
| <li><a href="#vmwarepowercli">VMWare/PowerCLI</a></li>
 | ||
| <li><a href="#exchangeemshell">Exchange/EMShell</a></li>
 | ||
| <li><a href="#truenas">TrueNAS</a></li>
 | ||
| <li><a href="#veeam">Veeam</a></li>
 | ||
| <li><a href="#rest-api">REST API</a></li>
 | ||
| <li><a href="#pode">Pode</a></li>
 | ||
| <li><a href="#selenium">Selenium</a></li>
 | ||
| <li><a href="#ie">IE</a></li>
 | ||
| <li><a href="#com">COM</a></li>
 | ||
| <li><a href="#dotnet">dotNET</a></li>
 | ||
| <li><a href="#console-api">Console API</a></li>
 | ||
| <li><a href="#drawing">Drawing</a></li>
 | ||
| <li><a href="#objectevent">ObjectEvent</a></li>
 | ||
| <li><a href="#sockets">Sockets</a></li>
 | ||
| <li><a href="#excel">Excel</a></li>
 | ||
| <li><a href="#csv">CSV</a></li>
 | ||
| <li><a href="#xml">XML</a></li>
 | ||
| <li><a href="#json">JSON</a></li>
 | ||
| <li><a href="#yaml">YAML</a></li>
 | ||
| <li><a href="#html">HTML</a></li>
 | ||
| <li><a href="#sqlite">SQLite</a></li>
 | ||
| <li><a href="#mysql">MySQL</a></li>
 | ||
| <li><a href="#mssql">MSSQL</a></li>
 | ||
| <li><a href="#influxdb">InfluxDB</a></li>
 | ||
| <li><a href="#telegraf">Telegraf</a></li>
 | ||
| <li><a href="#elasticsearch">Elasticsearch</a></li>
 | ||
| <li><a href="#cdata">CData</a></li>
 | ||
| <li><a href="#odbc">ODBC</a></li>
 | ||
| <li><a href="#postgresql">PostgreSQL</a></li>
 | ||
| <li><a href="#wmi">WMI</a></li>
 | ||
| <li><a href="#regedit">Regedit</a></li>
 | ||
| <li><a href="#performance">Performance</a></li>
 | ||
| <li><a href="#snmp">SNMP</a></li>
 | ||
| <li><a href="#zabbix">Zabbix</a></li>
 | ||
| <li><a href="#pki">pki</a></li>
 | ||
| <li><a href="#openssl">OpenSSL</a></li>
 | ||
| <li><a href="#openvpn">OpenVPN</a></li>
 | ||
| <li><a href="#route">Route</a></li>
 | ||
| <li><a href="#nat">NAT</a></li>
 | ||
| <li><a href="#wireguard">WireGuard</a></li>
 | ||
| <li><a href="#vpnclient">VpnClient</a></li>
 | ||
| <li><a href="#proxy">Proxy</a></li>
 | ||
| <li><a href="#openssh">OpenSSH</a></li>
 | ||
| <li><a href="#winrm">WinRM</a></li>
 | ||
| <li><a href="#packagemanagement">PackageManagement</a></li>
 | ||
| <li><a href="#nuget">NuGet</a></li>
 | ||
| <li><a href="#git">Git</a></li>
 | ||
| <li><a href="#dsc">DSC</a></li>
 | ||
| <li><a href="#ansible">Ansible</a></li>
 | ||
| <li><a href="#GigaChat">GigaChat</a></li>
 | ||
| <li><a href="#YandexGPT">YandexGPT</a></li>
 | ||
| <li><a href="#superagi">SuperAGI</a></li>
 | ||
| <li><a href="#replicate">Replicate</a></li>
 | ||
| <li><a href="#google-api">Google-API</a></li>
 | ||
| <li><a href="#rapidapi">RapidAPI</a></li>
 | ||
| <li><a href="#tmdb">TMDB</a></li>
 | ||
| <li><a href="#ivi">ivi</a></li>
 | ||
| <li><a href="#kinopoisk">Kinopoisk</a></li>
 | ||
| <li><a href="#videocdn">VideoCDN</a></li>
 | ||
| <li><a href="#telegram">Telegram</a></li>
 | ||
| <li><a href="#discord">Discord</a></li>
 | ||
| <li><a href="#oh-my-posh">oh-my-posh</a></li>
 | ||
| <li><a href="#pester">Pester</a></li>
 | ||
| <li><a href="#ffmpeg">FFmpeg</a></li>
 | ||
| <li><a href="#pandoc">Pandoc</a></li>
 | ||
| </ul>
 | ||
| <h1 id="help">Help</h1>
 | ||
| <p><code>Get-Verb</code> действия/глаголы, утвержденные для
 | ||
| использования в командлетах<br />
 | ||
| <code>Get-Command *Language*</code> поиск команды по имени<br />
 | ||
| <code>(Get-Command Get-Language).Module</code> узнать к какому модулю
 | ||
| принадлежит команда<br />
 | ||
| <code>Get-Command Get-Content | fl Module,DLL</code> узнать
 | ||
| принадлежность команды к модулю и dll<br />
 | ||
| <code>Get-Command -Module LanguagePackManagement</code> отобразить
 | ||
| список команд указанного модуля<br />
 | ||
| <code>(Get-Module LanguagePackManagement).ExportedCommands.Values</code>
 | ||
| отобразить список команд указанного модуля<br />
 | ||
| <code>Get-Language | Get-Member</code> отобразить список методов команды
 | ||
| (действия), объекты вывода и Event (события объектов: Click)<br />
 | ||
| <code>(Get-Help Get-Service).Aliases</code> узнать псевдонимом
 | ||
| команды<br />
 | ||
| <code>Get-Alias gsv</code> узнать имя команды по псевдониму<br />
 | ||
| <code>Get-Help Get-Service</code> синтаксис<br />
 | ||
| <code>Get-Help Get-Service -Parameter *</code> описание всех
 | ||
| параметров<br />
 | ||
| <code>Get-Help Get-Service -Online</code><br />
 | ||
| <code>Get-Help Get-Service -ShowWindow</code> описание параметров в GUI
 | ||
| с фильтрацией<br />
 | ||
| <code>Show-Command</code> вывести список команд в GUI<br />
 | ||
| <code>Show-Command Get-Service</code> список параметров команды в
 | ||
| GUI<br />
 | ||
| <code>Invoke-Expression</code> iex принимает текст для выполнения в
 | ||
| консоли как команды<br />
 | ||
| <code>$PSVersionTable</code> версия PowerShell<br />
 | ||
| <code>Set-ExecutionPolicy Unrestricted</code><br />
 | ||
| <code>Get-ExecutionPolicy</code><br />
 | ||
| <code>$Metadata = New-Object System.Management.Automation.CommandMetaData (Get-Command Get-Service)</code>
 | ||
| получить информацию о командлете<br />
 | ||
| <code>[System.Management.Automation.ProxyCommand]::Create($Metadata)</code>
 | ||
| исходный код функции</p>
 | ||
| <h1 id="object">Object</h1>
 | ||
| <h3 id="variable">Variable</h3>
 | ||
| <p><code>$var = Read-Host "Enter"</code> ручной ввод<br />
 | ||
| <code>$pass = Read-Host "Enter Password" -AsSecureString</code> скрывать
 | ||
| набор<br />
 | ||
| <code>$global:path = "\\path"</code> задать глобальную переменную,
 | ||
| например в функции<br />
 | ||
| <code>$using:srv</code> использовать переменную текущей сесси в
 | ||
| Invoke-сессии<br />
 | ||
| <code>Get-Variable</code> отобразить все переменные<br />
 | ||
| <code>ls variable:/</code> отобразить все переменные<br />
 | ||
| <code>Get-Variable *srv*</code> найти переменную по имени<br />
 | ||
| <code>Get-Variable -Scope Global</code> отобразить все глобальные
 | ||
| переменные<br />
 | ||
| <code>Get-Variable Error</code> последняя команда с ошибкой<br />
 | ||
| <code>Remove-Variable -Name *</code> очистить все переменные<br />
 | ||
| <code>$LASTEXITCODE</code> содержит код вывода последней запущенной
 | ||
| программы, например ping. Если код возврата положительный (True), то
 | ||
| $LastExitCode = 0</p>
 | ||
| <h3 id="env">ENV</h3>
 | ||
| <p><code>Get-ChildItem Env:</code> отобразить все переменные
 | ||
| окружения<br />
 | ||
| <code>$env:PSModulePath</code> директории импорта модулей<br />
 | ||
| <code>$env:userprofile</code><br />
 | ||
| <code>$env:computername</code><br />
 | ||
| <code>$env:username</code><br />
 | ||
| <code>$env:userdnsdomain</code><br />
 | ||
| <code>$env:logonserver</code><br />
 | ||
| <code>([DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).Name</code><br />
 | ||
| <code>[Environment]::GetFolderPath('ApplicationData')</code></p>
 | ||
| <h3 id="history">History</h3>
 | ||
| <p><code>Get-History</code> история команд текущей сессии<br />
 | ||
| <code>(Get-History)[-1].Duration.TotalSeconds</code> время выполнения
 | ||
| последней команды<br />
 | ||
| <code>(Get-PSReadLineOption).HistorySavePath</code> путь к сохраненному
 | ||
| файлу с 4096 последних команд (из модуля PSReadLine)<br />
 | ||
| <code>Get-Content (Get-PSReadlineOption).HistorySavePath | Select-String Get</code>
 | ||
| поиск по содержимому файла (GREP)<br />
 | ||
| <code>Set-PSReadlineOption -MaximumHistoryCount 10000</code> изменить
 | ||
| количество сохраняемых команд в файл<br />
 | ||
| <code>Get-PSReadLineOption | select MaximumHistoryCount</code><br />
 | ||
| <code>Set-PSReadlineOption -HistorySaveStyle SaveNothing</code>
 | ||
| отключить ведение журнала<br />
 | ||
| <code>F2</code> переключиться с InlineView на ListView</p>
 | ||
| <h3 id="clipboard">Clipboard</h3>
 | ||
| <p><code>Set-Clipboard $srv</code> скопировать в буфер обмена<br />
 | ||
| <code>Get-Clipboard</code> вставить</p>
 | ||
| <h3 id="write">Write</h3>
 | ||
| <p><code>Write-Host -ForegroundColor Black -BackgroundColor Green "Test" -NoNewline</code><br />
 | ||
| <code>Write-Error Test</code><br />
 | ||
| <code>Foreach ($n in 1..100) {Write-Progress -Activity "Test Progress" -PercentComplete $n}</code></p>
 | ||
| <h3 id="array">Array</h3>
 | ||
| <p><code>$srv = @("server-01", "server-02")</code> создать массив<br />
 | ||
| <code>$srv += @("server-03")</code> добавить в массив новый
 | ||
| элемент<br />
 | ||
| <code>$srv.Count</code> отобразить кол-во элементов в массиве<br />
 | ||
| <code>Out-String</code> построчный вывод</p>
 | ||
| <h3 id="index">Index</h3>
 | ||
| <p><code>$srv[0]</code> вывести первое значение элемента массива<br />
 | ||
| <code>$srv[0] = Name</code> замена элемента в массиве<br />
 | ||
| <code>$srv[0].Length</code> узнать кол-во символов первого значения в
 | ||
| массиве<br />
 | ||
| <code>$srv[10..100]</code> срез</p>
 | ||
| <div class="sourceCode" id="cb1"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="va">$array</span> <span class="op">=</span> <span class="st">"a"</span><span class="op">,</span><span class="st">"b"</span><span class="op">,</span><span class="st">"c"</span><span class="op">,</span><span class="st">"d"</span></span>
 | ||
| <span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="va">$num</span> <span class="op">=</span> <span class="dv">0</span></span>
 | ||
| <span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="dt">foreach</span> <span class="op">(</span><span class="va">$a</span> <span class="kw">in</span> <span class="va">$array</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a><span class="va">$num</span> <span class="op">+=</span> <span class="dv">1</span></span>
 | ||
| <span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a><span class="va">$index</span> <span class="op">=</span> <span class="op">[</span>array<span class="op">]::</span>IndexOf<span class="op">(</span><span class="va">$array</span><span class="op">,</span> <span class="va">$a</span><span class="op">)</span> <span class="co"># узнать номер индекса по зачению</span></span>
 | ||
| <span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a><span class="va">$array</span><span class="op">[</span><span class="va">$index</span><span class="op">]</span> <span class="op">=</span> <span class="va">$num</span> <span class="co"># пересобрать исходный массив</span></span>
 | ||
| <span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <h3 id="hashtable">HashTable</h3>
 | ||
| <div class="sourceCode" id="cb2"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="va">$hashtable</span> <span class="op">=</span> @<span class="op">{</span><span class="st">"User"</span> <span class="op">=</span> <span class="st">"</span><span class="va">$env</span><span class="op">:</span><span class="va">username</span><span class="st">"</span><span class="op">;</span> <span class="st">"Server"</span> <span class="op">=</span> <span class="st">"</span><span class="va">$env</span><span class="op">:</span><span class="va">computername</span><span class="st">"</span><span class="op">}</span> <span class="co"># создать</span></span>
 | ||
| <span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="va">$hashtable</span> <span class="op">+=</span> @<span class="op">{</span><span class="st">"User2"</span> <span class="op">=</span> <span class="st">"</span><span class="va">$env</span><span class="op">:</span><span class="va">username</span><span class="st">"</span><span class="op">;</span> <span class="st">"Server2"</span> <span class="op">=</span> <span class="st">"</span><span class="va">$env</span><span class="op">:</span><span class="va">computername</span><span class="st">"</span><span class="op">}</span> <span class="co"># добавить ключи</span></span>
 | ||
| <span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="va">$hashtable</span><span class="op">.</span><span class="fu">Keys</span> <span class="co"># список всех ключей</span></span>
 | ||
| <span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="va">$hashtable</span><span class="op">[</span><span class="st">"User"</span><span class="op">]</span> <span class="co"># получить значение (Values) по ключу</span></span>
 | ||
| <span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a><span class="va">$hashtable</span><span class="op">[</span><span class="st">"User"</span><span class="op">]</span> <span class="op">=</span> <span class="st">"Test"</span> <span class="co"># изменить</span></span>
 | ||
| <span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a><span class="va">$hashtable</span><span class="op">.</span><span class="fu">Remove</span><span class="op">(</span><span class="st">"User"</span><span class="op">)</span> <span class="co"># удалить ключ</span></span></code></pre></div>
 | ||
| <p><code>$Tag = @{$true = 'dev'; $false = 'prod'}[([System.Net.Dns]::GetHostEntry("localhost").HostName) -match '.*.TestDomain$']</code></p>
 | ||
| <h3 id="collectionslist">Collections/List</h3>
 | ||
| <div class="sourceCode" id="cb3"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Collections</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Collections</span><span class="op">.</span><span class="fu">Generic</span><span class="op">.</span><span class="fu">List</span><span class="op">[</span>System<span class="op">.</span><span class="fu">Object</span><span class="op">]</span></span>
 | ||
| <span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Collections</span><span class="op">.</span><span class="fu">Add</span><span class="op">([</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span>User <span class="op">=</span> <span class="va">$env</span><span class="op">:</span><span class="va">username</span><span class="op">;</span> Server <span class="op">=</span> <span class="va">$env</span><span class="op">:</span><span class="va">computername</span><span class="op">})</span></span></code></pre></div>
 | ||
| <h3 id="pscustomobject">PSCustomObject</h3>
 | ||
| <div class="sourceCode" id="cb4"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="va">$CustomObject</span> <span class="op">=</span> <span class="op">[</span>PSCustomObject<span class="op">][</span>ordered<span class="op">]</span>@<span class="op">{</span>User <span class="op">=</span> <span class="va">$env</span><span class="op">:</span><span class="va">username</span><span class="op">;</span> Server <span class="op">=</span> <span class="va">$env</span><span class="op">:</span><span class="va">computername</span><span class="op">}</span></span>
 | ||
| <span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a><span class="va">$CustomObject</span> <span class="op">|</span> <span class="fu">Add-Member</span> –MemberType NoteProperty –Name Arr –Value <span class="op">@(</span><span class="dv">1</span><span class="op">,</span><span class="dv">2</span><span class="op">,</span><span class="dv">3</span><span class="op">)</span> <span class="co"># добавить Property (свойство/стобец)</span></span>
 | ||
| <span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a><span class="va">$CustomObject</span><span class="op">.</span><span class="fu">Arr</span> <span class="op">=</span> <span class="op">@(</span><span class="dv">1</span><span class="op">,</span><span class="dv">3</span><span class="op">,</span><span class="dv">5</span><span class="op">)</span> <span class="co"># изменить содержимое</span></span>
 | ||
| <span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a><span class="va">$CustomObject</span><span class="op">.</span><span class="fu">PsObject</span><span class="op">.</span><span class="fu">Properties</span><span class="op">.</span><span class="fu">Remove</span><span class="op">(</span><span class="st">'User'</span><span class="op">)</span> <span class="co"># удалить Property</span></span></code></pre></div>
 | ||
| <h3 id="add-member">Add-Member</h3>
 | ||
| <div class="sourceCode" id="cb5"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="va">$ScriptBlock</span> <span class="op">=</span> <span class="op">{</span><span class="fu">Get-Service</span><span class="op">}</span></span>
 | ||
| <span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a><span class="va">$CustomObject</span> <span class="op">|</span> <span class="fu">Add-Member</span> <span class="op">-</span>Name <span class="st">"TestMethod"</span> <span class="op">-</span>MemberType ScriptMethod <span class="op">-</span>Value <span class="va">$ScriptBlock</span> <span class="co"># Добавить Method</span></span>
 | ||
| <span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a><span class="va">$CustomObject</span> <span class="op">|</span> <span class="fu">Get-Member</span></span>
 | ||
| <span id="cb5-4"><a href="#cb5-4" aria-hidden="true" tabindex="-1"></a><span class="va">$CustomObject</span><span class="op">.</span><span class="fu">TestMethod</span><span class="op">()</span></span></code></pre></div>
 | ||
| <h3 id="class">Class</h3>
 | ||
| <div class="sourceCode" id="cb6"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="cf">Class</span> CustomClass <span class="op">{</span></span>
 | ||
| <span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$User</span></span>
 | ||
| <span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$Server</span></span>
 | ||
| <span id="cb6-4"><a href="#cb6-4" aria-hidden="true" tabindex="-1"></a><span class="fu">Start</span><span class="op">([</span><span class="dt">bool</span><span class="op">]</span><span class="va">$Param1</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb6-5"><a href="#cb6-5" aria-hidden="true" tabindex="-1"></a><span class="cf">If</span> <span class="op">(</span><span class="va">$Param1</span><span class="op">)</span> <span class="op">{</span><span class="fu">Write-Host</span> <span class="st">"Start Function"</span><span class="op">}}</span></span>
 | ||
| <span id="cb6-6"><a href="#cb6-6" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb6-7"><a href="#cb6-7" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb6-8"><a href="#cb6-8" aria-hidden="true" tabindex="-1"></a><span class="va">$Class</span> <span class="op">=</span> <span class="fu">New-Object</span> <span class="op">-</span>TypeName CustomClass</span>
 | ||
| <span id="cb6-9"><a href="#cb6-9" aria-hidden="true" tabindex="-1"></a><span class="va">$Class</span><span class="op">.</span><span class="fu">User</span> <span class="op">=</span> <span class="va">$env</span><span class="op">:</span><span class="va">username</span></span>
 | ||
| <span id="cb6-10"><a href="#cb6-10" aria-hidden="true" tabindex="-1"></a><span class="va">$Class</span><span class="op">.</span><span class="fu">Server</span> <span class="op">=</span> <span class="va">$env</span><span class="op">:</span><span class="va">computername</span></span>
 | ||
| <span id="cb6-11"><a href="#cb6-11" aria-hidden="true" tabindex="-1"></a><span class="va">$Class</span><span class="op">.</span><span class="fu">Start</span><span class="op">(</span><span class="dv">1</span><span class="op">)</span></span></code></pre></div>
 | ||
| <h3 id="pipeline">Pipeline</h3>
 | ||
| <p><code>$obj | Add-Member -MemberType NoteProperty -Name "Type" -Value "user" -Force</code>
 | ||
| добавление объкта вывода NoteProperty<br />
 | ||
| <code>$obj | Add-Member -MemberType NoteProperty -Name "User" -Value "admin" -Force</code>
 | ||
| изменеие содержимого для сущности объекта User<br />
 | ||
| <code>ping $srv | Out-Null</code> перенаправить результат вывода в
 | ||
| Out-Null</p>
 | ||
| <h3 id="select-object">Select-Object</h3>
 | ||
| <p><code>Get-Process | Select-Object -Property *</code> отобразить все
 | ||
| доступные объекты вывода<br />
 | ||
| <code>Get-Process | select -Unique "Name"</code> удалить повторяющиеся
 | ||
| значения в массиве<br />
 | ||
| <code>Get-Process | select -ExpandProperty ProcessName</code>
 | ||
| преобразовать из объекта-коллекции в массив (вывести содержимое без
 | ||
| наименовая столбца)<br />
 | ||
| <code>(Get-Process | ? Name -match iperf).Modules</code> список
 | ||
| используемых модулей процессом</p>
 | ||
| <h3 id="expression">Expression</h3>
 | ||
| <div class="sourceCode" id="cb7"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="fu">ps</span> <span class="op">|</span> <span class="fu">Sort-Object</span> <span class="op">-</span>Descending CPU <span class="op">|</span> <span class="fu">select</span> <span class="op">-</span>first <span class="dv">10</span> ProcessName<span class="op">,</span> <span class="co"># сортировка по CPU, вывести первых 10 значений (-first)</span></span>
 | ||
| <span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a>@<span class="op">{</span>Name<span class="op">=</span><span class="st">"ProcessorTime"</span><span class="op">;</span> Expression<span class="op">={</span><span class="va">$_</span><span class="op">.</span><span class="fu">TotalProcessorTime</span> <span class="op">-replace</span> <span class="st">"\.\d+$"</span><span class="op">}},</span> <span class="co"># затрачено процессорного времени в минутах</span></span>
 | ||
| <span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a>@<span class="op">{</span>Name<span class="op">=</span><span class="st">"Memory"</span><span class="op">;</span> Expression<span class="op">={[</span><span class="dt">string</span><span class="op">]([</span><span class="dt">int</span><span class="op">](</span><span class="va">$_</span><span class="op">.</span><span class="fu">WS</span> <span class="op">/</span> <span class="dv">1024</span><span class="dt">kb</span><span class="op">))+</span><span class="st">"MB"</span><span class="op">}},</span> <span class="co"># делим байты на КБ</span></span>
 | ||
| <span id="cb7-4"><a href="#cb7-4" aria-hidden="true" tabindex="-1"></a>@<span class="op">{</span>Label<span class="op">=</span><span class="st">"RunTime"</span><span class="op">;</span> Expression<span class="op">={((</span><span class="fu">Get-Date</span><span class="op">)</span> <span class="op">-</span> <span class="va">$_</span><span class="op">.</span><span class="fu">StartTime</span><span class="op">)</span> <span class="op">-replace</span> <span class="st">"\.\d+$"</span><span class="op">}}</span> <span class="co"># вычесть из текущего времени - время запуска, и удалить milisec</span></span></code></pre></div>
 | ||
| <h3 id="select-string">Select-String</h3>
 | ||
| <p><code>$(ipconfig | Select-String IPv4) -replace ".+: " | Where-Object {$_ -match "^172."}</code>
 | ||
| узнать только IP<br />
 | ||
| <code>$Current_IP = Get-Content $RDCMan_RDG_PATH | Select-String $RDCMan_Display_Name -Context 0,1</code>
 | ||
| получить две строки<br />
 | ||
| <code>$Current_IP = $Current_IP.Context.DisplayPostContext[0] -replace ".+<name>|<\/name>"</code>
 | ||
| забрать только вторую строку и удалить тэги</p>
 | ||
| <h3 id="format-tableformat-list">Format-Table/Format-List</h3>
 | ||
| <p><code>Get-Process | ft ProcessName, StartTime -Autosize</code>
 | ||
| автоматическая группировка размера столбцов</p>
 | ||
| <h3 id="measure-object">Measure-Object</h3>
 | ||
| <p><code>Get-Process | Measure | select Count</code> кол-во
 | ||
| объектов<br />
 | ||
| <code>Get-Process | Measure -Line -Word -Character</code> кол-во строк,
 | ||
| слов и Char объектов<br />
 | ||
| <code>Get-Process | Measure-Object PM -sum | Select-Object Count,@{Name="MEM_MB"; Expression={[int]($_.Sum/1mb)}}</code>
 | ||
| кол-во процессов и общий объем занятой памяти в МБайт</p>
 | ||
| <h3 id="compare-object">Compare-Object</h3>
 | ||
| <p><code>Compare-Object -ReferenceObject (Get-Content -Path .\file1.txt) -DifferenceObject (Get-Content -Path .\file2.txt)</code>
 | ||
| сравнение двух файлов<br />
 | ||
| <code>$group1 = Get-ADGroupMember -Identity "Domain Admins"</code><br />
 | ||
| <code>$group2 = Get-ADGroupMember -Identity "Enterprise Admins"</code><br />
 | ||
| <code>Compare-Object -ReferenceObject $group1 -DifferenceObject $group2 -IncludeEqual</code>
 | ||
| <code>==</code> нет изменений<br />
 | ||
| <code><=</code> есть изменения в $group1<br />
 | ||
| <code>=></code> есть изменения в $group2</p>
 | ||
| <h3 id="where-object">Where-Object (?)</h3>
 | ||
| <p><code>Get-Process | Where-Object {$_.ProcessName -match "zabbix"}</code>
 | ||
| фильтрация/поиск процессов по имени свойства объекта<br />
 | ||
| <code>Get-Process | where CPU -gt 10 | Sort-Object -Descending CPU</code>
 | ||
| вывести объекты, где значения CPU больше 10<br />
 | ||
| <code>Get-Process | where WS -gt 200MB</code> отобразить процессы где WS
 | ||
| выше 200МБ<br />
 | ||
| <code>Get-Service | where Name -match "zabbix"</code> поиск службы<br />
 | ||
| <code>Get-Service -ComputerName $srv | Where {$_.Name -match "WinRM"} | Restart-Service</code>
 | ||
| перезапустить службу на удаленном компьютере<br />
 | ||
| <code>(Get-Service).DisplayName</code> вывести значения свойства
 | ||
| массива<br />
 | ||
| <code>netstat -an | where {$_ -match 443}</code><br />
 | ||
| <code>netstat -an | ?{$_ -match 443}</code><br />
 | ||
| <code>(netstat -an) -match 443</code></p>
 | ||
| <h3 id="sort-object">Sort-Object</h3>
 | ||
| <p><code>Get-Process | Sort-Object -Descending CPU | ft</code> обратная
 | ||
| (-Descending) сортировка по CPU<br />
 | ||
| <code>$path[-1..-10]</code> обратная сборка массива без сортировки</p>
 | ||
| <h3 id="lastfirst">Last/First</h3>
 | ||
| <p><code>Get-Process | Sort-Object -Descending CPU | select -First 10</code>
 | ||
| вывести первых 10 объектов<br />
 | ||
| <code>Get-Process | Sort-Object -Descending CPU | select -Last 10</code>
 | ||
| вывести последних 10 объектов</p>
 | ||
| <h3 id="group-object">Group-Object</h3>
 | ||
| <div class="sourceCode" id="cb8"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Groups</span> <span class="op">=</span> <span class="fu">Get-CimInstance</span> <span class="op">-</span>Class Win32_PnPSignedDriver <span class="op">|</span></span>
 | ||
| <span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a><span class="fu">Select-Object</span> DriverProviderName<span class="op">,</span> FriendlyName<span class="op">,</span> Description<span class="op">,</span> DriverVersion<span class="op">,</span> DriverDate <span class="op">|</span></span>
 | ||
| <span id="cb8-3"><a href="#cb8-3" aria-hidden="true" tabindex="-1"></a><span class="fu">Group-Object</span> DriverProviderName<span class="op">,</span> FriendlyName<span class="op">,</span> Description<span class="op">,</span> DriverVersion<span class="op">,</span> DriverDate</span>
 | ||
| <span id="cb8-4"><a href="#cb8-4" aria-hidden="true" tabindex="-1"></a><span class="op">$(</span><span class="cf">foreach</span> <span class="op">(</span><span class="va">$Group</span> <span class="kw">in</span> <span class="va">$Groups</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb8-5"><a href="#cb8-5" aria-hidden="true" tabindex="-1"></a>    <span class="va">$Group</span><span class="op">.</span><span class="fu">Group</span><span class="op">[</span><span class="dv">0</span><span class="op">]</span></span>
 | ||
| <span id="cb8-6"><a href="#cb8-6" aria-hidden="true" tabindex="-1"></a><span class="op">})</span> <span class="op">|</span> <span class="fu">Format-Table</span></span></code></pre></div>
 | ||
| <h1 id="npp">npp</h1>
 | ||
| <p><code>pwsh -NoExit -ExecutionPolicy Unrestricted -WindowStyle Maximized -File "$(FULL_CURRENT_PATH)"</code></p>
 | ||
| <p><code>%AppData%\Notepad++</code> themes/shortcuts.xml</p>
 | ||
| <pre><code><?xml version="1.0" encoding="UTF-8" ?>
 | ||
| <NotepadPlus>
 | ||
|     <InternalCommands />
 | ||
|     <Macros>
 | ||
|         <Macro name="`+\+&gt;" 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 &quot;$(FULL_CURRENT_PATH)&quot;</Command>
 | ||
|     </UserDefinedCommands>
 | ||
|     <PluginCommands />
 | ||
|     <ScintillaKeys />
 | ||
| </NotepadPlus></code></pre>
 | ||
| <p><code>Parsing text to Markdown:</code><br />
 | ||
| <code>Macros: FnLeft+'+FnRight+FnRight+\s\\+Down</code><br />
 | ||
| <code>Replace: "# ","'"</code></p>
 | ||
| <pre><code>.       # Обозначает любой символ
 | ||
| \       # Экранирующий символ. Символы которые экранируются: ^, [, ., $, {, *, (, ), \, +, |, ?, <, >
 | ||
| ^       # Начало строки
 | ||
| $       # Конец строки
 | ||
| \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 или больше и любое кол-во символов</code></pre>
 | ||
| <h1 id="regex">Regex</h1>
 | ||
| <p><code>-replace "1","2"</code> замена элементов в индексах массива
 | ||
| (везде где присутствует 1, заменить на 2), для удаления используется
 | ||
| только первое значение<br />
 | ||
| <code>-split " "</code> преобразовать строку в массив, разделителем
 | ||
| указан пробел, которой удаляется ($url.Split(“/”)[-1])<br />
 | ||
| <code>-join " "</code> преобразовать массив (коллекцию) в единую строку
 | ||
| (string), добавить разделителем пробел<br />
 | ||
| </p>
 | ||
| <p><code>-like *txt*</code> поиск по маскам wildcard, выводит значение
 | ||
| на экран<br />
 | ||
| <code>-match txt</code> поиска по шаблонам, проверка на соответствие
 | ||
| содержимого текста<br />
 | ||
| <code>-match "zabbix|rpc"</code> условия, для поиска по нескольким
 | ||
| словам<br />
 | ||
| <code>-NotMatch</code> проверка на отсутствие вхождения<br />
 | ||
| </p>
 | ||
| <h3 id="matches">Matches</h3>
 | ||
| <p><code>$ip = "192.168.10.1"</code><br />
 | ||
| <code>$ip -match "(\.\d{1,3})\.\d{1,2}"</code> True<br />
 | ||
| <code>$Matches</code> отобразить все подходящие переменные последнего
 | ||
| поиска, которые входят и не входят в группы ()</p>
 | ||
| <p><code>$String = "09/14/2017 12:00:27 - mtbill_post_201709141058.txt 7577_Delivered: OK"</code><br />
 | ||
| <code>$String -Match ".*(?=\.txt)" | Out-Null</code><br />
 | ||
| <code>$Matches[0][-4..-1] -Join ""</code></p>
 | ||
| <p><code>$string.Substring($string.IndexOf(".txt")-4, 4)</code> 2-й
 | ||
| вариант (IndexOf)`</p>
 | ||
| <h3 id="форматирование-.net-method-format">Форматирование (.NET method
 | ||
| format)</h3>
 | ||
| <p><code>[string]::Format("{1} {0}","Index0","Index1")</code><br />
 | ||
| <code>"{1} {0}" -f "Index0","Index1"</code><br />
 | ||
| <code>"{0:###-##-##}" -f 1234567</code> записать число в другом формате
 | ||
| (#)<br />
 | ||
| <code>"{0:0000}" -f 123</code> вывести число в формате не меньше 4
 | ||
| знаков (0123)<br />
 | ||
| <code>"{0:P0}" -f (220/1000)</code> посчитать в процентах (P)<br />
 | ||
| <code>"{0:P}" -f (512MB/1GB)</code> сколько % составляет 512Мб от
 | ||
| 1Гб<br />
 | ||
| <code>"{0:0.0%}" -f 0.123</code> умножить на 100%</p>
 | ||
| <div class="sourceCode" id="cb11"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a><span class="va">$gp</span> <span class="op">=</span> <span class="fu">Get-Process</span> <span class="op">|</span> <span class="fu">sort</span> cpu <span class="op">-</span>Descending <span class="op">|</span> <span class="fu">select</span> <span class="op">-</span>First <span class="dv">10</span></span>
 | ||
| <span id="cb11-2"><a href="#cb11-2" aria-hidden="true" tabindex="-1"></a><span class="dt">foreach</span> <span class="op">(</span><span class="va">$p</span> <span class="kw">in</span> <span class="va">$gp</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb11-3"><a href="#cb11-3" aria-hidden="true" tabindex="-1"></a><span class="st">"{0} - {1:N2}"</span> <span class="op">-</span>f <span class="va">$p</span><span class="op">.</span><span class="fu">processname</span><span class="op">,</span> <span class="va">$p</span><span class="op">.</span><span class="fu">cpu</span> <span class="co"># округлить</span></span>
 | ||
| <span id="cb11-4"><a href="#cb11-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <h3 id="условный-оператор">Условный оператор</h3>
 | ||
| <p><code>$rh = Read-Host</code><br />
 | ||
| <code>if ($rh -eq 1) {ipconfig} elseif ($rh -eq 2) {getmac} else {hostname}</code><br />
 | ||
| Если условие if () является истенным (<span
 | ||
| class="math inline"><em>T</em><em>r</em><em>u</em><em>e</em>), <em>в</em><em>ы</em><em>п</em><em>о</em><em>л</em><em>н</em><em>и</em><em>т</em><em>ь</em><em>д</em><em>е</em><em>й</em><em>с</em><em>т</em><em>в</em><em>и</em><em>е</em><em>в</em> <em>Е</em><em>с</em><em>л</em><em>и</em><em>у</em><em>с</em><em>л</em><em>о</em><em>в</em><em>и</em><em>е</em><em>i</em><em>f</em>()<em>я</em><em>в</em><em>л</em><em>я</em><em>е</em><em>т</em><em>с</em><em>я</em><em>л</em><em>о</em><em>ж</em><em>н</em><em>ы</em><em>м</em>(</span>False),
 | ||
| выполнить действие не обязательного оператора else<br />
 | ||
| Условие Elseif идёт после условия if для проверки дополнительных условий
 | ||
| перед выполнение оператора else. Оператор, который первый вернет $True,
 | ||
| отменит выполнение следующих дополнительных условий<br />
 | ||
| Если передать переменную в условие без оператора, то будет проверяться
 | ||
| наличие значения у переменной на <span
 | ||
| class="math inline"><em>T</em><em>r</em><em>u</em><em>e</em>/</span>False<br />
 | ||
| <code>if ((tnc $srv -Port 80).TcpTestSucceeded) {"Opened port"} else {"Closed port"}</code></p>
 | ||
| <h3 id="операторы">Операторы</h3>
 | ||
| <p><code>-eq</code> равно (equal)<br />
 | ||
| <code>-ceq</code> учитывать регистр<br />
 | ||
| <code>-ne</code> не равно (not equal)<br />
 | ||
| <code>-gt</code> больше (greater)<br />
 | ||
| <code>-ge</code> больше или равно<br />
 | ||
| <code>-lt</code> меньше (less)<br />
 | ||
| <code>-le</code> меньше или равно<br />
 | ||
| <code>-in</code> проверить на наличие (5 -in @(1,2,3,4,5))<br />
 | ||
| <code>-NOT</code> логическое НЕТ !(Test-Path $path)<br />
 | ||
| <code>-and</code> логическое И<br />
 | ||
| <code>-or</code> логическое ИЛИ<br />
 | ||
| <code>if ((($1 -eq 1) -and ($2 -eq 2)) -or ($1 -ne 3)) {"$true"} else {"$false"}</code>
 | ||
| два условия: (если $1 = 1 и $2 = 2) или $1 не равно 3</p>
 | ||
| <h3 id="pipeline-operators">Pipeline Operators</h3>
 | ||
| <p><code>Write-Output "First" && Write-Output "Second"</code>
 | ||
| две успешные команды выполняются<br />
 | ||
| <code>Write-Error "Bad" && Write-Output "Second"</code> первая
 | ||
| команда завершается ошибкой, из-за чего вторая команда не
 | ||
| выполняется<br />
 | ||
| <code>Write-Error "Bad" || Write-Output "Second"</code> первая команда
 | ||
| завершается ошибкой, поэтому выполняется вторая команда<br />
 | ||
| <code>Write-Output "First" || Write-Output "Second"</code> первая
 | ||
| команда выполнена успешно, поэтому вторая команда не выполняется</p>
 | ||
| <h3 id="invocation-operator">Invocation Operator</h3>
 | ||
| <p><code>$addr = "8.8.8.8"</code><br />
 | ||
| <code>$ping = "ping"</code><br />
 | ||
| <code>& $ping $addr</code> запускает текст как команду</p>
 | ||
| <p><code>& $ping $addr &</code> запустить команду в фоне<br />
 | ||
| <code>(Get-Job)[-1] | Receive-Job -Keep</code></p>
 | ||
| <h3 id="специальные-символы">Специальные символы</h3>
 | ||
| <p><code>\d</code> число от 0 до 9 (20-07-2022 эквивалент: “)<br />
 | ||
| <code>\D</code> обозначает любой символ, кроме цифры. Удаления всех
 | ||
| символов, кроме цифр: [int]$(”123 test” -replace “”)<br />
 | ||
| <code>\w</code> буква от “a” до “z” и от “A” до “Z” или число от 0 до
 | ||
| 9<br />
 | ||
| <code>\s</code> пробел, эквивалент: ” ”<br />
 | ||
| <code>\n</code> новая строка<br />
 | ||
| <code>\b</code> маска, определяет начало и конец целого словосочетания
 | ||
| для поиска<br />
 | ||
| <code>.</code> обозначает любой символ, кроме новой строки<br />
 | ||
| <code>\</code> экранирует любой специальны символ (метасимвол).
 | ||
| Используется, если нужно указать конкретный символ, вместо специального
 | ||
| ({ } [ ] /  + * . $ ^ | ?)<br />
 | ||
| <code>+</code> повторяется 1 и более раз (+)<br />
 | ||
| <code>{1,25}</code> квантификатор, указывает количество повторений
 | ||
| символа слева на право (от 1 до 25 раз)<br />
 | ||
| <code>[]</code> поиск совпадения любой буквы, например, [A-z0-9] от A до
 | ||
| z и цифры от 0 до 9 (“192.168.1.1” -match “192.1[6-7][0-9]”)</p>
 | ||
| <h3 id="якори">Якори</h3>
 | ||
| <p><code>^</code> или <code>\A</code> определяет начало строки. <span
 | ||
| class="math inline">$url -replace '^','https:'` добавить в начало; \
 | ||
| `$</span><code>или</code><code>обозначают конец строки. $ip -replace "\d{1,3}$","0" \</code>(?=text)<code>поиск слова слева. Пишем слева на право от искомого (ищет только целые словосочетания) "Server:\s(.{1,30})\s(?=$username)" \</code>(?<=text)<code>поиск слова справа. $in_time -replace ".+(?<=Last)"</code>
 | ||
| удалить все до слова Last<br />
 | ||
| <code>(?!text)</code> не совпадает со словом слева<br />
 | ||
| <code>(?<!text)</code> не совпадает со словом справа</p>
 | ||
| <p><code>$test = "string"</code><br />
 | ||
| <code>$test -replace ".{1}$"</code> удалить любое кол-во символов в
 | ||
| конце строки<br />
 | ||
| <code>$test -replace "^.{1}"</code> удалить любое кол-во символов в
 | ||
| начале строки<br />
 | ||
| </p>
 | ||
| <h3 id="группы-захвата">Группы захвата</h3>
 | ||
| <p><code>$date = '12.31.2021'</code><br />
 | ||
| <code>$date -replace '^(\d{2}).(\d{2})','$2.$1'</code> поменять
 | ||
| местами<br />
 | ||
| <code>$1</code> содержимое первой группы в скобках<br />
 | ||
| <code>$2</code> содержимое второй группы</p>
 | ||
| <h1 id="datatype">DataType</h1>
 | ||
| <p><code>$srv.GetType()</code> узнать тип данных<br />
 | ||
| <code>$srv -is [string]</code> проверка на соответствие типа
 | ||
| данных<br />
 | ||
| <code>$srv -isnot [System.Object]</code> проверка на
 | ||
| несоответствие<br />
 | ||
| <code>[Object]</code> массив (BaseType:System.Array)<br />
 | ||
| <code>[DateTime]</code> формат времени (BaseType:System.ValueType)<br />
 | ||
| <code>[Bool]/[Boolean]</code> логическое значение (<span
 | ||
| class="math inline"><em>T</em><em>r</em><em>u</em><em>e</em>/</span>False)
 | ||
| или 1/0 (1 бит) наличие/отсуствие напряжения<br />
 | ||
| <code>[Byte]</code> 8-битное (1 байт) целое число без знака
 | ||
| (0..255)<br />
 | ||
| <code>[Int16]</code> 16-битное знаковое целое число от -32767 до 32767
 | ||
| (тип данных WORD 0..65535)<br />
 | ||
| <code>[Int]</code> 32-битное (4 байта) знаковое целое число от
 | ||
| –2147483648 до 2147483647 (DWORD)<br />
 | ||
| <code>[Int64]</code> 64-битное от -9223372036854775808 до
 | ||
| 9223372036854775808 (LWORD)<br />
 | ||
| <code>[Decimal]</code> 128-битное десятичное значение от
 | ||
| –79228162514264337593543950335 до 79228162514264337593543950335<br />
 | ||
| <code>[Single]</code> число с плавающей запятой (32-разрядное)<br />
 | ||
| <code>[Double]</code> число с плавающей запятой с двойной точностью
 | ||
| (64-разрядное)<br />
 | ||
| <code>[String]</code> неизменяемая строка символов Юникода фиксированной
 | ||
| длины (BaseType:System.Object)</p>
 | ||
| <h3 id="math">Math</h3>
 | ||
| <p><code>[math] | Get-Member -Static</code><br />
 | ||
| <code>[math]::Pow(2,4)</code> 2 в 4 степени<br />
 | ||
| <code>[math]::Truncate(1.8)</code> грубое округление, удаляет дробную
 | ||
| часть<br />
 | ||
| <code>[math]::Ceiling(1.8)</code> округляет число в большую сторону до
 | ||
| ближайшего целого значения<br />
 | ||
| <code>[math]::Floor(-1.8)</code> округляет число в меньшую сторону<br />
 | ||
| <code>[math]::Min(33,22)</code> возвращает наименьшее значение двух
 | ||
| значений<br />
 | ||
| <code>[math]::Max(33,22)</code> возвращает наибольшее значение двух
 | ||
| значений</p>
 | ||
| <h3 id="round">Round</h3>
 | ||
| <p><code>[double]::Round(87.5, 0)</code> 88 (нечетное), в .NET по
 | ||
| умолчанию используется округление в средней точке ToEven, где *.5
 | ||
| значения округляются до ближайшего четного целого числа.<br />
 | ||
| <code>[double]::Round(88.5, 0)</code> 88 (четное)<br />
 | ||
| <code>[double]::Round(88.5, 0, 1)</code> 89 (округлять в большую
 | ||
| сторону)<br />
 | ||
| <code>[double]::Round(1234.56789, 2)</code> округлить до 2 символов
 | ||
| после запятой</p>
 | ||
| <h3 id="tostring">ToString</h3>
 | ||
| <p><code>(4164539/1MB).ToString("0.00")</code> разделить на дважды на
 | ||
| 1024/1024 и округлить до 3,97</p>
 | ||
| <h3 id="char">Char</h3>
 | ||
| <p><code>[Char]</code> cимвол Юникода (16-разрядный)<br />
 | ||
| <code>$char = $srv.ToCharArray()</code> разбить строку [string] на
 | ||
| массив [System.Array] из букв<br />
 | ||
| </p>
 | ||
| <h3 id="switch">Switch</h3>
 | ||
| <div class="sourceCode" id="cb12"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a><span class="va">$MMM</span> <span class="op">=</span> <span class="fu">Get-Date</span> <span class="op">-</span>UFormat <span class="st">"%m"</span></span>
 | ||
| <span id="cb12-2"><a href="#cb12-2" aria-hidden="true" tabindex="-1"></a><span class="cf">switch</span><span class="op">(</span><span class="va">$MMM</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb12-3"><a href="#cb12-3" aria-hidden="true" tabindex="-1"></a><span class="st">"01"</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">'Jan'</span><span class="op">}</span></span>
 | ||
| <span id="cb12-4"><a href="#cb12-4" aria-hidden="true" tabindex="-1"></a><span class="st">"02"</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">'Feb'</span><span class="op">}</span></span>
 | ||
| <span id="cb12-5"><a href="#cb12-5" aria-hidden="true" tabindex="-1"></a><span class="st">"03"</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">'Mar'</span><span class="op">}</span></span>
 | ||
| <span id="cb12-6"><a href="#cb12-6" aria-hidden="true" tabindex="-1"></a><span class="st">"04"</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">'Apr'</span><span class="op">}</span></span>
 | ||
| <span id="cb12-7"><a href="#cb12-7" aria-hidden="true" tabindex="-1"></a><span class="st">"05"</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">'May'</span><span class="op">}</span></span>
 | ||
| <span id="cb12-8"><a href="#cb12-8" aria-hidden="true" tabindex="-1"></a><span class="st">"06"</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">'Jun'</span><span class="op">}</span></span>
 | ||
| <span id="cb12-9"><a href="#cb12-9" aria-hidden="true" tabindex="-1"></a><span class="st">"07"</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">'Jul'</span><span class="op">}</span></span>
 | ||
| <span id="cb12-10"><a href="#cb12-10" aria-hidden="true" tabindex="-1"></a><span class="st">"08"</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">'Aug'</span><span class="op">}</span></span>
 | ||
| <span id="cb12-11"><a href="#cb12-11" aria-hidden="true" tabindex="-1"></a><span class="st">"09"</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">'Sep'</span><span class="op">}</span></span>
 | ||
| <span id="cb12-12"><a href="#cb12-12" aria-hidden="true" tabindex="-1"></a><span class="st">"10"</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">'Oct'</span><span class="op">}</span></span>
 | ||
| <span id="cb12-13"><a href="#cb12-13" aria-hidden="true" tabindex="-1"></a><span class="st">"11"</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">'Nov'</span><span class="op">}</span></span>
 | ||
| <span id="cb12-14"><a href="#cb12-14" aria-hidden="true" tabindex="-1"></a><span class="st">"12"</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">'Dec'</span><span class="op">}</span></span>
 | ||
| <span id="cb12-15"><a href="#cb12-15" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <h3 id="function-switch">function switch</h3>
 | ||
| <div class="sourceCode" id="cb13"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a><span class="kw">Function</span> fun-switch <span class="op">(</span></span>
 | ||
| <span id="cb13-2"><a href="#cb13-2" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">switch</span><span class="op">]</span><span class="va">$param</span></span>
 | ||
| <span id="cb13-3"><a href="#cb13-3" aria-hidden="true" tabindex="-1"></a><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb13-4"><a href="#cb13-4" aria-hidden="true" tabindex="-1"></a><span class="cf">If</span> <span class="op">(</span><span class="va">$param</span><span class="op">)</span> <span class="op">{</span><span class="st">"yes"</span><span class="op">}</span> <span class="cf">else</span> <span class="op">{</span><span class="st">"no"</span><span class="op">}</span></span>
 | ||
| <span id="cb13-5"><a href="#cb13-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb13-6"><a href="#cb13-6" aria-hidden="true" tabindex="-1"></a>fun-switch <span class="op">-</span>param</span></code></pre></div>
 | ||
| <h1 id="bit">Bit</h1>
 | ||
| <pre><code>Двоичное    Десятичное
 | ||
| 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
 | ||
| Результат деления записывается снизу вверх</code></pre>
 | ||
| <h3 id="bit-convertor">Bit Convertor</h3>
 | ||
| <div class="sourceCode" id="cb15"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> ConvertTo-Bit <span class="op">{</span></span>
 | ||
| <span id="cb15-2"><a href="#cb15-2" aria-hidden="true" tabindex="-1"></a>    <span class="kw">param</span> <span class="op">(</span></span>
 | ||
| <span id="cb15-3"><a href="#cb15-3" aria-hidden="true" tabindex="-1"></a>        <span class="op">[</span><span class="dt">Int</span><span class="op">]</span><span class="va">$int</span></span>
 | ||
| <span id="cb15-4"><a href="#cb15-4" aria-hidden="true" tabindex="-1"></a>    <span class="op">)</span></span>
 | ||
| <span id="cb15-5"><a href="#cb15-5" aria-hidden="true" tabindex="-1"></a>    <span class="op">[</span>array<span class="op">]</span><span class="va">$bits</span> <span class="op">=</span> <span class="op">@()</span></span>
 | ||
| <span id="cb15-6"><a href="#cb15-6" aria-hidden="true" tabindex="-1"></a>    <span class="va">$test</span> <span class="op">=</span> <span class="va">$true</span></span>
 | ||
| <span id="cb15-7"><a href="#cb15-7" aria-hidden="true" tabindex="-1"></a>    <span class="cf">while</span> <span class="op">(</span><span class="va">$test</span> <span class="op">-eq</span> <span class="va">$true</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb15-8"><a href="#cb15-8" aria-hidden="true" tabindex="-1"></a>        <span class="cf">if</span> <span class="op">((</span><span class="va">$int</span><span class="op">/</span><span class="dv">2</span><span class="op">).</span><span class="fu">GetType</span><span class="op">()</span> <span class="op">-match</span> <span class="op">[</span><span class="dt">double</span><span class="op">])</span> <span class="op">{</span></span>
 | ||
| <span id="cb15-9"><a href="#cb15-9" aria-hidden="true" tabindex="-1"></a>            <span class="va">$int</span> <span class="op">=</span> <span class="op">(</span><span class="va">$int</span><span class="op">-</span><span class="dv">1</span><span class="op">)/</span><span class="dv">2</span></span>
 | ||
| <span id="cb15-10"><a href="#cb15-10" aria-hidden="true" tabindex="-1"></a>            <span class="op">[</span>array<span class="op">]</span><span class="va">$bits</span> <span class="op">+=</span> <span class="dv">1</span></span>
 | ||
| <span id="cb15-11"><a href="#cb15-11" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb15-12"><a href="#cb15-12" aria-hidden="true" tabindex="-1"></a>        <span class="cf">elseif</span> <span class="op">((</span><span class="va">$int</span><span class="op">/</span><span class="dv">2</span><span class="op">).</span><span class="fu">GetType</span><span class="op">()</span> <span class="op">-match</span> <span class="op">[</span><span class="dt">int</span><span class="op">])</span> <span class="op">{</span></span>
 | ||
| <span id="cb15-13"><a href="#cb15-13" aria-hidden="true" tabindex="-1"></a>            <span class="va">$int</span> <span class="op">=</span> <span class="va">$int</span><span class="op">/</span><span class="dv">2</span></span>
 | ||
| <span id="cb15-14"><a href="#cb15-14" aria-hidden="true" tabindex="-1"></a>            <span class="op">[</span>array<span class="op">]</span><span class="va">$bits</span> <span class="op">+=</span> <span class="dv">0</span></span>
 | ||
| <span id="cb15-15"><a href="#cb15-15" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb15-16"><a href="#cb15-16" aria-hidden="true" tabindex="-1"></a>        <span class="cf">if</span> <span class="op">(</span><span class="va">$int</span> <span class="op">-eq</span> <span class="dv">0</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb15-17"><a href="#cb15-17" aria-hidden="true" tabindex="-1"></a>            <span class="va">$test</span> <span class="op">=</span> <span class="va">$false</span></span>
 | ||
| <span id="cb15-18"><a href="#cb15-18" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb15-19"><a href="#cb15-19" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb15-20"><a href="#cb15-20" aria-hidden="true" tabindex="-1"></a>    <span class="va">$bits</span> <span class="op">=</span>  <span class="va">$bits</span><span class="op">[</span>-1<span class="op">..</span>-999<span class="op">]</span></span>
 | ||
| <span id="cb15-21"><a href="#cb15-21" aria-hidden="true" tabindex="-1"></a>    <span class="op">([</span><span class="dt">string</span><span class="op">](</span><span class="va">$bits</span><span class="op">))</span> <span class="op">-replace</span> <span class="st">"\s"</span></span>
 | ||
| <span id="cb15-22"><a href="#cb15-22" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>ConvertTo-Bit 347</code></p>
 | ||
| <div class="sourceCode" id="cb16"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> ConvertFrom-Bit <span class="op">{</span></span>
 | ||
| <span id="cb16-2"><a href="#cb16-2" aria-hidden="true" tabindex="-1"></a>    <span class="kw">param</span> <span class="op">(</span></span>
 | ||
| <span id="cb16-3"><a href="#cb16-3" aria-hidden="true" tabindex="-1"></a>        <span class="va">$bit</span></span>
 | ||
| <span id="cb16-4"><a href="#cb16-4" aria-hidden="true" tabindex="-1"></a>    <span class="op">)</span></span>
 | ||
| <span id="cb16-5"><a href="#cb16-5" aria-hidden="true" tabindex="-1"></a>    <span class="op">[</span><span class="dt">int</span><span class="op">]</span><span class="va">$int</span> <span class="op">=</span> <span class="dv">0</span></span>
 | ||
| <span id="cb16-6"><a href="#cb16-6" aria-hidden="true" tabindex="-1"></a>    <span class="va">$bits</span> <span class="op">=</span> <span class="va">$bit</span><span class="op">.</span><span class="fu">ToString</span><span class="op">().</span><span class="fu">ToCharArray</span><span class="op">()</span></span>
 | ||
| <span id="cb16-7"><a href="#cb16-7" aria-hidden="true" tabindex="-1"></a>    <span class="va">$index</span> <span class="op">=</span> <span class="op">(</span><span class="va">$bits</span><span class="op">.</span><span class="fu">Count</span><span class="op">)-</span><span class="dv">1</span></span>
 | ||
| <span id="cb16-8"><a href="#cb16-8" aria-hidden="true" tabindex="-1"></a>    <span class="cf">foreach</span> <span class="op">(</span><span class="va">$b</span> <span class="kw">in</span> <span class="va">$bits</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb16-9"><a href="#cb16-9" aria-hidden="true" tabindex="-1"></a>        <span class="cf">if</span> <span class="op">(</span><span class="va">$b</span> <span class="op">-notlike</span> <span class="dv">0</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb16-10"><a href="#cb16-10" aria-hidden="true" tabindex="-1"></a>            <span class="va">$int</span> <span class="op">+=</span> <span class="op">[</span>math<span class="op">]::</span>Pow<span class="op">(</span><span class="dv">2</span><span class="op">,</span><span class="va">$index</span><span class="op">)</span></span>
 | ||
| <span id="cb16-11"><a href="#cb16-11" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb16-12"><a href="#cb16-12" aria-hidden="true" tabindex="-1"></a>    <span class="va">$index</span> <span class="op">-=</span> <span class="dv">1</span></span>
 | ||
| <span id="cb16-13"><a href="#cb16-13" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb16-14"><a href="#cb16-14" aria-hidden="true" tabindex="-1"></a>    <span class="va">$int</span></span>
 | ||
| <span id="cb16-15"><a href="#cb16-15" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>ConvertFrom-Bit 10010011</code></p>
 | ||
| <p><code>Get-Process pwsh | fl ProcessorAffinity</code> привязка
 | ||
| процесса к ядрам, представляет из себя битовую маску (bitmask), где
 | ||
| каждому биту соответствует ядро процессора. Если для ядра отмечено
 | ||
| сходство (affinity), то бит выставляется в 1, если нет — то в 0.
 | ||
| Например, если выбраны все 16 ядер, то это 1111 1111 1111 1111 или
 | ||
| 65535.<br />
 | ||
| <code>(Get-Process pwsh).ProcessorAffinity = 15</code> 0000000000001111
 | ||
| присвоить 4 первых ядра<br />
 | ||
| <code>(Get-Process pwsh).ProcessorAffinity = 61440</code>
 | ||
| 1111000000000000 присвоить 4 последних ядра<br />
 | ||
| <code>(Get-Process pwsh).ProcessorAffinity = (ConvertFrom-Bit 1111000000000000)</code></p>
 | ||
| <h3 id="property">Property</h3>
 | ||
| <p><code>$srv.Count</code> кол-во элементов в массиве<br />
 | ||
| <code>$srv.Length</code> содержит количество символом строки переменной
 | ||
| [string] или количество значений (строк) объекта<br />
 | ||
| <code>$srv.Chars(2)</code> отобразить 3-й символ в строке<br />
 | ||
| <code>$srv[2]</code> отобразить 3-ю строку в массиве</p>
 | ||
| <h3 id="method">Method</h3>
 | ||
| <p><code>$srv.Insert(0,"https://")</code> добавить значение перед первым
 | ||
| символом<br />
 | ||
| <code>$srv.Substring(4)</code> удалить (из всего массива) первые 4
 | ||
| символа<br />
 | ||
| <code>$srv.Remove(3)</code> удалить из всего массива все после 3
 | ||
| символа<br />
 | ||
| <code>$string = "123"</code> создать строку<br />
 | ||
| <code>$int = [convert]::ToInt32($string)</code> преобразовать строку в
 | ||
| тип данных число<br />
 | ||
| <code>[string]::Concat($text,$num)</code> объеденить переменные в одну
 | ||
| строку<br />
 | ||
| <code>[string]::Join(":",$text,$num)</code> объеденить используя
 | ||
| разделитель<br />
 | ||
| <code>[string]::Compare($text,$num,$true)</code> выдает 0 при совпадении
 | ||
| или 1/-1 при несовпадении, $true (без учета регистра) или <span
 | ||
| class="math inline">$false (с учетом регистра) \
 | ||
| `[string]::Equals($</span>text,$num)<code>производит сравнение двух строк и выдает $true при их совпадении или $false при несовпадении \</code>[string]::IsNullOrEmpty($text)<code>проверяет наличие строки, если строка пуста $true, если нет $false \</code>[string]::IsNullOrWhiteSpace($text2)`
 | ||
| проверяет на наличие только символов пробел, табуляция или символ новой
 | ||
| строки</p>
 | ||
| <h3 id="datetime">DateTime</h3>
 | ||
| <p><code>Get-TimeZone</code> часовой пояс<br />
 | ||
| <code>[DateTime]::UtcNow</code> время в формате UTC 0<br />
 | ||
| <code>(Get-Date).AddHours(-3)</code><br />
 | ||
| <code>$Date = (Get-Date -Format "dd/MM/yyyy hh:mm:ss")</code><br />
 | ||
| <code>$Date = Get-Date -f "dd/MM/yyyy"</code> получаем тип данных
 | ||
| [string]<br />
 | ||
| <code>[DateTime]$gDate = Get-Date "$Date"</code> преобразовать в тип <a
 | ||
| href="#datetime">DateTime</a><br />
 | ||
| <code>[int32]$days=($fDate-$gDate).Days</code> получить разницу в
 | ||
| днях<br />
 | ||
| <code>"5/7/07" -as [DateTime]</code> преобразовать входные данные в тип
 | ||
| данных <a href="#datetime">DateTime</a><br />
 | ||
| <code>New-TimeSpan -Start $VBRRP.CreationTimeUTC -End $VBRRP.CompletionTimeUTC</code>
 | ||
| получить разницу во времени</p>
 | ||
| <h3 id="measure-command">Measure-Command</h3>
 | ||
| <p><code>(Measure-Command {ping ya.ru}).TotalSeconds</code> узнать
 | ||
| только время выполнения<br />
 | ||
| <code>(Get-History)[-1] | select @{Name="RunTime"; Expression={$_.EndExecutionTime - $_.StartExecutionTime}},ExecutionStatus,CommandLine</code>
 | ||
| посчитать время работы последней [-1] (select -Last 1) выполненной
 | ||
| команды и узнать ее статус</p>
 | ||
| <h3 id="timer">Timer</h3>
 | ||
| <p><code>$start_time = Get-Date</code> зафиксировать время до выполнения
 | ||
| команды<br />
 | ||
| <code>$end_time = Get-Date</code> зафиксировать время по
 | ||
| завершению<br />
 | ||
| <code>$time = $end_time - $start_time</code> высчитать время работы
 | ||
| скрипта<br />
 | ||
| <code>$min = $time.minutes</code><br />
 | ||
| <code>$sec = $time.seconds</code><br />
 | ||
| <code>Write-Host "$min минут $sec секунд"</code><br />
 | ||
| <code>$timer = [System.Diagnostics.Stopwatch]::StartNew()</code>
 | ||
| запустить таймер<br />
 | ||
| <code>$timer.IsRunning</code> статус работы таймера<br />
 | ||
| <code>$timer.Elapsed.TotalSeconds</code> отобразить время с момента
 | ||
| запуска (в секундах)<br />
 | ||
| <code>$timer.Stop()</code> остановить таймер</p>
 | ||
| <h3 id="foreach">Foreach</h3>
 | ||
| <p><code>$list = 100..110</code> создать массив из цифр от 100 до
 | ||
| 110<br />
 | ||
| <code>foreach ($srv in $list) {ping 192.168.3.$srv -n 1 -w 50}</code>
 | ||
| $srv хранит текущий элемент из <span class="math inline">$list и
 | ||
| повторяет команду до последнего элемента в массиве \
 | ||
| `$</span>foreach.Current<code>текущий элемент в цикле \</code><span
 | ||
| class="math inline">$foreach.Reset()` обнуляет итерацию, перебор
 | ||
| начнется заново, что приводит к бесконечному циклу \
 | ||
| `$</span>foreach.MoveNext()` переход к следующему элементу в цикле</p>
 | ||
| <h3 id="foreach-object">ForEach-Object (%)</h3>
 | ||
| <p><code>100..110 | %{ping -n 1 -w 50 192.168.3.$_ > $null</code><br />
 | ||
| <code>if ($LastExitCode -eq 0) {Write-Host "192.168.3.$_" -ForegroundColor green</code><br />
 | ||
| <code>} else {</code><br />
 | ||
| <code>Write-Host "192.168.3.$_"-ForegroundColor Red}}</code><br />
 | ||
| <code>%</code> передать цикл через конвеер (ForEach-Object)<br />
 | ||
| <code>$_</code> переменная цикла и конвеера (<span
 | ||
| class="math inline">$PSItem) \
 | ||
| `gwmi Win32_QuickFixEngineering | where
 | ||
| {$</span><em>.InstalledOn.ToString() -match “2022”} |
 | ||
| %{($</em>.HotFixID.Substring(2))}` gwmi создает массив, вывод команды
 | ||
| передается where для поиска подходящих под критерии объектов. По
 | ||
| конвееру передается в цикл для удаления первых (2) символов методом
 | ||
| Substring из всех объектов HotFixID.</p>
 | ||
| <h3 id="while">While</h3>
 | ||
| <p><code>$srv = "yandex.ru"</code><br />
 | ||
| <code>$out2 = "Есть пинг"</code><br />
 | ||
| <code>$out3 = "Нет пинга"</code><br />
 | ||
| <code>$out = $false`` предварительно сбросить переменную, While проверяет условие до запуска цикла \</code>While
 | ||
| ($out -eq
 | ||
| $false){`<code>пока условие является $true, цикл будет повторяться \</code>$out
 | ||
| = ping -n 1 -w 50 <span class="math inline">$srv` \
 | ||
| `if ($</span>out -match “ttl”) {$out = $true; <span
 | ||
| class="math inline">$out2} else {$</span>out = $false; $out3; sleep
 | ||
| 1}<code>\</code>}`</p>
 | ||
| <p><code>while ($True){`` запустить бесконечный цикл \</code><span
 | ||
| class="math inline">$result = ping yandex.ru -n 1 -w 50` \
 | ||
| `if ($</span>result -match
 | ||
| “TTL”){<code>условие, при котором будет выполнен break \ `Write-Host "Сайт доступен"` \ `break</code>
 | ||
| остановит цикл<br />
 | ||
| <code>} else {Write-Host "Сайт недоступен"; sleep 1}</code><br />
 | ||
| <code>}</code></p>
 | ||
| <h3 id="try-catch-finally">Try-Catch-Finally</h3>
 | ||
| <div class="sourceCode" id="cb17"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true" tabindex="-1"></a><span class="cf">Try</span> <span class="op">{</span><span class="va">$out</span> <span class="op">=</span> pping <span class="dv">192.168</span><span class="op">.</span><span class="dv">3.1</span><span class="op">}</span></span>
 | ||
| <span id="cb17-2"><a href="#cb17-2" aria-hidden="true" tabindex="-1"></a><span class="cf">Catch</span> <span class="op">{</span><span class="fu">Write-Warning</span> <span class="st">"</span><span class="op">$(</span><span class="va">$error</span><span class="op">[</span><span class="dv">0</span><span class="op">])</span><span class="st">"</span><span class="op">}</span> <span class="co"># выводит в случае ошибки (вместо ошибки)</span></span>
 | ||
| <span id="cb17-3"><a href="#cb17-3" aria-hidden="true" tabindex="-1"></a><span class="cf">finally</span> <span class="op">{</span><span class="va">$out</span> <span class="op">=</span> <span class="st">"End"</span><span class="op">}</span> <span class="co"># выполняется в конце в любом случае</span></span></code></pre></div>
 | ||
| <h3 id="error">Error</h3>
 | ||
| <p><code>$Error</code> выводит все ошибки текущего сеанса<br />
 | ||
| <code>$Error[0].InvocationInfo</code> развернутый отчет об ошибке<br />
 | ||
| <code>$Error.clear()</code><br />
 | ||
| <code>$LASTEXITCODE</code> результат выполнения последней команды (0 -
 | ||
| успех)<br />
 | ||
| <code>exit 1</code> код завершения, который возвращается
 | ||
| $LASTEXITCODE</p>
 | ||
| <h1 id="files">Files</h1>
 | ||
| <p><code>$file = [System.IO.File]::Create("$home\desktop\test.txt")</code>
 | ||
| создать файл<br />
 | ||
| <code>$file.Close()</code> закрыть файл<br />
 | ||
| <code>[System.IO.File]::ReadAllLines("$home\desktop\test.txt")</code>
 | ||
| прочитать файл<br />
 | ||
| <code>$file = New-Object System.IO.StreamReader("$home\desktop\test.txt")</code>
 | ||
| файл будет занят процессом PowerShell<br />
 | ||
| <code>$file | gm</code><br />
 | ||
| <code>$file.ReadLine()</code> построчный вывод<br />
 | ||
| <code>$file.ReadToEnd()</code> прочитать файл целиком</p>
 | ||
| <h3 id="readwrite-bytes">Read/Write Bytes</h3>
 | ||
| <p><code>$file = [io.file]::ReadAllBytes("$home\desktop\powershell.jpg")</code>
 | ||
| метод открывает двоичный файл, считывает его в массив байт и закрывает
 | ||
| файл<br />
 | ||
| <code>[io.file]::WriteAllBytes("$home\desktop\tloztotk-2.jpg",$file)</code>
 | ||
| сохранить байты в файл (можно использовать для выгрузки двоичных файлов
 | ||
| из БД)</p>
 | ||
| <p><code>Get-Content $home/desktop\test.txt -Wait</code> аналог
 | ||
| tail<br />
 | ||
| <code>Test-Path $path</code> проверить доступность пути<br />
 | ||
| <code>Get-ChildItem $path -Filter *.txt -Recurse</code> отобразить
 | ||
| содержимое каталога (Alias: ls/gci/dir) и дочерних каталогов (-Recurse)
 | ||
| и отфильтровать вывод<br />
 | ||
| <code>Get-Location</code> отобразить текущие месторасположение (Alias:
 | ||
| pwd/gl)<br />
 | ||
| <code>Set-Location $path</code> перемещение по каталогам (Alias:
 | ||
| cd/sl)<br />
 | ||
| <code>Invoke-Item $path</code> открыть файл (Alias: ii/start)<br />
 | ||
| <code>Get-ItemProperty $env:userprofile\Documents\dns-list.txt | select FullName,Directory,Name,BaseName,Extension</code>
 | ||
| свойтсва файла<br />
 | ||
| <code>Get-ItemProperty -Path $path\* | select FullName,CreationTime,LastWriteTime</code>
 | ||
| свойства файлов содержимого директории, дата их создания и последнего
 | ||
| изменения<br />
 | ||
| <code>New-Item -Path "C:\test\" -ItemType "Directory"</code> создать
 | ||
| директорию (Alias: mkdir/md)<br />
 | ||
| <code>New-Item -Path "C:\test\file.txt" -ItemType "File" -Value "Добавить текст в файл"</code>
 | ||
| создать файл<br />
 | ||
| <code>"test" > "C:\test\file.txt"</code> заменить содержимое<br />
 | ||
| <code>"test" >> "C:\test\file.txt"</code> добавить строку в
 | ||
| файл<br />
 | ||
| <code>New-Item -Path "C:\test\test\file.txt" -Force</code> ключ
 | ||
| используется для создания отсутствующих в пути директорий или перезаписи
 | ||
| файла если он уже существует<br />
 | ||
| <code>Move-Item</code> перемещение объектов (Alias: mv/move)<br />
 | ||
| <code>Remove-Item "$path\" -Recurse</code> удаление всех файлов внутри
 | ||
| каталога, без запроса подверждения (Alias: rm/del)<br />
 | ||
| <code>Remove-Item $path -Recurse -Include "*.txt","*.temp" -Exclude "log.txt"</code>
 | ||
| удалить все файлы с расширением txt и temp (<a href="#array">Array</a>),
 | ||
| кроме log.txt<br />
 | ||
| <code>Rename-Item "C:\test\*.*" "*.jpg"</code> переименовать файлы по
 | ||
| маске (Alias: ren)<br />
 | ||
| <code>Copy-Item</code> копирование файлов и каталогов (Alias:
 | ||
| cp/copy)<br />
 | ||
| <code>Copy-Item -Path "\\server-01\test" -Destination "C:\" -Recurse</code>
 | ||
| копировать директорию с ее содержимым (-Recurse)<br />
 | ||
| <code>Copy-Item -Path "C:\*.txt" -Destination "C:\test\"</code> знак ’'
 | ||
| в конце Destination используется для переноса папки внутрь указанной,
 | ||
| отсутствие, что это новое имя директории<br />
 | ||
| <code>Copy-Item -Path "C:\*" -Destination "C:\test\" -Include '*.txt','*.jpg'</code>
 | ||
| копировать объекты с указанным расширением (Include)<br />
 | ||
| <code>Copy-Item -Path "C:\*" -Destination "C:\test\" -Exclude '*.jpeg'</code>
 | ||
| копировать объекты, за исключением файлов с расширением (Exclude)<br />
 | ||
| <code>$log = Copy-Item "C:\*.txt" "C:\test\" -PassThru</code> вывести
 | ||
| результат копирования (логирование) в переменную, можно забирать строки
 | ||
| с помощью индексов $log[0].FullName</p>
 | ||
| <h3 id="clear-env-temp-14-days">Clear-env-Temp-14-days</h3>
 | ||
| <div class="sourceCode" id="cb18"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true" tabindex="-1"></a><span class="va">$ls</span> <span class="op">=</span> <span class="fu">Get-Item</span> <span class="va">$env</span><span class="op">:</span><span class="va">TEMP</span>\<span class="op">*.</span><span class="fu">tmp</span> <span class="co"># считать все файлы с указанным расширением</span></span>
 | ||
| <span id="cb18-2"><a href="#cb18-2" aria-hidden="true" tabindex="-1"></a><span class="va">$date</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Date</span><span class="op">).</span><span class="fu">AddDays</span><span class="op">(-</span><span class="dv">14</span><span class="op">)</span></span>
 | ||
| <span id="cb18-3"><a href="#cb18-3" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$l</span> <span class="kw">in</span> <span class="va">$ls</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb18-4"><a href="#cb18-4" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span><span class="va">$l</span><span class="op">.</span><span class="fu">LastWriteTime</span> <span class="op">-le</span> <span class="va">$date</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb18-5"><a href="#cb18-5" aria-hidden="true" tabindex="-1"></a>        <span class="va">$l</span><span class="op">.</span><span class="fu">FullName</span></span>
 | ||
| <span id="cb18-6"><a href="#cb18-6" aria-hidden="true" tabindex="-1"></a>        <span class="fu">Remove-Item</span> <span class="va">$l</span><span class="op">.</span><span class="fu">FullName</span> <span class="op">-</span>Recurse</span>
 | ||
| <span id="cb18-7"><a href="#cb18-7" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb18-8"><a href="#cb18-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <h3 id="filehash">Filehash</h3>
 | ||
| <p><code>Get-Filehash -Algorithm SHA256 "$env:USERPROFILE\Documents\RSA.conf.txt"</code></p>
 | ||
| <h3 id="microsoft.powershell.archive">Microsoft.PowerShell.Archive</h3>
 | ||
| <p><code>Compress-Archive -Path $sourcepath -DestinationPath $dstpath -CompressionLevel Optimal</code>
 | ||
| архивировать<br />
 | ||
| <code>Expand-Archive .\powerlinefonts.zip</code> разархивировать</p>
 | ||
| <h1 id="credential">Credential</h1>
 | ||
| <p><code>$Cred = Get-Credential</code> сохраняет креды в переменные
 | ||
| $Cred.Username и <span class="math inline">$Cred.Password \
 | ||
| `$</span>Cred.GetNetworkCredential().password<code>извлечь пароль \</code>cmdkey
 | ||
| /generic:“TERMSRV/<span class="math inline">$srv"
 | ||
| /user:"$</span>username” /pass:“<span class="math inline">$password"`
 | ||
| добавить указанные креды аудентификации на на терминальный сервер для
 | ||
| подключения без пароля \
 | ||
| `mstsc /admin /v:$</span>srv<code>авторизоваться \</code>cmdkey
 | ||
| /delete:”TERMSRV/<span class="math inline">$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` удалить учетную запись \
 | ||
| `$</span>Cred = Get-StoredCredential | where {<span
 | ||
| class="math inline">$_.username -match "admin"}` \
 | ||
| `$</span>pass = <span class="math inline">$cred.password` \
 | ||
| `$</span>BSTR =
 | ||
| [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR(<span
 | ||
| class="math inline">$pass)` \
 | ||
| `[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($</span>BSTR)`</p>
 | ||
| <h3 id="out-gridview">Out-Gridview</h3>
 | ||
| <p><code>Get-Service -cn $srv | Out-GridView -Title "Service $srv" -OutputMode Single –PassThru | Restart-Service</code>
 | ||
| перезапустить выбранную службу</p>
 | ||
| <h3 id="out-file">Out-File</h3>
 | ||
| <p><code>Read-Host –AsSecureString | ConvertFrom-SecureString | Out-File "$env:userprofile\desktop\password.txt"</code>
 | ||
| писать в файл. Преобразовать пароль в формат SecureString с
 | ||
| использованием шифрования Windows Data Protection API (DPAPI)</p>
 | ||
| <h3 id="get-content-gccattype">Get-Content (gc/cat/type)</h3>
 | ||
| <p><code>$password = gc "$env:userprofile\desktop\password.txt" | ConvertTo-SecureString</code>
 | ||
| читать хэш пароля из файла с помощью ключей, хранящихся в профиле
 | ||
| текущего пользователя, который невозможно прочитать на другом
 | ||
| копьютере</p>
 | ||
| <h3 id="aes-key">AES Key</h3>
 | ||
| <p><code>$AESKey = New-Object Byte[] 32</code><br />
 | ||
| <code>[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($AESKey)</code><br />
 | ||
| <code>$AESKey | Out-File "C:\password.key"</code><br />
 | ||
| <code>$Cred.Password | ConvertFrom-SecureString -Key (Get-Content "C:\password.key") | Set-Content "C:\password.txt"</code>
 | ||
| сохранить пароль в файл используя внешний ключ<br />
 | ||
| <code>$pass = Get-Content "C:\password.txt" | ConvertTo-SecureString -Key (Get-Content "\\Server\Share\password.key")</code>
 | ||
| расшифровать пароль на втором компьютере</p>
 | ||
| <h1 id="winevent">WinEvent</h1>
 | ||
| <p><code>Get-WinEvent -ListLog *</code> отобразить все доступные журналы
 | ||
| логов<br />
 | ||
| <code>Get-WinEvent -ListLog * | where RecordCount -ne 0 | where RecordCount -ne $null | sort -Descending RecordCount</code>
 | ||
| отобразить не пустые журналы с сортировкой по кол-ву записей<br />
 | ||
| <code>Get-WinEvent -ListProvider * | ft</code> отобразить всех
 | ||
| провайдеров приложений<br />
 | ||
| <code>Get-WinEvent -ListProvider GroupPolicy</code> найти в какой журнал
 | ||
| LogLinks {Application} пишутся логи приложения<br />
 | ||
| <code>Get-WinEvent -ListProvider *smb*</code><br />
 | ||
| <code>Get-WinEvent -ListLog * | where logname -match SMB | sort -Descending RecordCount</code>
 | ||
| найти все журналы по имени<br />
 | ||
| <code>Get-WinEvent -LogName "Microsoft-Windows-SmbClient/Connectivity"</code><br />
 | ||
| <code>Get-WinEvent -ListProvider *firewall*</code></p>
 | ||
| <h3 id="filter-xpathhashtable">Filter XPath/Hashtable</h3>
 | ||
| <p><code>Get-WinEvent -FilterHashtable @{LogName="Security";ID=4624}</code>
 | ||
| найти логи по ID в журнале Security<br />
 | ||
| <code>Get-WinEvent -FilterHashtable @{LogName="System";Level=2}</code>
 | ||
| найти все записи ошибки (1 - критический, 3 - предупреждение, 4 -
 | ||
| сведения)<br />
 | ||
| <code>Get-WinEvent -FilterHashtable @{LogName="System";Level=2;ProviderName="Service Control Manager"}</code>
 | ||
| отфильтровать по имени провайдера</p>
 | ||
| <p><code>([xml](Get-WinEvent -FilterHashtable @{LogName="Security";ID=4688} -MaxEvents 1).ToXml()).Event.EventData.Data</code>
 | ||
| отобразить все свойства, хранимые в EventData (Message)<br />
 | ||
| <code>Get-WinEvent -FilterHashtable @{logname="security";ID=4688} -MaxEvents 1 | select timecreated,{$_.Properties[5].value}</code>
 | ||
| отфильтровать время события и имя запущенного процесса</p>
 | ||
| <pre><code>$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</code></pre>
 | ||
| <h3 id="reboot">Reboot</h3>
 | ||
| <pre><code>$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) в секундах.</code></pre>
 | ||
| <h3 id="logon">Logon</h3>
 | ||
| <div class="sourceCode" id="cb21"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb21-1"><a href="#cb21-1" aria-hidden="true" tabindex="-1"></a><span class="va">$srv</span> <span class="op">=</span> <span class="st">"localhost"</span></span>
 | ||
| <span id="cb21-2"><a href="#cb21-2" aria-hidden="true" tabindex="-1"></a><span class="va">$FilterXPath</span> <span class="op">=</span> <span class="st">'<QueryList><Query Id="0"><Select>*[System[EventID=21]]</Select></Query></QueryList>'</span></span>
 | ||
| <span id="cb21-3"><a href="#cb21-3" aria-hidden="true" tabindex="-1"></a><span class="va">$RDPAuths</span> <span class="op">=</span> <span class="fu">Get-WinEvent</span> <span class="op">-</span>ComputerName <span class="va">$srv</span> <span class="op">-</span>LogName <span class="st">"Microsoft-Windows-TerminalServices-LocalSessionManager/Operational"</span> <span class="op">-</span>FilterXPath <span class="va">$FilterXPath</span></span>
 | ||
| <span id="cb21-4"><a href="#cb21-4" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>xml<span class="op">[]]</span><span class="va">$xml</span> <span class="op">=</span> <span class="va">$RDPAuths</span> <span class="op">|</span> <span class="cf">Foreach</span> <span class="op">{</span><span class="va">$_</span><span class="op">.</span><span class="fu">ToXml</span><span class="op">()}</span></span>
 | ||
| <span id="cb21-5"><a href="#cb21-5" aria-hidden="true" tabindex="-1"></a><span class="va">$EventData</span> <span class="op">=</span> <span class="cf">Foreach</span> <span class="op">(</span><span class="va">$event</span> <span class="kw">in</span> <span class="va">$xml</span><span class="op">.</span><span class="fu">Event</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb21-6"><a href="#cb21-6" aria-hidden="true" tabindex="-1"></a><span class="fu">New-Object</span> PSObject <span class="op">-</span>Property @<span class="op">{</span></span>
 | ||
| <span id="cb21-7"><a href="#cb21-7" aria-hidden="true" tabindex="-1"></a><span class="st">"Connection Time"</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Date</span> <span class="op">(</span><span class="va">$event</span><span class="op">.</span><span class="fu">System</span><span class="op">.</span><span class="fu">TimeCreated</span><span class="op">.</span><span class="fu">SystemTime</span><span class="op">)</span> <span class="op">-</span>Format <span class="st">'yyyy-MM-dd hh:mm K'</span><span class="op">)</span></span>
 | ||
| <span id="cb21-8"><a href="#cb21-8" aria-hidden="true" tabindex="-1"></a><span class="st">"User Name"</span> <span class="op">=</span> <span class="va">$event</span><span class="op">.</span><span class="fu">UserData</span><span class="op">.</span><span class="fu">EventXML</span><span class="op">.</span><span class="fu">User</span></span>
 | ||
| <span id="cb21-9"><a href="#cb21-9" aria-hidden="true" tabindex="-1"></a><span class="st">"User ID"</span> <span class="op">=</span> <span class="va">$event</span><span class="op">.</span><span class="fu">UserData</span><span class="op">.</span><span class="fu">EventXML</span><span class="op">.</span><span class="fu">SessionID</span></span>
 | ||
| <span id="cb21-10"><a href="#cb21-10" aria-hidden="true" tabindex="-1"></a><span class="st">"User Address"</span> <span class="op">=</span> <span class="va">$event</span><span class="op">.</span><span class="fu">UserData</span><span class="op">.</span><span class="fu">EventXML</span><span class="op">.</span><span class="fu">Address</span></span>
 | ||
| <span id="cb21-11"><a href="#cb21-11" aria-hidden="true" tabindex="-1"></a><span class="st">"Event ID"</span> <span class="op">=</span> <span class="va">$event</span><span class="op">.</span><span class="fu">System</span><span class="op">.</span><span class="fu">EventID</span></span>
 | ||
| <span id="cb21-12"><a href="#cb21-12" aria-hidden="true" tabindex="-1"></a><span class="op">}}</span></span>
 | ||
| <span id="cb21-13"><a href="#cb21-13" aria-hidden="true" tabindex="-1"></a><span class="va">$EventData</span> <span class="op">|</span> <span class="fu">ft</span></span></code></pre></div>
 | ||
| <h3 id="eventlog">EventLog</h3>
 | ||
| <p><code>Get-EventLog -List</code> отобразить все корневые журналы логов
 | ||
| и их размер<br />
 | ||
| <code>Clear-EventLog Application</code> очистить логи указанного
 | ||
| журнала<br />
 | ||
| <code>Get-EventLog -LogName Security -InstanceId 4624</code> найти логи
 | ||
| по ID в журнале Security</p>
 | ||
| <h1 id="firewall">Firewall</h1>
 | ||
| <div class="sourceCode" id="cb22"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb22-1"><a href="#cb22-1" aria-hidden="true" tabindex="-1"></a><span class="va">$days</span> <span class="op">=</span> <span class="dv">5</span></span>
 | ||
| <span id="cb22-2"><a href="#cb22-2" aria-hidden="true" tabindex="-1"></a><span class="va">$obj</span> <span class="op">=</span> <span class="op">@()</span></span>
 | ||
| <span id="cb22-3"><a href="#cb22-3" aria-hidden="true" tabindex="-1"></a><span class="va">$fw</span> <span class="op">=</span> <span class="fu">Get-WinEvent</span> <span class="st">"Microsoft-Windows-Windows Firewall With Advanced Security/Firewall"</span></span>
 | ||
| <span id="cb22-4"><a href="#cb22-4" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$temp_fw</span> <span class="kw">in</span> <span class="va">$fw</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb22-5"><a href="#cb22-5" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$temp_fw</span><span class="op">.</span><span class="fu">id</span> <span class="op">-eq</span> <span class="dv">2097</span><span class="op">)</span> <span class="op">{</span> <span class="co"># 2004</span></span>
 | ||
| <span id="cb22-6"><a href="#cb22-6" aria-hidden="true" tabindex="-1"></a>    <span class="va">$type</span> <span class="op">=</span> <span class="st">"Added Rule"</span></span>
 | ||
| <span id="cb22-7"><a href="#cb22-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb22-8"><a href="#cb22-8" aria-hidden="true" tabindex="-1"></a><span class="cf">elseif</span> <span class="op">(</span><span class="va">$temp_fw</span><span class="op">.</span><span class="fu">id</span> <span class="op">-eq</span> <span class="dv">2006</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb22-9"><a href="#cb22-9" aria-hidden="true" tabindex="-1"></a>    <span class="va">$type</span> <span class="op">=</span> <span class="st">"Deleted Rule"</span></span>
 | ||
| <span id="cb22-10"><a href="#cb22-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb22-11"><a href="#cb22-11" aria-hidden="true" tabindex="-1"></a><span class="va">$port</span> <span class="op">=</span> <span class="va">$temp_fw</span><span class="op">.</span><span class="fu">Properties</span><span class="op">[</span><span class="dv">7</span><span class="op">]</span> <span class="op">|</span> <span class="fu">select</span> <span class="op">-</span>ExpandProperty value</span>
 | ||
| <span id="cb22-12"><a href="#cb22-12" aria-hidden="true" tabindex="-1"></a><span class="va">$name</span> <span class="op">=</span> <span class="va">$temp_fw</span><span class="op">.</span><span class="fu">Properties</span><span class="op">[</span><span class="dv">1</span><span class="op">]</span> <span class="op">|</span> <span class="fu">select</span> <span class="op">-</span>ExpandProperty value</span>
 | ||
| <span id="cb22-13"><a href="#cb22-13" aria-hidden="true" tabindex="-1"></a><span class="va">$obj</span> <span class="op">+=</span> <span class="op">[</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span></span>
 | ||
| <span id="cb22-14"><a href="#cb22-14" aria-hidden="true" tabindex="-1"></a>    Time <span class="op">=</span> <span class="va">$temp_fw</span><span class="op">.</span><span class="fu">TimeCreated</span><span class="op">;</span></span>
 | ||
| <span id="cb22-15"><a href="#cb22-15" aria-hidden="true" tabindex="-1"></a>    <span class="fu">Type</span> <span class="op">=</span> <span class="va">$type</span><span class="op">;</span></span>
 | ||
| <span id="cb22-16"><a href="#cb22-16" aria-hidden="true" tabindex="-1"></a>    Port <span class="op">=</span> <span class="va">$port</span><span class="op">;</span></span>
 | ||
| <span id="cb22-17"><a href="#cb22-17" aria-hidden="true" tabindex="-1"></a>    Name <span class="op">=</span> <span class="va">$name</span><span class="op">}</span></span>
 | ||
| <span id="cb22-18"><a href="#cb22-18" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb22-19"><a href="#cb22-19" aria-hidden="true" tabindex="-1"></a><span class="va">$obj</span> <span class="op">|</span> <span class="fu">Where-Object</span> time <span class="op">-gt</span> <span class="op">(</span><span class="fu">Get-Date</span><span class="op">).</span><span class="fu">AddDays</span><span class="op">(-</span><span class="va">$days</span><span class="op">)</span></span></code></pre></div>
 | ||
| <p><code>New-NetFirewallRule -Profile Any -DisplayName "Open Port 135 RPC" -Direction Inbound -Protocol TCP -LocalPort 135</code>
 | ||
| открыть in-порт<br />
 | ||
| <code>Get-NetFirewallRule | where DisplayName -match kms | select *</code>
 | ||
| найти правило по имени<br />
 | ||
| <code>Get-NetFirewallPortFilter | where LocalPort -like 80</code> найти
 | ||
| действующие правило по номеру порта</p>
 | ||
| <div class="sourceCode" id="cb23"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb23-1"><a href="#cb23-1" aria-hidden="true" tabindex="-1"></a>Get-NetFirewallRule <span class="op">-</span>Enabled True <span class="op">-</span>Direction Inbound <span class="op">|</span> <span class="fu">select</span> <span class="op">-</span>Property DisplayName<span class="op">,</span></span>
 | ||
| <span id="cb23-2"><a href="#cb23-2" aria-hidden="true" tabindex="-1"></a>@<span class="op">{</span>Name<span class="op">=</span><span class="st">'Protocol'</span><span class="op">;</span>Expression<span class="op">={(</span><span class="va">$_</span> <span class="op">|</span> Get-NetFirewallPortFilter<span class="op">).</span><span class="fu">Protocol</span><span class="op">}},</span></span>
 | ||
| <span id="cb23-3"><a href="#cb23-3" aria-hidden="true" tabindex="-1"></a>@<span class="op">{</span>Name<span class="op">=</span><span class="st">'LocalPort'</span><span class="op">;</span>Expression<span class="op">={(</span><span class="va">$_</span> <span class="op">|</span> Get-NetFirewallPortFilter<span class="op">).</span><span class="fu">LocalPort</span><span class="op">}},</span></span>
 | ||
| <span id="cb23-4"><a href="#cb23-4" aria-hidden="true" tabindex="-1"></a>@<span class="op">{</span>Name<span class="op">=</span><span class="st">'RemotePort'</span><span class="op">;</span>Expression<span class="op">={(</span><span class="va">$_</span> <span class="op">|</span> Get-NetFirewallPortFilter<span class="op">).</span><span class="fu">RemotePort</span><span class="op">}},</span></span>
 | ||
| <span id="cb23-5"><a href="#cb23-5" aria-hidden="true" tabindex="-1"></a>@<span class="op">{</span>Name<span class="op">=</span><span class="st">'RemoteAddress'</span><span class="op">;</span>Expression<span class="op">={(</span><span class="va">$_</span> <span class="op">|</span> Get-NetFirewallAddressFilter<span class="op">).</span><span class="fu">RemoteAddress</span><span class="op">}},</span></span>
 | ||
| <span id="cb23-6"><a href="#cb23-6" aria-hidden="true" tabindex="-1"></a>Enabled<span class="op">,</span>Profile</span></code></pre></div>
 | ||
| <h3 id="firewall-manager">Firewall-Manager</h3>
 | ||
| <p><code>Install-Module Firewall-Manager</code><br />
 | ||
| <code>Export-FirewallRules -Name * -CSVFile $home\documents\fw.csv</code>
 | ||
| -Inbound -Outbound -Enabled -Disabled -Allow -Block (фильтр правил для
 | ||
| экспорта)<br />
 | ||
| <code>Import-FirewallRules -CSVFile $home\documents\fw.csv</code></p>
 | ||
| <h1 id="defender">Defender</h1>
 | ||
| <p><code>Import-Module Defender</code><br />
 | ||
| <code>Get-Command -Module Defender</code><br />
 | ||
| <code>Get-MpComputerStatus</code><br />
 | ||
| <code>(Get-MpComputerStatus).AntivirusEnabled</code> статус работы
 | ||
| антивируса</p>
 | ||
| <p><code>$session = NewCimSession -ComputerName hostname</code>
 | ||
| подключиться к удаленному компьютеру, используется WinRM<br />
 | ||
| <code>Get-MpComputerStatus -CimSession $session | fl fullscan*</code>
 | ||
| узнать дату последнего сканирования на удаленном компьютере</p>
 | ||
| <p><code>Get-MpPreference</code> настройки<br />
 | ||
| <code>(Get-MpPreference).ScanPurgeItemsAfterDelay</code> время хранения
 | ||
| записей журнала защитника в днях<br />
 | ||
| <code>Set-MpPreference -ScanPurgeItemsAfterDelay 30</code> изменить
 | ||
| время хранения<br />
 | ||
| <code>ls "C:\ProgramData\Microsoft\Windows Defender\Scans\History"</code><br />
 | ||
| <code>Get-MpPreference | select disable*</code> отобразить статус всех
 | ||
| видов проверок/сканирований<br />
 | ||
| <code>Set-MpPreference -DisableRealtimeMonitoring $true</code> отключить
 | ||
| защиту Defender в реальном времени (использовать только ручное
 | ||
| сканирование)<br />
 | ||
| <code>Set-MpPreference -DisableRemovableDriveScanning $false</code>
 | ||
| включить сканирование USB накопителей<br />
 | ||
| <code>Get-MpPreference | select excl*</code> отобразить список всех
 | ||
| исключений<br />
 | ||
| <code>(Get-MpPreference).ExclusionPath</code><br />
 | ||
| <code>Add-MpPreference -ExclusionPath C:\install</code> добавить
 | ||
| директорию в исключение<br />
 | ||
| <code>Remove-MpPreference -ExclusionPath C:\install</code> удалить из
 | ||
| исключения<br />
 | ||
| <code>New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name DisableAntiSpyware -Value 1 -PropertyType DWORD -Force</code>
 | ||
| полностью отключить Windows Defender</p>
 | ||
| <p><code>Set-MpPreference -SignatureDefinitionUpdateFileSharesSources \\FileShare1\Updates</code>
 | ||
| для обновления из сетевой папки нужно предварительно скачать файлы с
 | ||
| сигнатурами баз с сайта
 | ||
| https://www.microsoft.com/security/portal/definitions/adl.aspx и
 | ||
| поместить в сетевой каталог
 | ||
| <code>Update-MpSignature -UpdateSource FileShares</code> изменить
 | ||
| источник обновлений (MicrosoftUpdateServer – сервера обновлений MS в
 | ||
| интернете, InternalDefinitionUpdateServer — внутренний WSUS
 | ||
| сервер)<br />
 | ||
| <code>Update-MpSignature</code> обновить сигнатуры</p>
 | ||
| <p><code>Start-MpScan -ScanType QuickScan</code> быстрая проверка или
 | ||
| FullScan<br />
 | ||
| <code>Start-MpScan -ScanType FullScan -AsJob</code><br />
 | ||
| <code>Set-MpPreference -RemediationScheduleDay 1-7</code> выбрать дни,
 | ||
| начиная с воскресенья или 0 каждый день, 8 - сбросить<br />
 | ||
| <code>Set-MpPreference -ScanScheduleQuickScanTime 14:00:00</code><br />
 | ||
| <code>Start-MpScan -ScanType CustomScan -ScanPath "C:\Program Files"</code>
 | ||
| сканировать выбранную директорию</p>
 | ||
| <p><code>Get-MpThreat</code> история угроз и тип угрозы (ThreatName:
 | ||
| HackTool/Trojan)<br />
 | ||
| <code>Get-MpThreatCatalog</code> список известных видов угроз<br />
 | ||
| <code>Get-MpThreatDetection</code> история защиты (активных и прошлые) и
 | ||
| ID угрозы<br />
 | ||
| <code>Get-MpThreat -ThreatID 2147760253</code></p>
 | ||
| <p><code>ls "C:\ProgramData\Microsoft\Windows Defender\Quarantine\"</code>
 | ||
| директория хранения файлов в карантине<br />
 | ||
| <code>cd "C:\Program Files\Windows Defender\"</code><br />
 | ||
| <code>.\MpCmdRun.exe -restore -name $ThreatName</code> восстановить файл
 | ||
| из карантина<br />
 | ||
| <code>.\MpCmdRun.exe -restore -filepath $path_file</code></p>
 | ||
| <h1 id="windowsupdate">WindowsUpdate</h1>
 | ||
| <p><code>Get-Hotfix | Sort-Object -Descending  InstalledOn</code> список
 | ||
| установленных обновлений (информация из cimv2)<br />
 | ||
| <code>Get-Hotfix -Description "Security update"</code><br />
 | ||
| <code>Get-CimInstance Win32_QuickFixEngineering</code><br />
 | ||
| <code>Get-Command -Module WindowsUpdate</code><br />
 | ||
| <code>Get-WindowsUpdateLog</code><br />
 | ||
| <code>Get-Service uhssvc</code> служба Microsoft Health Update Tools,
 | ||
| которая отвечает за предоставление обновлений</p>
 | ||
| <p><code>Install-Module -Name PSWindowsUpdate -Scope CurrentUser</code><br />
 | ||
| <code>Import-Module PSWindowsUpdate</code><br />
 | ||
| <code>Get-Command -Module PSWindowsUpdate</code><br />
 | ||
| <code>Get-WindowsUpdate</code> список обновлений для скачать и
 | ||
| установить с сервера WSUS или Microsoft Update<br />
 | ||
| <code>Get-WindowsUpdate -Download</code> загрузить все обновления<br />
 | ||
| <code>Get-WindowsUpdate –Install</code> установить все обновления<br />
 | ||
| <code>Install-WindowsUpdate -MicrosoftUpdate -AcceptAll -IgnoreReboot</code>
 | ||
| установить все обновления без перезагрузки<br />
 | ||
| <code>Get-WindowsUpdate -KBArticleID KB2267602, KB4533002 -Install</code><br />
 | ||
| <code>Get-WindowsUpdate -KBArticleID KB2538243 -Hide</code> скрыть
 | ||
| обновления, что бы они никогда не устанавливались<br />
 | ||
| <code>Get-WindowsUpdate –IsHidden</code> отобразить скрытые обновления
 | ||
| (Hide-WindowsUpdate)<br />
 | ||
| <code>Remove-WindowsUpdate -KBArticleID KB4011634 -NoRestart</code>
 | ||
| удалить обновление<br />
 | ||
| <code>Uninstall-WindowsUpdate</code> удалить обновление<br />
 | ||
| <code>Add-WUServiceManager</code> регистрация сервера обновления
 | ||
| (Windows Update Service Manager)<br />
 | ||
| <code>Enable-WURemoting</code> включить правила Windows Defender,
 | ||
| разрешающие удаленное использование командлета PSWindowsUpdate<br />
 | ||
| <code>Get-WUApiVersion</code> версия Windows Update Agent<br />
 | ||
| <code>Get-WUHistory</code> список всех установленных обновлений (история
 | ||
| обновлений)<br />
 | ||
| <code>Get-WUHistory | Where-Object {$_.Title -match "KB4517389"}</code>
 | ||
| поиск обновления<br />
 | ||
| <code>Get-WULastResults</code> даты последнего поиска и установки
 | ||
| обновлений<br />
 | ||
| <code>Get-WURebootStatus</code> проверить, нужна ли перезагрузка для
 | ||
| применения конкретного обновления<br />
 | ||
| <code>Get-WUServiceManager</code> выводит источники обновлений<br />
 | ||
| <code>Get-WUInstallerStatus</code> статус службы Windows Installer<br />
 | ||
| <code>Remove-WUServiceManager</code> отключить Windows Update Service
 | ||
| Manager</p>
 | ||
| <h1 id="dism">DISM</h1>
 | ||
| <p><code>Get-Command -Module Dism -Name *Driver*</code><br />
 | ||
| <code>Export-WindowsDriver -Online -Destination C:\Users\Lifailon\Documents\Drivers\</code>
 | ||
| извлечение драйверов из текущей системы (C:), выгружает список файлов,
 | ||
| которые необходимы для установки драйвера (dll,sys,exe) в соответствии
 | ||
| со списком файлов, указанных в секции [CopyFiles] inf-файла
 | ||
| драйвера.<br />
 | ||
| <code>Export-WindowsDriver -Path C:\win_image -Destination C:\drivers</code>
 | ||
| извлечь драйвера из офлайн образа Windows, смонтированного в каталог
 | ||
| c:_image<br />
 | ||
| <code>$BackupDrivers = Export-WindowsDriver -Online -Destination C:\Drivers</code><br />
 | ||
| <code>$BackupDrivers | ft Driver,ClassName,ProviderName,Date,Version,ClassDescription</code>
 | ||
| список драйверов в объектном представлении<br />
 | ||
| <code>$BackupDrivers | where classname -match printer</code><br />
 | ||
| <code>pnputil.exe /add-driver C:\drivers\*.inf /subdirs /install</code>
 | ||
| установить все (параметр subdirs) драйвера из указанной папки (включая
 | ||
| вложенные)</p>
 | ||
| <p><code>sfc /scannow</code> проверить целостность системных файлов с
 | ||
| помощью утилиты SFC (System File Checker), в случае поиска ошибок,
 | ||
| попробует восстановить их оригинальные копии из хранилища системных
 | ||
| компонентов Windows (каталог C:). Вывод работы логируется в C:с тегом
 | ||
| SR<br />
 | ||
| <code>Get-ComputerInfo | select *</code> подробная информация о системе
 | ||
| (WindowsVersion,WindowsEditionId,<em>Bios</em>)<br />
 | ||
| <code>Get-WindowsImage -ImagePath E:\sources\install.wim</code> список
 | ||
| доступных версий в образе<br />
 | ||
| <code>Repair-WindowsImage -Online –ScanHealth</code><br />
 | ||
| <code>Repair-WindowsImage -Online -RestoreHealth</code> восстановление
 | ||
| хранилища системных компонентов<br />
 | ||
| <code>Repair-WindowsImage -Online -RestoreHealth -Source E:\sources\install.wim:3 –LimitAccess</code>
 | ||
| восстановление в оффлайн режиме из образа по номеру индекса</p>
 | ||
| <h1 id="scheduled">Scheduled</h1>
 | ||
| <p><code>$Trigger = New-ScheduledTaskTrigger -At 01:00am -Daily</code>
 | ||
| 1:00 ночи<br />
 | ||
| <code>$Trigger = New-ScheduledTaskTrigger –AtLogon</code> запуск при
 | ||
| входе пользователя в систему<br />
 | ||
| <code>$Trigger = New-ScheduledTaskTrigger -AtStartup</code> при запуске
 | ||
| системы<br />
 | ||
| <code>$User = "NT AUTHORITY\SYSTEM"</code><br />
 | ||
| <code>$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "$home\Documents\DNS-Change-Tray-1.3.ps1"</code><br />
 | ||
| <code>$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -NoLogo -NonInteractive -ExecutionPolicy Unrestricted -WindowStyle Hidden -File $home\Documents\DNS-Change-Tray-1.3.ps1"</code><br />
 | ||
| <code>Register-ScheduledTask -TaskName "DNS-Change-Tray-Startup" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force</code></p>
 | ||
| <p><code>Get-ScheduledTask | ? state -ne Disabled</code> список всех
 | ||
| активных заданий<br />
 | ||
| <code>Start-ScheduledTask DNS-Change-Tray-Startup</code> запустить
 | ||
| задание немедленно<br />
 | ||
| <code>Get-ScheduledTask DNS-Change-Tray-Startup | Disable-ScheduledTask</code>
 | ||
| отключить задание<br />
 | ||
| <code>Get-ScheduledTask DNS-Change-Tray-Startup | Enable-ScheduledTask</code>
 | ||
| включить задание<br />
 | ||
| <code>Unregister-ScheduledTask DNS-Change-Tray-Startup</code> удалить
 | ||
| задание<br />
 | ||
| <code>Export-ScheduledTask DNS-Change-Tray-Startup | Out-File $home\Desktop\Task-Export-Startup.xml</code>
 | ||
| экспортировать задание в xml<br />
 | ||
| <code>Register-ScheduledTask -Xml (Get-Content $home\Desktop\Task-Export-Startup.xml | Out-String) -TaskName "DNS-Change-Tray-Startup"</code></p>
 | ||
| <h1 id="network">Network</h1>
 | ||
| <h3 id="ping">ping</h3>
 | ||
| <p><code>Test-Connection -Count 1 $srv1, $srv2</code> отправить
 | ||
| icmp-пакет двум хостам<br />
 | ||
| <code>Test-Connection $srv -ErrorAction SilentlyContinue</code> не
 | ||
| выводить ошибок, если хост не отвечает<br />
 | ||
| <code>Test-Connection -Source $srv1 -ComputerName $srv2</code> пинг с
 | ||
| удаленного компьютера</p>
 | ||
| <div class="sourceCode" id="cb24"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb24-1"><a href="#cb24-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Test-PingNetwork <span class="op">{</span></span>
 | ||
| <span id="cb24-2"><a href="#cb24-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span> <span class="op">(</span></span>
 | ||
| <span id="cb24-3"><a href="#cb24-3" aria-hidden="true" tabindex="-1"></a>    <span class="op">[</span>Parameter<span class="op">(</span>Mandatory<span class="op">,</span>ValueFromPipeline<span class="op">)][</span><span class="dt">string</span><span class="op">[]]</span><span class="va">$Network</span><span class="op">,</span></span>
 | ||
| <span id="cb24-4"><a href="#cb24-4" aria-hidden="true" tabindex="-1"></a>    <span class="op">[</span>ValidateRange<span class="op">(</span><span class="dv">100</span><span class="op">,</span><span class="dv">10000</span><span class="op">)][</span><span class="dt">int</span><span class="op">]</span><span class="va">$Timeout</span> <span class="op">=</span> <span class="dv">100</span></span>
 | ||
| <span id="cb24-5"><a href="#cb24-5" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
 | ||
| <span id="cb24-6"><a href="#cb24-6" aria-hidden="true" tabindex="-1"></a><span class="va">$ping</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">NetworkInformation</span><span class="op">.</span><span class="fu">Ping</span></span>
 | ||
| <span id="cb24-7"><a href="#cb24-7" aria-hidden="true" tabindex="-1"></a><span class="va">$Network</span>  <span class="op">=</span> <span class="va">$Network</span> <span class="op">-replace</span> <span class="st">"0$"</span></span>
 | ||
| <span id="cb24-8"><a href="#cb24-8" aria-hidden="true" tabindex="-1"></a><span class="va">$net</span> <span class="op">=</span> <span class="op">@()</span></span>
 | ||
| <span id="cb24-9"><a href="#cb24-9" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$r</span> <span class="kw">in</span> <span class="op">@(</span><span class="dv">1</span><span class="op">..</span><span class="dv">254</span><span class="op">))</span> <span class="op">{</span></span>
 | ||
| <span id="cb24-10"><a href="#cb24-10" aria-hidden="true" tabindex="-1"></a>    <span class="va">$net</span> <span class="op">+=</span> <span class="st">"</span><span class="va">$network$r</span><span class="st">"</span></span>
 | ||
| <span id="cb24-11"><a href="#cb24-11" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb24-12"><a href="#cb24-12" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$n</span> <span class="kw">in</span> <span class="va">$net</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb24-13"><a href="#cb24-13" aria-hidden="true" tabindex="-1"></a>    <span class="va">$ping</span><span class="op">.</span><span class="fu">Send</span><span class="op">(</span><span class="va">$n</span><span class="op">,</span> <span class="va">$timeout</span><span class="op">)</span> <span class="op">|</span> <span class="fu">select</span> @<span class="op">{</span>Name<span class="op">=</span><span class="st">"Address"</span><span class="op">;</span> Expression<span class="op">={</span><span class="va">$n</span> <span class="op">-replace</span> <span class="st">".+\."</span><span class="op">}},</span> Status</span>
 | ||
| <span id="cb24-14"><a href="#cb24-14" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb24-15"><a href="#cb24-15" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>Test-PingNetwork -Network 192.168.3.0</code><br />
 | ||
| <code>Test-PingNetwork -Network 192.168.3.0 -Timeout 1000</code></p>
 | ||
| <p><code>Get-CimInstance -Class Win32_PingStatus -Filter "Address='127.0.0.1'"</code><br />
 | ||
| <code>Get-CimInstance -Class Win32_PingStatus -Filter "Address='127.0.0.1'" | Format-Table -Property Address,ResponseTime,StatusCode -Autosize</code>
 | ||
| 0 - успех<br />
 | ||
| <code>'127.0.0.1','8.8.8.8' | ForEach-Object -Process {Get-CimInstance -Class Win32_PingStatus -Filter ("Address='$_'") | Select-Object -Property Address,ResponseTime,StatusCode}</code><br />
 | ||
| <code>$ips = 1..254 | ForEach-Object -Process {'192.168.1.' + $_}</code>
 | ||
| сформировать массив из ip-адресов подсети</p>
 | ||
| <h3 id="dhcp">dhcp</h3>
 | ||
| <p><code>Get-CimInstance -Class Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=$true"</code>
 | ||
| отобразить адаптеры с включенным DHCP<br />
 | ||
| <code>$wql = 'SELECT * from Win32_NetworkAdapterConfiguration WHERE IPEnabled=True and DHCPEnabled=False'</code><br />
 | ||
| <code>Invoke-CimMethod -MethodName ReleaseDHCPLease -Query $wql</code>
 | ||
| включение DHCP на всех адаптерах<br />
 | ||
| <code>Invoke-CimMethod -ClassName Win32_NetworkAdapterConfiguration -MethodName ReleaseDHCPLeaseAll</code>
 | ||
| отменить аренду адресов DHCP на всех адаптерах<br />
 | ||
| <code>Invoke-CimMethod -ClassName Win32_NetworkAdapterConfiguration -MethodName RenewDHCPLeaseAll</code>
 | ||
| обновить аренду адресов DHCP на всех адаптерах</p>
 | ||
| <h3 id="port">port</h3>
 | ||
| <p><code>tnc $srv -p 5985</code><br />
 | ||
| <code>tnc $srv -CommonTCPPort WINRM</code> HTTP,RDP,SMB<br />
 | ||
| <code>tnc ya.ru –TraceRoute -Hops 2</code> TTL=2<br />
 | ||
| <code>tnc ya.ru -DiagnoseRouting</code> маршрутизация до хоста, куда
 | ||
| (DestinationPrefix: 0.0.0.0/0) через (NextHop: 192.168.1.254)</p>
 | ||
| <h3 id="nslookup">nslookup</h3>
 | ||
| <p><code>nslookup ya.ru 1.1.1.1</code> с указанием DNS сервера<br />
 | ||
| <code>nslookup -type=any ya.ru</code> указать тип записи<br />
 | ||
| <code>Resolve-DnsName ya.ru -Type MX</code>
 | ||
| ALL,ANY,A,NS,SRV,CNAME,PTR,TXT(spf)<br />
 | ||
| <code>[System.Net.Dns]::GetHostEntry("ya.ru")</code></p>
 | ||
| <h3 id="ipconfig">ipconfig</h3>
 | ||
| <p><code>Get-NetIPConfiguration</code><br />
 | ||
| <code>Get-NetIPConfiguration -InterfaceIndex 14 -Detailed</code></p>
 | ||
| <h3 id="adapter">Adapter</h3>
 | ||
| <p><code>Get-NetAdapter</code><br />
 | ||
| <code>Set-NetIPInterface -InterfaceIndex 14 -Dhcp Disabled</code>
 | ||
| отключить DHCP<br />
 | ||
| <code>Get-NetAdapter -InterfaceIndex 14 | New-NetIPAddress –IPAddress 192.168.3.99 -DefaultGateway 192.168.3.1 -PrefixLength 24</code>
 | ||
| задать/добавить статический IP-адрес<br />
 | ||
| <code>Set-NetIPAddress -InterfaceIndex 14 -IPAddress 192.168.3.98</code>
 | ||
| изменить IP-адреас на адаптере<br />
 | ||
| <code>Remove-NetIPAddress -InterfaceIndex 14 -IPAddress 192.168.3.99</code>
 | ||
| удалить IP-адрес на адаптере<br />
 | ||
| <code>Set-NetIPInterface -InterfaceIndex 14 -Dhcp Enabled</code>
 | ||
| включить DHCP</p>
 | ||
| <h3 id="dnsclient">DNSClient</h3>
 | ||
| <p><code>Get-DNSClientServerAddress</code><br />
 | ||
| <code>Set-DNSClientServerAddress -InterfaceIndex 14 -ServerAddresses 8.8.8.8</code></p>
 | ||
| <h3 id="dnscache">DNSCache</h3>
 | ||
| <p><code>Get-DnsClientCache</code> отобразить кэшированные записи
 | ||
| клиента DNS<br />
 | ||
| <code>Clear-DnsClientCache</code> очистить кэш</p>
 | ||
| <h3 id="binding">Binding</h3>
 | ||
| <p><code>Get-NetAdapterBinding -Name Ethernet -IncludeHidden -AllBindings</code><br />
 | ||
| <code>Get-NetAdapterBinding -Name "Беспроводная сеть" -DisplayName "IP версии 6 (TCP/IPv6)" | Set-NetAdapterBinding -Enabled $false</code>
 | ||
| отключить IPv6 на адаптере</p>
 | ||
| <h3 id="tcpsetting">TCPSetting</h3>
 | ||
| <p><code>Get-NetTCPSetting</code><br />
 | ||
| <code>Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CongestionProvider DCTCP</code><br />
 | ||
| <code>Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CwndRestart True</code><br />
 | ||
| <code>Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -ForceWS Disabled</code></p>
 | ||
| <h3 id="netstat">netstat</h3>
 | ||
| <p><code>netstat -anop tcp</code> -n/-f/-b<br />
 | ||
| <code>Get-NetTCPConnection -State Established,Listen | ? LocalPort -Match 3389</code><br />
 | ||
| <code>Get-NetTCPConnection -State Established,Listen | ? RemotePort -Match 22</code><br />
 | ||
| <code>Get-NetUDPEndpoint | ? LocalPort -Match 514</code> netstat -ap
 | ||
| udp`</p>
 | ||
| <h3 id="statistics">Statistics</h3>
 | ||
| <p><code>netstat -se</code><br />
 | ||
| <code>Get-NetAdapterStatistics</code></p>
 | ||
| <h3 id="hostname">hostname</h3>
 | ||
| <p><code>$env:computername</code><br />
 | ||
| <code>hostname.exe</code><br />
 | ||
| <code>(Get-CIMInstance CIM_ComputerSystem).Name</code><br />
 | ||
| <code>(New-Object -ComObject WScript.Network).ComputerName</code><br />
 | ||
| <code>[System.Environment]::MachineName</code><br />
 | ||
| <code>[System.Net.Dns]::GetHostName()</code></p>
 | ||
| <h3 id="arp">arp</h3>
 | ||
| <p><code>ipconfig /all | Select-String "физ"</code> grep<br />
 | ||
| <code>Get-NetNeighbor -AddressFamily IPv4</code></p>
 | ||
| <div class="sourceCode" id="cb25"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb25-1"><a href="#cb25-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-ARP <span class="op">{</span></span>
 | ||
| <span id="cb25-2"><a href="#cb25-2" aria-hidden="true" tabindex="-1"></a><span class="kw">Param</span> <span class="op">(</span></span>
 | ||
| <span id="cb25-3"><a href="#cb25-3" aria-hidden="true" tabindex="-1"></a><span class="va">$proxy</span><span class="op">,</span></span>
 | ||
| <span id="cb25-4"><a href="#cb25-4" aria-hidden="true" tabindex="-1"></a><span class="va">$search</span></span>
 | ||
| <span id="cb25-5"><a href="#cb25-5" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
 | ||
| <span id="cb25-6"><a href="#cb25-6" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(!</span><span class="va">$proxy</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb25-7"><a href="#cb25-7" aria-hidden="true" tabindex="-1"></a><span class="va">$arp</span> <span class="op">=</span> arp <span class="op">-</span>a</span>
 | ||
| <span id="cb25-8"><a href="#cb25-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb25-9"><a href="#cb25-9" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$proxy</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb25-10"><a href="#cb25-10" aria-hidden="true" tabindex="-1"></a><span class="va">$arp</span> <span class="op">=</span> <span class="fu">icm</span> <span class="va">$proxy</span> <span class="op">{</span>arp <span class="op">-</span>a<span class="op">}</span></span>
 | ||
| <span id="cb25-11"><a href="#cb25-11" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb25-12"><a href="#cb25-12" aria-hidden="true" tabindex="-1"></a><span class="va">$mac</span> <span class="op">=</span> <span class="va">$arp</span><span class="op">[</span><span class="dv">3</span><span class="op">..</span><span class="dv">260</span><span class="op">]</span></span>
 | ||
| <span id="cb25-13"><a href="#cb25-13" aria-hidden="true" tabindex="-1"></a><span class="va">$mac</span> <span class="op">=</span> <span class="va">$mac</span> <span class="op">-replace</span> <span class="st">"^\s\s"</span></span>
 | ||
| <span id="cb25-14"><a href="#cb25-14" aria-hidden="true" tabindex="-1"></a><span class="va">$mac</span> <span class="op">=</span> <span class="va">$mac</span> <span class="op">-replace</span> <span class="st">"\s{1,50}"</span><span class="op">,</span><span class="st">" "</span></span>
 | ||
| <span id="cb25-15"><a href="#cb25-15" aria-hidden="true" tabindex="-1"></a><span class="va">$mac_coll</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Collections</span><span class="op">.</span><span class="fu">Generic</span><span class="op">.</span><span class="fu">List</span><span class="op">[</span>System<span class="op">.</span><span class="fu">Object</span><span class="op">]</span></span>
 | ||
| <span id="cb25-16"><a href="#cb25-16" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$m</span> <span class="kw">in</span> <span class="va">$mac</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb25-17"><a href="#cb25-17" aria-hidden="true" tabindex="-1"></a><span class="va">$smac</span> <span class="op">=</span> <span class="va">$m</span> <span class="op">-split</span> <span class="st">" "</span></span>
 | ||
| <span id="cb25-18"><a href="#cb25-18" aria-hidden="true" tabindex="-1"></a><span class="va">$mac_coll</span><span class="op">.</span><span class="fu">Add</span><span class="op">([</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span></span>
 | ||
| <span id="cb25-19"><a href="#cb25-19" aria-hidden="true" tabindex="-1"></a>IP <span class="op">=</span> <span class="va">$smac</span><span class="op">[</span><span class="dv">0</span><span class="op">];</span></span>
 | ||
| <span id="cb25-20"><a href="#cb25-20" aria-hidden="true" tabindex="-1"></a>MAC <span class="op">=</span> <span class="va">$smac</span><span class="op">[</span><span class="dv">1</span><span class="op">];</span></span>
 | ||
| <span id="cb25-21"><a href="#cb25-21" aria-hidden="true" tabindex="-1"></a><span class="fu">Type</span> <span class="op">=</span> <span class="va">$smac</span><span class="op">[</span><span class="dv">2</span><span class="op">]</span></span>
 | ||
| <span id="cb25-22"><a href="#cb25-22" aria-hidden="true" tabindex="-1"></a><span class="op">})</span></span>
 | ||
| <span id="cb25-23"><a href="#cb25-23" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb25-24"><a href="#cb25-24" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$search</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb25-25"><a href="#cb25-25" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$search</span> <span class="op">-NotMatch</span> <span class="st">"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb25-26"><a href="#cb25-26" aria-hidden="true" tabindex="-1"></a><span class="co">#$ns = nslookup $search</span></span>
 | ||
| <span id="cb25-27"><a href="#cb25-27" aria-hidden="true" tabindex="-1"></a><span class="co">#$ns = $ns[-2]</span></span>
 | ||
| <span id="cb25-28"><a href="#cb25-28" aria-hidden="true" tabindex="-1"></a><span class="co">#$global:ns = $ns -replace "Address:\s{1,10}"</span></span>
 | ||
| <span id="cb25-29"><a href="#cb25-29" aria-hidden="true" tabindex="-1"></a><span class="va">$rdns</span> <span class="op">=</span> Resolve-DnsName <span class="va">$search</span> <span class="op">-</span>ErrorAction Ignore</span>
 | ||
| <span id="cb25-30"><a href="#cb25-30" aria-hidden="true" tabindex="-1"></a><span class="va">$ns</span> <span class="op">=</span> <span class="va">$rdns</span><span class="op">.</span><span class="fu">IPAddress</span></span>
 | ||
| <span id="cb25-31"><a href="#cb25-31" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$ns</span> <span class="op">-eq</span> <span class="va">$null</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb25-32"><a href="#cb25-32" aria-hidden="true" tabindex="-1"></a><span class="cf">return</span></span>
 | ||
| <span id="cb25-33"><a href="#cb25-33" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb25-34"><a href="#cb25-34" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">else</span> <span class="op">{</span></span>
 | ||
| <span id="cb25-35"><a href="#cb25-35" aria-hidden="true" tabindex="-1"></a><span class="va">$ns</span> <span class="op">=</span> <span class="va">$search</span></span>
 | ||
| <span id="cb25-36"><a href="#cb25-36" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb25-37"><a href="#cb25-37" aria-hidden="true" tabindex="-1"></a><span class="va">$mac_coll</span> <span class="op">=</span> <span class="va">$mac_coll</span> <span class="op">|</span> <span class="op">?</span> ip <span class="op">-Match</span> <span class="va">$ns</span></span>
 | ||
| <span id="cb25-38"><a href="#cb25-38" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb25-39"><a href="#cb25-39" aria-hidden="true" tabindex="-1"></a><span class="va">$mac_coll</span></span>
 | ||
| <span id="cb25-40"><a href="#cb25-40" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>Get-ARP -search 192.168.3.100</code><br />
 | ||
| <code>Get-ARP -search 192.168.3.100 -proxy dc-01</code></p>
 | ||
| <h1 id="rdp">RDP</h1>
 | ||
| <p><code>Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "PortNumber"</code>
 | ||
| отобразить номер текущего RDP порта<br />
 | ||
| <code>Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "PortNumber" -Value "3390"</code>
 | ||
| изменить RDP-порт<br />
 | ||
| <code>$(Get-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server\" -Name "fDenyTSConnections").fDenyTSConnections</code>
 | ||
| если 0, то включен<br />
 | ||
| <code>Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server\" -Name "fDenyTSConnections" -Value 0</code>
 | ||
| включить RDP<br />
 | ||
| <code>reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f</code><br />
 | ||
| <code>(gcim -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).SetAllowTSConnections(0)</code>
 | ||
| включить RDP (для Windows Server)<br />
 | ||
| <code>Get-Service TermService | Restart-Service -Force</code>
 | ||
| перезапустить rdp-службу<br />
 | ||
| <code>New-NetFirewallRule -Profile Any -DisplayName "RDP 3390" -Direction Inbound -Protocol TCP -LocalPort 3390</code>
 | ||
| открыть RDP-порт</p>
 | ||
| <h3 id="ipban">IPBan</h3>
 | ||
| <p><code>auditpol /get /category:*</code> отобразить все политики
 | ||
| аудита<br />
 | ||
| <code>auditpol /get /category:Вход/выход</code> отобразить локальные
 | ||
| политики аудита для Входа и Выхода из системы<br />
 | ||
| <code>auditpol /set /subcategory:"Вход в систему" /success:enable /failure:enable</code>
 | ||
| включить локальные политики - Аудит входа в систему<br />
 | ||
| <code>auditpol /set /subcategory:"Выход из системы" /success:enable /failure:enable</code></p>
 | ||
| <p><code>$url = $($(Invoke-RestMethod https://api.github.com/repos/DigitalRuby/IPBan/releases/latest).assets | Where-Object name -match ".+win.+x64.+").browser_download_url</code>
 | ||
| получить ссылку для загрузки последней версии<br />
 | ||
| <code>$version = $(Invoke-RestMethod https://api.github.com/repos/DigitalRuby/IPBan/releases/latest).tag_name</code>
 | ||
| получить номер последней версии<br />
 | ||
| <code>$path = "$home\Documents\ipban-$version"</code> путь для
 | ||
| установки<br />
 | ||
| <code>Invoke-RestMethod $url -OutFile "$home\Downloads\IPBan-$version.zip"</code>
 | ||
| скачать дистрибутив<br />
 | ||
| <code>Expand-Archive "$home\Downloads\ipban-$version.zip" -DestinationPath $path</code>
 | ||
| разархивировать в путь для установки<br />
 | ||
| <code>Remove-Item "$home\Downloads\ipban-$version.zip"</code> удалить
 | ||
| дистрибутив<br />
 | ||
| <code>sc create IPBan type=own start=delayed-auto binPath="$path\DigitalRuby.IPBan.exe" DisplayName=IPBan</code>
 | ||
| создать службу<br />
 | ||
| <code>Get-Service IPBan</code> статус службы<br />
 | ||
| <code>$conf = $(Get-Content "$path\ipban.config")</code> читаем
 | ||
| конфигурацию<br />
 | ||
| <code>$conf = $conf -replace '<add key="Whitelist" value=""/>','<add key="Whitelist" value="192.168.3.0/24"/>'</code>
 | ||
| добавить в белый лист домашнюю сеть для исключения<br />
 | ||
| <code>$conf = $conf -replace '<add key="ProcessInternalIPAddresses" value="false"/>','<add key="ProcessInternalIPAddresses" value="true"/>'</code>
 | ||
| включить обработку локальных (внутренних) ip-адресов<br />
 | ||
| <code>$conf = $conf -replace '<add key="FailedLoginAttemptsBeforeBanUserNameWhitelist" value="20"/>','<add key="FailedLoginAttemptsBeforeBanUserNameWhitelist" value="5"/>'</code>
 | ||
| указать количество попыток подключения до блокировки<br />
 | ||
| <code>$conf = $conf -replace '<add key="ExpireTime" value="01:00:00:00"/>','<add key="ExpireTime" value="00:01:00:00"/>'</code>
 | ||
| задать время блокировки 1 час<br />
 | ||
| <code>$conf > "$path\ipban.config"</code> обновить конфигурацию<br />
 | ||
| <code>Get-Service IPBan | Start-Service</code> запустить службу</p>
 | ||
| <pre><code>Get-NetFirewallRule | Where-Object DisplayName -Match "IPBan" | ForEach-Object {
 | ||
|     $Name = $_.DisplayName
 | ||
|     Get-NetFirewallAddressFilter -AssociatedNetFirewallRule $_ | Select-Object @{Name="Name"; Expression={$Name}},LocalIP,RemoteIP
 | ||
| } # отобразить область применения правил Брандмауэра для IPBan</code></pre>
 | ||
| <p><code>Get-Content -Wait "$path\logfile.txt"</code> читать лог<br />
 | ||
| <code>Get-Service IPBan | Stop-Service</code> остановить службу<br />
 | ||
| <code>sc delete IPBan</code> удалить службу</p>
 | ||
| <h1 id="shutdown">shutdown</h1>
 | ||
| <p><code>shutdown /r /o</code> перезагрузка в безопасный режим<br />
 | ||
| <code>shutdown /s /t 600 /c "Power off after 10 minutes"</code>
 | ||
| выключение<br />
 | ||
| <code>shutdown /s /f</code> принудительное закрытие приложений<br />
 | ||
| <code>shutdown /a</code> отмена<br />
 | ||
| <code>shutdown /r /t 0 /m \\192.168.3.100</code><br />
 | ||
| <code>Restart-Computer -ComputerName 192.168.3.100 -Protocol WSMan</code>
 | ||
| через WinRM<br />
 | ||
| <code>Restart-Computer –ComputerName 192.168.3.100 –Force</code> через
 | ||
| WMI<br />
 | ||
| <code>Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\PolicyManager\default\Start\HideShutDown" -Name "value" -Value 1</code>
 | ||
| скрыть кнопку выключения<br />
 | ||
| <code>Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\PolicyManager\default\Start\HideRestart" -Name "value" -Value 1</code>
 | ||
| скрыть кнопку перезагрузки</p>
 | ||
| <div class="sourceCode" id="cb27"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb27-1"><a href="#cb27-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Start-Shutdown <span class="op">{</span></span>
 | ||
| <span id="cb27-2"><a href="#cb27-2" aria-hidden="true" tabindex="-1"></a>    <span class="co"><#</span></span>
 | ||
| <span id="cb27-3"><a href="#cb27-3" aria-hidden="true" tabindex="-1"></a><span class="co">    .SYNOPSIS</span></span>
 | ||
| <span id="cb27-4"><a href="#cb27-4" aria-hidden="true" tabindex="-1"></a><span class="co">    Module for shutdown and restart the computer at a specified time</span></span>
 | ||
| <span id="cb27-5"><a href="#cb27-5" aria-hidden="true" tabindex="-1"></a><span class="co">    .DESCRIPTION</span></span>
 | ||
| <span id="cb27-6"><a href="#cb27-6" aria-hidden="true" tabindex="-1"></a><span class="co">    Example:</span></span>
 | ||
| <span id="cb27-7"><a href="#cb27-7" aria-hidden="true" tabindex="-1"></a><span class="co">    # Start-Shutdown -Time "18:00"</span></span>
 | ||
| <span id="cb27-8"><a href="#cb27-8" aria-hidden="true" tabindex="-1"></a><span class="co">    # Start-Shutdown -Restart -Time "18:00"</span></span>
 | ||
| <span id="cb27-9"><a href="#cb27-9" aria-hidden="true" tabindex="-1"></a><span class="co">    # Start-Shutdown -Cancel</span></span>
 | ||
| <span id="cb27-10"><a href="#cb27-10" aria-hidden="true" tabindex="-1"></a><span class="co">    .LINK</span></span>
 | ||
| <span id="cb27-11"><a href="#cb27-11" aria-hidden="true" tabindex="-1"></a><span class="co">    https://github.com/Lifailon/PS-Commands</span></span>
 | ||
| <span id="cb27-12"><a href="#cb27-12" aria-hidden="true" tabindex="-1"></a><span class="co">    #></span></span>
 | ||
| <span id="cb27-13"><a href="#cb27-13" aria-hidden="true" tabindex="-1"></a>    <span class="kw">param</span><span class="op">(</span></span>
 | ||
| <span id="cb27-14"><a href="#cb27-14" aria-hidden="true" tabindex="-1"></a>        <span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$Time</span><span class="op">,</span></span>
 | ||
| <span id="cb27-15"><a href="#cb27-15" aria-hidden="true" tabindex="-1"></a>        <span class="op">[</span><span class="dt">switch</span><span class="op">]</span><span class="va">$Restart</span><span class="op">,</span></span>
 | ||
| <span id="cb27-16"><a href="#cb27-16" aria-hidden="true" tabindex="-1"></a>        <span class="op">[</span><span class="dt">switch</span><span class="op">]</span><span class="va">$Cancel</span></span>
 | ||
| <span id="cb27-17"><a href="#cb27-17" aria-hidden="true" tabindex="-1"></a>    <span class="op">)</span></span>
 | ||
| <span id="cb27-18"><a href="#cb27-18" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span><span class="va">$Time</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb27-19"><a href="#cb27-19" aria-hidden="true" tabindex="-1"></a>        <span class="va">$currentDateTime</span> <span class="op">=</span> <span class="fu">Get-Date</span></span>
 | ||
| <span id="cb27-20"><a href="#cb27-20" aria-hidden="true" tabindex="-1"></a>        <span class="va">$shutdownTime</span> <span class="op">=</span> <span class="fu">Get-Date</span> <span class="va">$Time</span></span>
 | ||
| <span id="cb27-21"><a href="#cb27-21" aria-hidden="true" tabindex="-1"></a>        <span class="cf">if</span> <span class="op">(</span><span class="va">$shutdownTime</span> <span class="op">-lt</span> <span class="va">$currentDateTime</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb27-22"><a href="#cb27-22" aria-hidden="true" tabindex="-1"></a>            <span class="va">$shutdownTime</span> <span class="op">=</span> <span class="va">$shutdownTime</span><span class="op">.</span><span class="fu">AddDays</span><span class="op">(</span><span class="dv">1</span><span class="op">)</span></span>
 | ||
| <span id="cb27-23"><a href="#cb27-23" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb27-24"><a href="#cb27-24" aria-hidden="true" tabindex="-1"></a>        <span class="va">$timeUntilShutdown</span> <span class="op">=</span> <span class="va">$shutdownTime</span> <span class="op">-</span> <span class="va">$currentDateTime</span></span>
 | ||
| <span id="cb27-25"><a href="#cb27-25" aria-hidden="true" tabindex="-1"></a>        <span class="va">$secondsUntilShutdown</span> <span class="op">=</span> <span class="op">[</span>math<span class="op">]::</span>Round<span class="op">(</span><span class="va">$timeUntilShutdown</span><span class="op">.</span><span class="fu">TotalSeconds</span><span class="op">)</span></span>
 | ||
| <span id="cb27-26"><a href="#cb27-26" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb27-27"><a href="#cb27-27" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span><span class="va">$Cancel</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb27-28"><a href="#cb27-28" aria-hidden="true" tabindex="-1"></a>        <span class="fu">Start-Process</span> <span class="op">-</span>FilePath <span class="st">"shutdown.exe"</span> <span class="op">-</span>ArgumentList <span class="st">"/a"</span></span>
 | ||
| <span id="cb27-29"><a href="#cb27-29" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span> <span class="cf">elseif</span> <span class="op">(</span><span class="va">$Restart</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb27-30"><a href="#cb27-30" aria-hidden="true" tabindex="-1"></a>        <span class="fu">Write-Host</span> <span class="st">"The computer will restart after </span><span class="op">$(</span><span class="va">$timeUntilShutdown</span><span class="op">.</span><span class="fu">Hours</span><span class="op">)</span><span class="st"> hours and </span><span class="op">$(</span><span class="va">$timeUntilShutdown</span><span class="op">.</span><span class="fu">Minutes</span><span class="op">)</span><span class="st"> minutes."</span></span>
 | ||
| <span id="cb27-31"><a href="#cb27-31" aria-hidden="true" tabindex="-1"></a>        <span class="fu">Start-Process</span> <span class="op">-</span>FilePath <span class="st">"shutdown.exe"</span> <span class="op">-</span>ArgumentList <span class="st">"/r"</span><span class="op">,</span> <span class="st">"/f"</span><span class="op">,</span> <span class="st">"/t"</span><span class="op">,</span> <span class="st">"</span><span class="va">$secondsUntilShutdown</span><span class="st">"</span></span>
 | ||
| <span id="cb27-32"><a href="#cb27-32" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span> <span class="cf">else</span> <span class="op">{</span></span>
 | ||
| <span id="cb27-33"><a href="#cb27-33" aria-hidden="true" tabindex="-1"></a>        <span class="fu">Write-Host</span> <span class="st">"The computer will shutdown after </span><span class="op">$(</span><span class="va">$timeUntilShutdown</span><span class="op">.</span><span class="fu">Hours</span><span class="op">)</span><span class="st"> hours and </span><span class="op">$(</span><span class="va">$timeUntilShutdown</span><span class="op">.</span><span class="fu">Minutes</span><span class="op">)</span><span class="st"> minutes."</span></span>
 | ||
| <span id="cb27-34"><a href="#cb27-34" aria-hidden="true" tabindex="-1"></a>        <span class="fu">Start-Process</span> <span class="op">-</span>FilePath <span class="st">"shutdown.exe"</span> <span class="op">-</span>ArgumentList <span class="st">"/s"</span><span class="op">,</span> <span class="st">"/f"</span><span class="op">,</span> <span class="st">"/t"</span><span class="op">,</span> <span class="st">"</span><span class="va">$secondsUntilShutdown</span><span class="st">"</span></span>
 | ||
| <span id="cb27-35"><a href="#cb27-35" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb27-36"><a href="#cb27-36" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <h1 id="localaccounts">LocalAccounts</h1>
 | ||
| <p><code>Get-Command -Module Microsoft.PowerShell.LocalAccounts</code><br />
 | ||
| <code>Get-LocalUser</code> список пользователей<br />
 | ||
| <code>Get-LocalGroup</code> список групп<br />
 | ||
| <code>New-LocalUser "1C" -Password $Password -FullName "1C Domain"</code>
 | ||
| создать пользователя<br />
 | ||
| <code>Set-LocalUser -Password $Password 1C</code> изменить пароль<br />
 | ||
| <code>Add-LocalGroupMember -Group "Administrators" -Member "1C"</code>
 | ||
| добавить в группу Администраторов<br />
 | ||
| <code>Get-LocalGroupMember "Administrators"</code> члены группы</p>
 | ||
| <div class="sourceCode" id="cb28"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb28-1"><a href="#cb28-1" aria-hidden="true" tabindex="-1"></a><span class="op">@(</span><span class="st">"vproxy-01"</span><span class="op">,</span><span class="st">"vproxy-02"</span><span class="op">,</span><span class="st">"vproxy-03"</span><span class="op">)</span> <span class="op">|</span> <span class="op">%{</span></span>
 | ||
| <span id="cb28-2"><a href="#cb28-2" aria-hidden="true" tabindex="-1"></a><span class="fu">icm</span> <span class="va">$_</span> <span class="op">{</span>Add-LocalGroupMember <span class="op">-</span>Group <span class="st">"Administrators"</span> <span class="op">-</span>Member <span class="st">"support4"</span><span class="op">}</span></span>
 | ||
| <span id="cb28-3"><a href="#cb28-3" aria-hidden="true" tabindex="-1"></a><span class="fu">icm</span> <span class="va">$_</span> <span class="op">{</span>Get-LocalGroupMember <span class="st">"Administrators"</span><span class="op">}</span></span>
 | ||
| <span id="cb28-4"><a href="#cb28-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <h1 id="smb">SMB</h1>
 | ||
| <p><code>Get-SmbServerConfiguration</code><br />
 | ||
| <code>Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force</code>
 | ||
| отключить протокол SMB v1<br />
 | ||
| <code>Get-WindowsFeature | Where-Object {$_.name -eq "FS-SMB1"} | ft Name,Installstate</code>
 | ||
| модуль ServerManager, проверить установлен ли компонент SMB1<br />
 | ||
| <code>Install-WindowsFeature FS-SMB1</code> установить SMB1<br />
 | ||
| <code>Uninstall-WindowsFeature –Name FS-SMB1 –Remove</code> удалить SMB1
 | ||
| клиента (понадобится перезагрузка)<br />
 | ||
| <code>Get-WindowsOptionalFeature -Online</code> модуль DISM, для работы
 | ||
| с компонентами Windows<br />
 | ||
| <code>Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -Remove</code>
 | ||
| удалить SMB1<br />
 | ||
| <code>Set-SmbServerConfiguration –AuditSmb1Access $true</code> включить
 | ||
| аудит SMB1<br />
 | ||
| <code>Get-SmbConnection</code> список активных сессий и используемая
 | ||
| версия SMB (Dialect)<br />
 | ||
| <code>Get-SmbOpenFile | select ClientUserName,ClientComputerName,Path,SessionID</code>
 | ||
| список открытых файлов<br />
 | ||
| <code>Get-SmbShare</code> список сетевых папок<br />
 | ||
| <code>New-SmbShare -Name xl-share -Path E:\test</code> создать новую
 | ||
| общую сетевую папку (расшарить)<br />
 | ||
| <code>-EncryptData $True</code> включить шифрование SMB<br />
 | ||
| <code>-Description</code> имя в сетевом окружении<br />
 | ||
| <code>-ReadAccess "domain\username"</code> доступ на чтение<br />
 | ||
| <code>-ChangeAccess</code> доступ на запись<br />
 | ||
| <code>-FullAccess</code> полный доступ<br />
 | ||
| <code>-NoAccess ALL</code> нет прав<br />
 | ||
| <code>-FolderEnumerationMode [AccessBased | Unrestricted]</code>
 | ||
| позволяет скрыть в сетевой папке объекты, на которых у пользователя нет
 | ||
| доступа с помощью Access-Based Enumeration (ABE)<br />
 | ||
| <code>Get-SmbShare xl-share | Set-SmbShare -FolderEnumerationMode AccessBased</code>
 | ||
| ключить ABE для всех расшаренных папок<br />
 | ||
| <code>Remove-SmbShare xl-share -force</code> удалить сетевой доступ
 | ||
| (шару)<br />
 | ||
| <code>Get-SmbShareAccess xl-share</code> вывести список доступов
 | ||
| безопасности к шаре<br />
 | ||
| <code>Revoke-SmbShareAccess xl-share -AccountName Everyone –Force</code>
 | ||
| удалить группу из списка доступов<br />
 | ||
| <code>Grant-SmbShareAccess -Name xl-share -AccountName "domain\XL-Share" -AccessRight Change –force</code>
 | ||
| изменить/добавить разрешения на запись (Full,Read)<br />
 | ||
| <code>Grant-SmbShareAccess -Name xl-share -AccountName "все" -AccessRight Change –force</code><br />
 | ||
| <code>Block-SmbShareAccess -Name xl-share -AccountName "domain\noAccess" -Force</code>
 | ||
| принудительный запрет<br />
 | ||
| <code>New-SmbMapping -LocalPath X: -RemotePath \\$srv\xl-share -UserName support4 -Password password –Persistent $true</code>
 | ||
| подключить сетевой диск<br />
 | ||
| <code>-Persistent</code> восстановление соединения после отключения
 | ||
| компьютера или сети<br />
 | ||
| <code>-SaveCredential</code> позволяет сохранить учетные данные
 | ||
| пользователя для подключения в диспетчер учетных данных Windows
 | ||
| Credential Manager<br />
 | ||
| <code>Stop-Process -Name "explorer" | Start-Process -FilePath "C:\Windows\explorer.exe"</code>
 | ||
| перезапустить процесс для отображения в проводнике<br />
 | ||
| <code>Get-SmbMapping</code> список подключенных сетевых дисков<br />
 | ||
| <code>Remove-SmbMapping X: -force</code> отмонтировать сетевой
 | ||
| диск<br />
 | ||
| <code>$CIMSession = New-CIMSession –Computername $srv</code> создать
 | ||
| сеанс CIM (аудентификация на SMB)<br />
 | ||
| <code>Get-SmbOpenFile -CIMSession $CIMSession | select ClientUserName,ClientComputerName,Path | Out-GridView -PassThru | Close-SmbOpenFile -CIMSession $CIMSession -Confirm:$false –Force</code>
 | ||
| закрыть файлы (открыть к ним сетевой доступ)</p>
 | ||
| <h3 id="get-acl">Get-Acl</h3>
 | ||
| <p><code>(Get-Acl \\$srv\xl-share).access</code> доступ ACL на уровне
 | ||
| NTFS<br />
 | ||
| <code>Get-Acl C:\Drivers | Set-Acl C:\Distr</code> скопировать NTFS
 | ||
| разрешения с одной папки и применить их на другую</p>
 | ||
| <h3 id="ntfssecurity">NTFSSecurity</h3>
 | ||
| <p><code>Install-Module -Name NTFSSecurity -force</code><br />
 | ||
| <code>Get-Item "\\$srv\xl-share" | Get-NTFSAccess</code><br />
 | ||
| <code>Add-NTFSAccess -Path "\\$srv\xl-share" -Account "domain\xl-share" -AccessRights Fullcontrol -PassThru</code>
 | ||
| добавить<br />
 | ||
| <code>Remove-NTFSAccess -Path "\\$srv\xl-share" -Account "domain\xl-share" -AccessRights FullControl -PassThru</code>
 | ||
| удалить<br />
 | ||
| <code>Get-ChildItem -Path "\\$srv\xl-share" -Recurse -Force | Clear-NTFSAccess</code>
 | ||
| удалить все разрешения, без удаления унаследованных разрешений<br />
 | ||
| <code>Get-ChildItem -Path "\\$srv\xl-share" -Recurse -Force | Enable-NTFSAccessInheritance</code>
 | ||
| включить NTFS наследование для всех объектов в каталоге</p>
 | ||
| <h3 id="storage">Storage</h3>
 | ||
| <p><code>Get-Command -Module Storage</code><br />
 | ||
| <code>Get-Disk</code> список логических дисков<br />
 | ||
| <code>Get-Partition</code> отобразить разделы на всех дисках<br />
 | ||
| <code>Get-Volume</code> список логичких разделов<br />
 | ||
| <code>Get-PhysicalDisk</code> список физических дисков<br />
 | ||
| <code>Initialize-Disk 1 –PartitionStyle MBR</code> инициализировать
 | ||
| диск<br />
 | ||
| <code>New-Partition -DriveLetter D –DiskNumber 1 -Size 500gb</code>
 | ||
| создать раздел (выделить все место -UseMaximumSize)<br />
 | ||
| <code>Format-Volume -DriveLetter D -FileSystem NTFS -NewFileSystemLabel Disk-D</code>
 | ||
| форматировать раздел<br />
 | ||
| <code>Set-Partition -DriveLetter D -IsActive $True</code> сделать
 | ||
| активным<br />
 | ||
| <code>Remove-Partition -DriveLetter D –DiskNumber 1</code> удалить
 | ||
| раздел<br />
 | ||
| <code>Clear-Disk -Number 1 -RemoveData</code> очистить диск<br />
 | ||
| <code>Repair-Volume –driveletter C –Scan</code> Check disk<br />
 | ||
| <code>Repair-Volume –driveletter C –SpotFix</code><br />
 | ||
| <code>Repair-Volume –driverletter C -Scan –Cimsession $CIMSession</code></p>
 | ||
| <h3 id="iscsi">iSCSI</h3>
 | ||
| <p><code>New-IscsiVirtualDisk -Path D:\iSCSIVirtualDisks\iSCSI2.vhdx -Size 20GB</code>
 | ||
| создать динамический vhdx-диск (для фиксированного размера
 | ||
| -UseFixed)<br />
 | ||
| <code>New-IscsiServerTarget -TargetName iscsi-target-2 -InitiatorIds "IQN:iqn.1991-05.com.microsoft:srv3.contoso.com"</code>
 | ||
| создать Target<br />
 | ||
| <code>Get-IscsiServerTarget | fl TargetName, LunMappings</code><br />
 | ||
| <code>Connect-IscsiTarget -NodeAddress "iqn.1995-05.com.microsoft:srv2-iscsi-target-2-target" -IsPersistent $true</code>
 | ||
| подключиться инициатором к таргету<br />
 | ||
| <code>Get-IscsiTarget | fl</code><br />
 | ||
| <code>Disconnect-IscsiTarget -NodeAddress "iqn.1995-05.com.microsoft:srv2-iscsi-target-2-target" -Confirm:$false</code>
 | ||
| отключиться</p>
 | ||
| <h1 id="activedirectory">ActiveDirectory</h1>
 | ||
| <h3 id="rsat-remote-server-administration-tools">RSAT (Remote Server
 | ||
| Administration Tools)</h3>
 | ||
| <p><code>DISM.exe /Online /add-capability /CapabilityName:Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 /CapabilityName:Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0</code><br />
 | ||
| <code>Add-WindowsCapability –online –Name Rsat.Dns.Tools~~~~0.0.1.0</code><br />
 | ||
| <code>Add-WindowsCapability -Online -Name Rsat.DHCP.Tools~~~~0.0.1.0</code><br />
 | ||
| <code>Add-WindowsCapability –online –Name Rsat.FileServices.Tools~~~~0.0.1.0</code><br />
 | ||
| <code>Add-WindowsCapability -Online -Name Rsat.WSUS.Tools~~~~0.0.1.0</code><br />
 | ||
| <code>Add-WindowsCapability -Online -Name Rsat.CertificateServices.Tools~~~~0.0.1.0</code><br />
 | ||
| <code>Add-WindowsCapability -Online -Name Rsat.RemoteDesktop.Services.Tools~~~~0.0.1.0</code><br />
 | ||
| <code>Get-WindowsCapability -Name RSAT* -Online | Select-Object -Property DisplayName, State</code>
 | ||
| отобразить список установленных компанентов</p>
 | ||
| <h3 id="import-module-activedirectory">Import-Module
 | ||
| ActiveDirectory</h3>
 | ||
| <p><code>$Session = New-PSSession -ComputerName $srv</code> -Credential
 | ||
| $cred<code>\</code>Export-PSsession -Session $Session -Module
 | ||
| ActiveDirectory -OutputModule
 | ||
| ActiveDirectory<code>экспортировать модуль из удаленной сесси (например, с DC) \</code>Remove-PSSession
 | ||
| -Session $Session<code>\</code>Import-Module
 | ||
| ActiveDirectory<code>\</code>Get-Command -Module ActiveDirectory`</p>
 | ||
| <h3 id="adsi-active-directory-service-interface">ADSI (Active Directory
 | ||
| Service Interface)</h3>
 | ||
| <p><code>$d0 = $env:userdnsdomain</code><br />
 | ||
| <code>$d0 = $d0 -split "\."</code><br />
 | ||
| <code>$d1 = $d0[0]</code><br />
 | ||
| <code>$d2 = $d0[1]</code><br />
 | ||
| <code>$group = [ADSI]"LDAP://OU=Domain Controllers,DC=$d1,DC=$d2"</code><br />
 | ||
| <code>$group | select *</code></p>
 | ||
| <p><code>$Local_User = [ADSI]"WinNT://./Администратор,user"</code><br />
 | ||
| <code>$Local_User | Get-Member</code><br />
 | ||
| <code>$Local_User.Description</code><br />
 | ||
| <code>$Local_User.LastLogin</code> время последней авторизации
 | ||
| локального пользователя</p>
 | ||
| <h3 id="ldap-lightweight-directory-access-protocol">LDAP (Lightweight
 | ||
| Directory Access Protocol)</h3>
 | ||
| <p><code>$ldapsearcher = New-Object System.DirectoryServices.DirectorySearcher</code><br />
 | ||
| <code>$ldapsearcher.SearchRoot = "LDAP://OU=Domain Controllers,DC=$d1,DC=$d2"</code><br />
 | ||
| <code>$ldapsearcher.Filter = "(objectclass=computer)"</code><br />
 | ||
| <code>$dc = $ldapsearcher.FindAll().path</code></p>
 | ||
| <p><code>$usr = $env:username</code> cписок групп текущего
 | ||
| пользователя<br />
 | ||
| <code>$ldapsearcher = New-Object System.DirectoryServices.DirectorySearcher</code><br />
 | ||
| <code>$ldapsearcher.Filter = "(&(objectCategory=User)(samAccountName=$usr))"</code><br />
 | ||
| <code>$usrfind = $ldapsearcher.FindOne()</code><br />
 | ||
| <code>$groups = $usrfind.properties.memberof -replace "(,OU=.+)"</code><br />
 | ||
| <code>$groups = $groups -replace "(CN=)"</code></p>
 | ||
| <p>DC (Domain Component) - компонент доменного имени<br />
 | ||
| OU (Organizational Unit) - организационные подразделения (type),
 | ||
| используются для упорядочения объектов<br />
 | ||
| Container - так же используется для упорядочения объектов, контейнеры в
 | ||
| отличии от подраделений не могут быть переименованы, удалены, созданы
 | ||
| или связаны с объектом групповой политики (Computers, Domain
 | ||
| Controllers, Users)<br />
 | ||
| DN (Distinguished Name) — уникальное имя объекта и местоположение в лесу
 | ||
| AD. В DN описывается содержимое атрибутов в дереве (путь навигации),
 | ||
| требуемое для доступа к конкретной записи или ее поиска<br />
 | ||
| CN (Common Name) - общее имя</p>
 | ||
| <p><code>(Get-ADObject (Get-ADRootDSE).DefaultNamingContext -Properties wellKnownObjects).wellKnownObjects</code>
 | ||
| отобразить отобразить контейнеры по умолчанию<br />
 | ||
| <code>redircmp OU=Client Computers,DC=root,DC=domain,DC=local</code>
 | ||
| изменить контейнер компьютеров по умолчанию<br />
 | ||
| <code>redirusr</code> изменить контейнер пользователей по умолчанию</p>
 | ||
| <h3 id="laps-local-admin-password-management">LAPS (Local Admin Password
 | ||
| Management)</h3>
 | ||
| <p><code>Import-module AdmPwd.ps</code> импортировать модуль<br />
 | ||
| <code>Get-AdmPwdPassword -ComputerName NAME</code> посмотреть
 | ||
| пароль<br />
 | ||
| <code>Reset-AdmPwdPassword -ComputerName NAME</code> изменить
 | ||
| пароль<br />
 | ||
| <code>Get-ADComputer -Filter * -SearchBase "DC=$d1,DC=$d2" | Get-AdmPwdPassword -ComputerName {$_.Name} | select ComputerName,Password,ExpirationTimestamp | Out-GridView</code><br />
 | ||
| <code>Get-ADComputer -Identity $srv | Get-AdmPwdPassword -ComputerName {$_.Name} | select ComputerName,Password,ExpirationTimestamp</code></p>
 | ||
| <h3 id="recycle-bin">Recycle Bin</h3>
 | ||
| <p>Удаленные объекты хранятся в корзине AD в течении времени захоронения
 | ||
| (определяется в атрибуте домена msDS-deletedObjectLifetime), заданном
 | ||
| для леса. По умолчанию это 180 дней. Если данный срок прошел, объект все
 | ||
| еще остается в контейнере Deleted Objects, но большинство его атрибутов
 | ||
| и связей очищаются (Recycled Object). После истечения периода
 | ||
| tombstoneLifetime (по умолчанию также 180 дней, но можно увеличить)
 | ||
| объект полностью удаляется из AD автоматическим процессом очистки.<br />
 | ||
| <code>Get-ADForest domain.local</code> отобразить уровень работы
 | ||
| леса<br />
 | ||
| <code>Set-ADForestMode -Identity domain.local -ForestMode Windows2008R2Forest -force</code>
 | ||
| увеличить уровень работы леса<br />
 | ||
| <code>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"</code>
 | ||
| включить корзину<br />
 | ||
| <code>Get-ADOptionalFeature "Recycle Bin Feature" | select-object name,EnabledScopes</code>
 | ||
| если значение EnabledScopes не пустое, значит в домене корзина Active
 | ||
| Directory включена<br />
 | ||
| <code>Get-ADObject -Filter 'Name -like "*tnas*"' -IncludeDeletedObjects</code>
 | ||
| найти удаленную (Deleted: True) УЗ (ObjectClass: user) в AD<br />
 | ||
| <code>Get-ADObject -Filter 'Name -like "*tnas*"' –IncludeDeletedObjects -Properties *| select-object Name, sAMAccountName, LastKnownParent, memberOf, IsDeleted | fl</code>
 | ||
| проверить значение атрибута IsDeleted, контейнер, в котором находился
 | ||
| пользователе перед удалением (LastKnownParent) и список групп, в которых
 | ||
| он состоял<br />
 | ||
| <code>Get-ADObject –filter {Deleted -eq $True -and ObjectClass -eq "user"} –includeDeletedObjects</code>
 | ||
| вывести список удаленных пользователей<br />
 | ||
| <code>Restore-ADObject -Identity "3dc33c7c-b912-4a19-b1b7-415c1395a34e"</code>
 | ||
| восстановить по значению атрибута ObjectGUID<br />
 | ||
| <code>Get-ADObject -Filter 'SAMAccountName -eq "tnas-01"' –IncludeDeletedObjects | Restore-ADObject</code>
 | ||
| восстановить по SAMAccountName<br />
 | ||
| <code>Get-ADObject -Filter {Deleted -eq $True -and ObjectClass -eq 'group' -and Name -like '*Allow*'} –IncludeDeletedObjects | Restore-ADObject –Verbose</code>
 | ||
| восстановить группу или компьютер</p>
 | ||
| <h3 id="thumbnailphoto">thumbnailPhoto</h3>
 | ||
| <p><code>$photo = [byte[]](Get-Content C:\Install\adm.jpg -Encoding byte)</code>
 | ||
| преобразовать файл картинки в массив байтов (jpeg/bmp файл, размером
 | ||
| фото до 100 Кб и разрешением 96?96)<br />
 | ||
| <code>Set-ADUser support4 -Replace @{thumbnailPhoto=$photo}</code>
 | ||
| задать значение атрибута thumbnailPhoto</p>
 | ||
| <h3 id="addomaincontroller">ADDomainController</h3>
 | ||
| <p><code>Get-ADDomainController</code> выводит информацию о текущем
 | ||
| контроллере домена (LogonServer), который используется данным
 | ||
| компьютером для аутентификации (DC выбирается при загрузке в
 | ||
| соответствии с топологией сайтов AD)<br />
 | ||
| <code>Get-ADDomainController -Discover -Service PrimaryDC</code> найти
 | ||
| контроллер с ролью PDC в домене<br />
 | ||
| <code>Get-ADDomainController -Filter * | ft HostName,IPv4Address,Name,Site,OperatingSystem,IsGlobalCatalog</code>
 | ||
| список все DC, принадлежность к сайту, версии ОС и GC</p>
 | ||
| <p>При загрузке ОС служба NetLogon делает DNS запрос со списком
 | ||
| контроллеров домена (к SRV записи <em>ldap._tcp.dc._msdcs.domain</em>),
 | ||
| DNS возвращает список DC в домене с записью Service Location (SRV).
 | ||
| Клиент делает LDAP запрос к DC для определения сайта AD по своему IP
 | ||
| адресу. Клиент через DNS запрашивает список контроллеров домена в сайте
 | ||
| (в разделе _tcp.sitename._sites…).</p>
 | ||
| <p>USN (Update Sequence Numbers) - счетчик номера последовательного
 | ||
| обновления, который существует у каждого объекта AD. При репликации
 | ||
| контроллеры обмениваются значениями USN, объект с более низким USN будет
 | ||
| при репликации перезаписан объектом с более высоким USN. Находится в
 | ||
| свойствах - Object (включить View - Advanced Features). Каждый
 | ||
| контроллер домена содержит отдельный счетчик USN, который начинает
 | ||
| отсчет в момент запуска процесса Dcpromo и продолжает увеличивать
 | ||
| значения в течение всего времени существования контроллера домена.
 | ||
| Значение счетчика USN увеличивается каждый раз, когда на контроллере
 | ||
| домена происходит транзакция, это операции создания, обновления или
 | ||
| удаления объекта.</p>
 | ||
| <p><code>Get-ADDomainController -Filter * | % {</code> отобразить USN
 | ||
| объекта на всех DC в домене<code>\</code>Get-ADUser -Server $_.HostName
 | ||
| -Identity support4 -Properties uSNChanged | select
 | ||
| SamAccountName,uSNChanged<code>\</code>}`</p>
 | ||
| <p><code>dcpromo /forceremoval</code> принудительно выполнит понижение в
 | ||
| роли контроллера домена до уровня рядового сервера. После понижения роли
 | ||
| выполняется удаление всех ссылок в домене на этот контроллер. Далее
 | ||
| производит включение сервера в состав домена, и выполнение обратного
 | ||
| процесса, т.е. повышение сервера до уровня контроллера домена.</p>
 | ||
| <h3 id="adcomputer">ADComputer</h3>
 | ||
| <p><code>nltest /DSGETDC:$env:userdnsdomain</code> узнать на каком DC
 | ||
| аудентифицирован хост (Logon Server)<br />
 | ||
| <code>nltest /SC_RESET:$env:userdnsdomain\srv-dc2.$env:userdnsdomain</code>
 | ||
| переключить компьютер на другой контроллер домена AD вручную (The
 | ||
| command completed successfully)<br />
 | ||
| <code>Get-ADComputer –Identity $env:computername -Properties PasswordLastSet</code>
 | ||
| время последней смены пароля на сервере<br />
 | ||
| <code>Test-ComputerSecureChannel –verbose</code> проверить доверительные
 | ||
| отношения с доменом (соответствует ли локальный пароль компьютера
 | ||
| паролю, хранящемуся в AD)<br />
 | ||
| <code>Reset-ComputerMachinePassword -Credential domain\admin</code>
 | ||
| принудительно обновить пароль<br />
 | ||
| <code>Netdom ResetPWD /Server:dc-01 /UserD:domain\admin /PasswordD:*</code>
 | ||
| сбросить хэш пароля компьютера в домене (перезагрузка не
 | ||
| требуется)<br />
 | ||
| <code>Search-ADAccount -AccountDisabled -ComputersOnly | select Name,LastLogonDate,Enabled</code>
 | ||
| отобразить все отключенные компьютеры</p>
 | ||
| <p><code>Get-ADComputer -Filter * -Properties * | select name</code>
 | ||
| список всех компьютеров в домене (Filter), вывести все свойства
 | ||
| (Properties)<br />
 | ||
| <code>Get-ADComputer -Identity $srv -Properties * | ft Name,LastLogonDate,PasswordLastSet,ms-Mcs-AdmPwd -Autosize</code>
 | ||
| конкретного компьютера в AD (Identity)<br />
 | ||
| <code>Get-ADComputer -SearchBase "OU=Domain Controllers,DC=$d1,DC=$d2" -Filter * -Properties * | ft Name, LastLogonDate, distinguishedName -Autosize</code>
 | ||
| поиск в базе по DN (SearchBase)</p>
 | ||
| <p><code>(Get-ADComputer -Filter {enabled -eq "true"}).count</code>
 | ||
| получить общее количество активных (незаблокированных) компьютеров<br />
 | ||
| <code>(Get-ADComputer -Filter {enabled -eq "true" -and OperatingSystem -like "*Windows Server 2016*"}).count</code>
 | ||
| кол-во активных копьютеров с ОС WS 2016</p>
 | ||
| <p><code>Get-ADComputer -Filter * -Properties * | select @{Label="Ping Status"; Expression={</code><br />
 | ||
| <code>$ping = ping -n 1 -w 50 $_.Name</code><br />
 | ||
| <code>if ($ping -match "TTL") {"Online"} else {"Offline"}</code><br />
 | ||
| <code>}},</code><br />
 | ||
| <code>@{Label="Status"; Expression={</code><br />
 | ||
| <code>if ($_.Enabled -eq "True") {$_.Enabled -replace "True","Active"} else {$_.Enabled -replace "False","Blocked"}</code><br />
 | ||
| <code>}}, Name, IPv4Address, OperatingSystem, @{Label="UserOwner"; Expression={$_.ManagedBy -replace "(CN=|,.+)"}</code><br />
 | ||
| <code>},Created | Out-GridView</code></p>
 | ||
| <h3 id="aduser">ADUser</h3>
 | ||
| <p><code>Get-ADUser -Identity support4 -Properties *</code> список всех
 | ||
| атрибутов<br />
 | ||
| <code>Get-ADUser -Identity support4 -Properties DistinguishedName, EmailAddress, Description</code>
 | ||
| путь DN, email и описание<br />
 | ||
| <code>Get-ADUser -Filter {(Enabled -eq "True") -and (mail -ne "null")} -Properties mail | ft Name,mail</code>
 | ||
| список активных пользователей и есть почтовый ящик<br />
 | ||
| <code>Get-ADUser -Filter {SamAccountName -like "*"} | Measure-Object</code>
 | ||
| посчитать кол-во всех аккаунтов (Count)<br />
 | ||
| <code>Get-ADUser -Filter * -Properties WhenCreated | sort WhenCreated | ft Name, whenCreated</code>
 | ||
| дата создания<br />
 | ||
| <code>Get-ADUser -Identity support4 -property LockedOut | select samaccountName,Name,Enabled,Lockedout</code><br />
 | ||
| <code>Enabled=True</code> учетная запись включена - да<br />
 | ||
| <code>Lockedout=False</code> учетная запись заблокирована (например,
 | ||
| политикой паролей) - нет<br />
 | ||
| <code>Get-ADUser -Identity support4 | Unlock-ADAccount</code>
 | ||
| разблокировать учетную запись<br />
 | ||
| <code>Disable-ADAccount -Identity support4</code> отключить учетную
 | ||
| запись<br />
 | ||
| <code>Enable-ADAccount -Identity support4</code> включить учетную
 | ||
| запись<br />
 | ||
| <code>Search-ADAccount -LockedOut</code> найти все заблокированные
 | ||
| учетные записи<br />
 | ||
| <code>Search-ADAccount -AccountDisabled | select Name,LastLogonDate,Enabled</code>
 | ||
| отобразить все отключенные учетные записи с временем последнего
 | ||
| входа</p>
 | ||
| <p><code>Get-ADUser -Identity support4 -Properties PasswordLastSet,PasswordExpired,PasswordNeverExpires</code><br />
 | ||
| <code>PasswordLastSet</code> время последней смены пароля<br />
 | ||
| <code>PasswordExpired=False</code> пароль истек - нет<br />
 | ||
| <code>PasswordNeverExpires=True</code> срок действия пароля не истекает
 | ||
| - да<br />
 | ||
| <code>Set-ADAccountPassword support4 -Reset -NewPassword (ConvertTo-SecureString -AsPlainText "password" -Force -Verbose)</code>
 | ||
| изменить пароль учетной записи<br />
 | ||
| <code>Set-ADUser -Identity support4 -ChangePasswordAtLogon $True</code>
 | ||
| смена пароля при следующем входе в систему</p>
 | ||
| <p><code>$day = (Get-Date).adddays(-90)</code><br />
 | ||
| <code>Get-ADUser -filter {(passwordlastset -le $day)} | ft</code>
 | ||
| пользователи, которые не меняли свой пароль больше 90 дней</p>
 | ||
| <p><code>$day = (Get-Date).adddays(-30)</code><br />
 | ||
| <code>Get-ADUser -filter {(Created -ge $day)} -Property Created | select Name,Created</code>
 | ||
| Новые пользователи за 30 дней</p>
 | ||
| <p><code>$day = (Get-Date).adddays(-360)</code><br />
 | ||
| <code>Get-ADUser -Filter {(LastLogonTimestamp -le $day)} -Property LastLogonTimestamp | select Name,SamAccountName,@{n='LastLogonTimestamp';e={[DateTime]::FromFileTime($_.LastLogonTimestamp)}} | sort -Descending LastLogonTimestamp</code>
 | ||
| пользователи, которые не логинились больше 360 дней. Репликация атрибута
 | ||
| LastLogonTimestamp составляет от 9 до 14 дней.<br />
 | ||
| <code>| Disable-ADAccount $_.SamAccountName</code> заблокировать<br />
 | ||
| <code>-WhatIf</code> отобразить вывод без применения изменений</p>
 | ||
| <h3 id="adgroupmember">ADGroupMember</h3>
 | ||
| <p><code>(Get-ADUser -Identity support4 -Properties MemberOf).memberof</code>
 | ||
| список групп в которых состоит пользователь<br />
 | ||
| <code>Get-ADGroupMember -Identity "Domain Admins" | Select Name,SamAccountName</code>
 | ||
| список пользователей в группе<br />
 | ||
| <code>Add-ADGroupMember -Identity "Domain Admins" -Members support5</code>
 | ||
| добавить в группу<br />
 | ||
| <code>Remove-ADGroupMember -Identity "Domain Admins" -Members support5 -force</code>
 | ||
| удалить из группы<br />
 | ||
| <code>Get-ADGroup -filter * | where {!($_ | Get-ADGroupMember)} | Select Name</code>
 | ||
| отобразить список пустых групп (-Not)</p>
 | ||
| <h3 id="adreplication">ADReplication</h3>
 | ||
| <p><code>Get-Command -Module ActiveDirectory -Name *Replication*</code>
 | ||
| список всех командлетов модуля<br />
 | ||
| <code>Get-ADReplicationFailure -Target dc-01</code> список ошибок
 | ||
| репликации с партнерами<br />
 | ||
| <code>Get-ADReplicationFailure -Target $env:userdnsdomain -Scope Domain</code><br />
 | ||
| <code>Get-ADReplicationPartnerMetadata -Target dc-01 | select Partner,LastReplicationAttempt,LastReplicationSuccess,LastReplicationResult,LastChangeUsn</code>
 | ||
| время последней и время успешной репликации с партнерами<br />
 | ||
| <code>Get-ADReplicationUpToDatenessVectorTable -Target dc-01</code>
 | ||
| Update Sequence Number (USN) увеличивается каждый раз, когда на
 | ||
| контроллере домена происходит транзакция (операции создания, обновления
 | ||
| или удаления объекта), при репликации DC обмениваются значениями USN,
 | ||
| объект с более низким USN при репликации будет перезаписан высоким
 | ||
| USN.</p>
 | ||
| <h1 id="repadmin">repadmin</h1>
 | ||
| <p><code>repadmin /replsummary</code> отображает время последней
 | ||
| репликации на всех DC по направлению (Source и Destination) и их
 | ||
| состояние с учетом партнеров<br />
 | ||
| <code>repadmin /showrepl $srv</code> отображает всех партнеров по
 | ||
| реплкации и их статус для всех разделов Naming Contexts
 | ||
| (DC=ForestDnsZones, DC=DomainDnsZones, CN=Schema,
 | ||
| CN=Configuration)<br />
 | ||
| <code>repadmin /replicate $srv2 $srv1 DC=domain,DC=local</code>
 | ||
| выполнить репликацию с $srv1 на $srv2 только указанный раздела
 | ||
| домена<br />
 | ||
| <code>repadmin /SyncAll /AdeP</code> запустить межсайтовую исходящую
 | ||
| репликацию всех разделов от текущего сервера со всеми партнерами по
 | ||
| репликации<br />
 | ||
| <code>/A</code> выполнить для всех разделов NC<br />
 | ||
| <code>/d</code> в сообщениях идентифицировать серверы по DN (вместо GUID
 | ||
| DNS - глобальным уникальным идентификаторам)<br />
 | ||
| <code>/e</code> межсайтовая синхронизация (по умолчанию синхронизирует
 | ||
| только с DC текущего сайта)<br />
 | ||
| <code>/P</code> извещать об изменениях с этого сервера (по умолчанию:
 | ||
| опрашивать об изменениях)<br />
 | ||
| <code>repadmin /Queue $srv</code> отображает кол-во запросов входящей
 | ||
| репликации (очередь), которое необходимо обработать (причиной может быть
 | ||
| большое кол-во партнеров или формирование 1000 объектов скриптом)<br />
 | ||
| <code>repadmin /showbackup *</code> узнать дату последнего Backup</p>
 | ||
| <p><code>Error: 1722</code> сервер rpc недоступен (ошибка отката
 | ||
| репликации). Проверить имя домена в настройках сетевого адаптера, первым
 | ||
| должен идти адрес DNS-сервера другого контроллера домена, вторым свой
 | ||
| адрес.<br />
 | ||
| <code>Get-Service -ComputerName $srv | select name,status | ? name -like "RpcSs"</code><br />
 | ||
| <code>Get-Service -ComputerName $srv -Name RpcSs -RequiredServices</code>
 | ||
| зависимые службы<br />
 | ||
| Зависимые службы RPC:<br />
 | ||
| “Служба сведений о подключенных сетях” - должен быть включен отложенный
 | ||
| запуск. Если служба срабатывает до “службы списка сетей”, может падать
 | ||
| связь с доменом (netlogon)<br />
 | ||
| “Центр распространения ключей Kerberos”<br />
 | ||
| “DNS-сервер”<br />
 | ||
| <code>nslookup $srv</code><br />
 | ||
| <code>tnc $srv -p 135</code><br />
 | ||
| <code>repadmin /retry</code> повторить попытку привязки к целевому DC,
 | ||
| если была ошибка 1722 или 1753 (RPC недоступен)</p>
 | ||
| <p><code>repadmin /showrepl $srv</code><br />
 | ||
| <code>Last attempt @ 2022-07-15 10:46:01 завершена с ошибкой, результат 8456 (0x2108)</code>
 | ||
| при проверки showrepl этого партнера, его ошибка: 8457 (0x2109)<br />
 | ||
| <code>Last success @ 2022-07-11 02:29:46</code> последний успех<br />
 | ||
| Когда репликация автоматически отключена, ОС записывает в DSA - not
 | ||
| writable одно из четырех значений:<br />
 | ||
| <code>Path: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\NTDS\Parameters</code><br />
 | ||
| <code>Dsa Not Writable</code><br />
 | ||
| <code>#define DSA_WRITABLE_GEN 1</code> версия леса несовместима с
 | ||
| ОС<br />
 | ||
| <code>#define DSA_WRITABLE_NO_SPACE 2</code> на диске, где размещена
 | ||
| база данных Active Directory или файлы журналов (логи), недостаточно
 | ||
| свободного места<br />
 | ||
| <code>#define DSA_WRITABLE_USNROLLBCK 4</code> откат USN произошел из-за
 | ||
| неправильного отката базы данных Active Directory во времени
 | ||
| (восстановление из снапшота)<br />
 | ||
| <code>#define DSA_WRITABLE_CORRUPT_UTDV 8</code> вектор актуальности
 | ||
| поврежден на локальном контроллере домена</p>
 | ||
| <h1 id="dcdiag">dcdiag</h1>
 | ||
| <p><code>dcdiag /s:<DomainController> [/n:<NamingContext>] [[/u:<domain\user>] [/p:<password>]] [{/a|/e}{/q|/v}] [/f:<LogFile>] [/ferr:<ErrorLog>] [/test:<test>] [/fix]</code><br />
 | ||
| <code>dcdiag /Test:replications /s:dc-01</code> отображает ошибки
 | ||
| репликации<br />
 | ||
| <code>dcdiag /Test:DNS /e /v /q</code> тест DNS<br />
 | ||
| <code>/a</code> проверка всех серверов данного сайта<br />
 | ||
| <code>/e</code> проверка всех серверов предприятия<br />
 | ||
| <code>/q</code> выводить только сообщения об ошибках<br />
 | ||
| <code>/v</code> выводить подробную информацию<br />
 | ||
| <code>/fix</code> автоматически исправляет ошибки<br />
 | ||
| <code>/test:</code><br />
 | ||
| <code>NetLogons</code> проверка наличие прав на выполнение
 | ||
| репликации<br />
 | ||
| <code>Connectivity</code> проверяет регистрацию DNS для каждого
 | ||
| контроллера домена, отправляет тестовый эхо-пакет на каждый контроллер
 | ||
| домена и проверяет подключение по протоколам LDAP и RPC к каждому
 | ||
| контроллеру домена<br />
 | ||
| <code>Services</code> проверяет работоспособность всех служб,
 | ||
| необходимых для работы контроллера домена, на указанном контроллере
 | ||
| домена<br />
 | ||
| <code>Systemlog</code> проверяет наличие ошибок в журналах контроллера
 | ||
| домена<br />
 | ||
| <code>FRSEvent</code> проверяет ошибки репликации в работе службы
 | ||
| репликации файлов, что может означать наличие проблем в репликации
 | ||
| SYSVOL и, таким образом, целостности копий объектов групповых
 | ||
| политик<br />
 | ||
| <code>FSMOCheck</code> не проверяет роли хозяев операций, а вместо этого
 | ||
| запрашивает сервер глобального каталога, первичный контроллер домена,
 | ||
| предпочтительный сервер времени, сервер времени и центр распространения
 | ||
| ключей (контроллер домена может подключиться к KDC, PDC, серверу
 | ||
| глобального каталога)<br />
 | ||
| <code>KnowsOfRoleHolders</code> пgроверяет возможность подключения
 | ||
| контроллеров домена ко всем пяти хозяевам операций (ролями FSMO)<br />
 | ||
| <code>MachineAccount</code> проверяет правильность регистрации учетной
 | ||
| записи целевого компьютера и правильность объявлений служб этого
 | ||
| компьютера (корректность доверительных отношения с доменом). Если
 | ||
| обнаружена ошибка, ее можно исправить с помощью утилиты dcdiag, указав
 | ||
| параметры /fixmachineaccount или /recreatemachineaccount<br />
 | ||
| <code>Advertising</code> проверяет, правильно ли контроллер домена
 | ||
| сообщает о себе и о своей роли хозяина операций. Этот тест завершиться
 | ||
| неудачно, если служба NetLogon не запущена<br />
 | ||
| <code>CheckSDRefDom</code> проверяет правильность доменов ссылок
 | ||
| дескрипторов безопасности для каждого раздела каталогов программ<br />
 | ||
| <code>CrossRefValidation</code> проверяет правильность перекрестных
 | ||
| ссылок для доменов<br />
 | ||
| <code>RRSSysvol</code> проверяет состояние готовности для FRS
 | ||
| SYSVOL<br />
 | ||
| <code>Intersite</code> проверяет наличие ошибок, которые могут помешать
 | ||
| нормальной репликации между сайтами. Компания Microsoft предупреждает,
 | ||
| что иногда результаты этого теста могут оказаться неточными<br />
 | ||
| <code>KCCEvent</code> проверяет безошибочность создания объектов
 | ||
| соединений для репликации между сайтами<br />
 | ||
| <code>NCSecDesc</code> проверяет правильность разрешений для репликации
 | ||
| в дескрипторах безопасности для заголовков контекста именования<br />
 | ||
| <code>ObjectsReplicated</code> проверяет правильность репликации агента
 | ||
| сервера каталогов и объектов учетных записей компьютеров<br />
 | ||
| <code>OutboundSecureChannels</code> проверяется наличие безопасных
 | ||
| каналов между всеми контроллерами домена в интересующем домене<br />
 | ||
| <code>Replications</code> проверяет возможность репликации между
 | ||
| контроллерами домена и сообщает обо всех ошибках при репликации<br />
 | ||
| <code>RidManager</code> проверяет работоспособность и доступность
 | ||
| хозяина относительных идентификаторов<br />
 | ||
| <code>VerifyEnterpriseReferences</code> проверяет действительность
 | ||
| системных ссылок службы репликации файлов для всех объектов на всех
 | ||
| контроллерах домена в лесу<br />
 | ||
| <code>VerifyReferences</code> проверяет действительность системных
 | ||
| ссылок службы репликации файлов для всех объектов на указанном
 | ||
| контроллере домена<br />
 | ||
| <code>VerifyReplicas</code> проверяет действительность всех разделов
 | ||
| каталога приложения на всех серверах, принимающих участие в
 | ||
| репликации</p>
 | ||
| <h1 id="ntdsutil">ntdsutil</h1>
 | ||
| <p>Перенос БД AD (ntds.dit):<br />
 | ||
| <code>Get-Acl C:\Windows\NTDS | Set-Acl D:\AD-DB</code> скопировать NTFS
 | ||
| разрешения на новый каталог<br />
 | ||
| <code>Stop-Service -ComputerName dc -name NTDS</code> остановить службу
 | ||
| Active Directory Domain Services<br />
 | ||
| <code>ntdsutil</code> запустить утилиту ntdsutil<br />
 | ||
| <code>activate instance NTDS</code> выбрать активный экземпляр базы
 | ||
| AD<br />
 | ||
| <code>files</code> перейдем в контекст files, в котором возможно
 | ||
| выполнение операция с файлами базы ntds.dit<br />
 | ||
| <code>move DB to D:\AD-DB\</code> перенести базу AD в новый каталог
 | ||
| (предварительно нужно его создать)<br />
 | ||
| <code>info</code> проверить, что БД находится в новом каталоге<br />
 | ||
| <code>move logs to D:\AD-DB\</code> переместим в тот же каталог файлы с
 | ||
| журналами транзакций<br />
 | ||
| <code>quit</code><br />
 | ||
| <code>Start-Service -ComputerName dc -name NTDS</code></p>
 | ||
| <p>Сброс пароля DSRM (режим восстановления служб каталогов):<br />
 | ||
| <code>ntdsutil</code><br />
 | ||
| <code>set dsrm password</code><br />
 | ||
| <code>reset password on server NULL</code><br />
 | ||
| новый пароль<br />
 | ||
| подтверждение пароля<br />
 | ||
| <code>quit</code><br />
 | ||
| <code>quit</code></p>
 | ||
| <p>Синхронизировать с паролем УЗ в AD:<br />
 | ||
| <code>ntdsutil</code><br />
 | ||
| <code>set dsrm password</code><br />
 | ||
| <code>sync from domain account dsrmadmin</code><br />
 | ||
| <code>quit</code><br />
 | ||
| <code>quit</code></p>
 | ||
| <p>Ошибка 0x00002e2 при загрузке ОС.<br />
 | ||
| Загрузиться в режиме восстанавления WinRE (Windows Recovery Environment)
 | ||
| - Startup Settings - Restart - DSRM (Directory Services Restore
 | ||
| Mode)<br />
 | ||
| <code>reagentc /boottore</code> shutdown /f /r /o /t 0 перезагрузка в
 | ||
| режиме WinRE - ОС на базе WinPE (Windows Preinstallation Environment),
 | ||
| образ winre.wim находится на скрытом разделе System Restore<br />
 | ||
| На контроллере домена единственная локальная учетная запись —
 | ||
| администратор DSRM. Пароль создается при установке роли контроллера
 | ||
| домена ADDS на сервере (SafeModeAdministratorPassword).<br />
 | ||
| <code>ntdsutil</code><br />
 | ||
| <code>activate instance ntds</code><br />
 | ||
| <code>Files</code><br />
 | ||
| <code>Info</code><br />
 | ||
| <code>integrity</code> проверить целостность БД<br />
 | ||
| Ошибка: Failed to open DIT for AD DS/LDS instance NTDS. Error
 | ||
| -2147418113<br />
 | ||
| <code>mkdir c:\ntds_bak</code><br />
 | ||
| <code>xcopy c:\Windows\NTDS\*.* c:\ntds_bak</code> backup содержимого
 | ||
| каталога с БД<br />
 | ||
| <code>esentutl /g c:\windows\ntds\ntds.dit</code> проверим целостность
 | ||
| файла<br />
 | ||
| Вывод: Integrity check completed. Database is CORRUPTED ошибка, база AD
 | ||
| повреждена<br />
 | ||
| <code>esentutl /p c:\windows\ntds\ntds.dit</code> исправить ошибки<br />
 | ||
| Вывод: Operation completed successfully in xx seconds. нет ошибок<br />
 | ||
| <code>esentutl /g c:\windows\ntds\ntds.dit</code> проверим целостность
 | ||
| файла<br />
 | ||
| Выполнить анализ семантики базы с помощью ntdsutil:<br />
 | ||
| <code>ntdsutil</code><br />
 | ||
| <code>activate instance ntds</code><br />
 | ||
| <code>semantic database analysis</code><br />
 | ||
| <code>go</code><br />
 | ||
| <code>go fixup</code> исправить семантические ошибки<br />
 | ||
| Сжать файл БД:<br />
 | ||
| <code>activate instance ntds</code><br />
 | ||
| <code>files</code><br />
 | ||
| <code>compact to C:\Windows\NTDS\TEMP</code><br />
 | ||
| <code>copy C:\Windows\NTDS\TEMP\ntds.dit C:\Windows\NTDS\ntds.dit</code>
 | ||
| заменить оригинальный файл ntds.dit<br />
 | ||
| <code>Del C:\Windows\NTDS\*.log</code> удалить все лог файлы из каталога
 | ||
| NTDS</p>
 | ||
| <h1 id="gpo">GPO</h1>
 | ||
| <p><code>Get-Command -Module GroupPolicy</code><br />
 | ||
| <code>Get-GPO -Domain domain.local -All | ft</code><br />
 | ||
| <code>Get-GPO -Name LAPS</code><br />
 | ||
| <code>[xml](Get-GPOReport LAPS -ReportType Xml)</code><br />
 | ||
| <code>Get-GPPermission -Name LAPS -All</code><br />
 | ||
| <code>Get-GPO LAPS | New-GPLink -Target "ou=servers,dc=domain,dc=local"</code><br />
 | ||
| <code>Set-GPLink -Name LAPS -Target "ou=servers,dc=domain,dc=local" -LinkEnabled No</code><br />
 | ||
| <code>Backup-GPO -Name LAPS -Path "$home\Desktop"</code><br />
 | ||
| <code>Backup-GPO -All -Path "$home\Desktop"</code><br />
 | ||
| <code>Restore-GPO -Name LAPS -Path C:\Backup\GPOs\</code></p>
 | ||
| <h1 id="servermanager">ServerManager</h1>
 | ||
| <p><code>Get-Command *WindowsFeature*</code> source module
 | ||
| ServerManager<br />
 | ||
| <code>Get-WindowsFeature -ComputerName "localhost"</code><br />
 | ||
| <code>Get-WindowsFeature | where Installed -eq $True</code> список
 | ||
| установленных ролей и компонентов<br />
 | ||
| <code>Get-WindowsFeature | where FeatureType -eq "Role"</code>
 | ||
| отсортировать по списку ролей<br />
 | ||
| <code>Install-WindowsFeature -Name DNS</code> установить роль<br />
 | ||
| <code>Get-Command *DNS*</code><br />
 | ||
| <code>Get-DnsServerSetting -ALL</code><br />
 | ||
| <code>Uninstall-WindowsFeature -Name DNS</code> удалить роль</p>
 | ||
| <h3 id="pswa">PSWA</h3>
 | ||
| <p><code>Install-WindowsFeature -Name WindowsPowerShellWebAccess -IncludeManagementTools</code><br />
 | ||
| <code>Install-PswaWebApplication -UseTestCertificate</code> Создать
 | ||
| веб-приложение /pswa<br />
 | ||
| <code>Add-PswaAuthorizationRule -UserGroupName "$domain\Domain Admins" -ComputerName * -ConfigurationName * -RuleName "For Admins"</code>
 | ||
| добавить права авторизации</p>
 | ||
| <h3 id="wsb-windows-server-backup">WSB (Windows Server Backup)</h3>
 | ||
| <p>При создании backup DC через WSB, создается копия состояния системы
 | ||
| (System State), куда попадает база AD (NTDS.DIT), объекты групповых
 | ||
| политик, содержимое каталога SYSVOL, реестр, метаданные IIS, база AD CS,
 | ||
| и другие системные файлы и ресурсы. Резервная копия создается через
 | ||
| службу теневого копирования VSS.<br />
 | ||
| <code>Get-WindowsFeature Windows-Server-Backup</code> проверить
 | ||
| установлена ли роль<br />
 | ||
| <code>Add-Windowsfeature Windows-Server-Backup –Includeallsubfeature</code>
 | ||
| установить роль</p>
 | ||
| <div class="sourceCode" id="cb29"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb29-1"><a href="#cb29-1" aria-hidden="true" tabindex="-1"></a><span class="va">$path</span><span class="op">=</span><span class="st">"\\</span><span class="va">$srv</span><span class="st">\bak-dc\dc-03\"</span></span>
 | ||
| <span id="cb29-2"><a href="#cb29-2" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$TargetUNC</span><span class="op">=</span><span class="va">$path</span><span class="op">+(</span><span class="fu">get-date</span> <span class="op">-</span>f <span class="st">'yyyy-MM-dd'</span><span class="op">)</span></span>
 | ||
| <span id="cb29-3"><a href="#cb29-3" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">((</span><span class="fu">Test-Path</span> <span class="op">-</span>Path <span class="va">$path</span><span class="op">)</span> <span class="op">-eq</span> <span class="va">$true</span><span class="op">)</span> <span class="op">{</span><span class="fu">New-Item</span> <span class="op">-</span>Path <span class="va">$TargetUNC</span> <span class="op">-</span>ItemType directory<span class="op">}</span> <span class="co"># если путь доступен, создать новую директорию по дате</span></span>
 | ||
| <span id="cb29-4"><a href="#cb29-4" aria-hidden="true" tabindex="-1"></a><span class="va">$WBadmin_cmd</span> <span class="op">=</span> <span class="st">"wbadmin.exe START BACKUP -backupTarget:</span><span class="va">$TargetUNC</span><span class="st"> -systemState -noverify -vssCopy -quiet"</span></span>
 | ||
| <span id="cb29-5"><a href="#cb29-5" aria-hidden="true" tabindex="-1"></a><span class="co"># $WBadmin_cmd = "wbadmin start backup -backuptarget:$path -include:C:\Windows\NTDS\ntds.dit -quiet" # Backup DB NTDS</span></span>
 | ||
| <span id="cb29-6"><a href="#cb29-6" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-Expression</span> <span class="va">$WBadmin_cmd</span></span></code></pre></div>
 | ||
| <h3 id="rds">RDS</h3>
 | ||
| <p><code>Get-Command -Module RemoteDesktop</code><br />
 | ||
| <code>Get-RDServer -ConnectionBroker $broker</code> список всех серверов
 | ||
| в фермеы, указывается полное доменное имя при обращение к серверу с
 | ||
| ролью RDCB<br />
 | ||
| <code>Get-RDRemoteDesktop -ConnectionBroker $broker</code> список
 | ||
| коллекций<br />
 | ||
| <code>(Get-RDLicenseConfiguration -ConnectionBroker $broker | select *).LicenseServer</code>
 | ||
| список серверов с ролью RDL<br />
 | ||
| <code>Get-RDUserSession -ConnectionBroker $broker</code> список всех
 | ||
| активных пользователей<br />
 | ||
| <code>Disconnect-RDUser -HostServer $srv -UnifiedSessionID $id -Force</code>
 | ||
| отключить сессию пользователя<br />
 | ||
| <code>Get-RDAvailableApp -ConnectionBroker $broker -CollectionName C03</code>
 | ||
| список установленного ПО на серверах в коллекции<br />
 | ||
| <code>(Get-RDSessionCollectionConfiguration -ConnectionBroker $broker -CollectionName C03 | select *).CustomRdpProperty</code>
 | ||
| use redirection server name:i:1<br />
 | ||
| <code>Get-RDConnectionBrokerHighAvailability</code></p>
 | ||
| <h1 id="dnsserver">DNSServer</h1>
 | ||
| <p><code>Get-Command -Module DnsServer</code><br />
 | ||
| <code>Show-DnsServerCache</code> отобразить весь кэш DNS-сервера<br />
 | ||
| <code>Show-DnsServerCache | where HostName -match ru</code><br />
 | ||
| <code>Clear-DnsServerCache</code><br />
 | ||
| <code>Get-DnsServerCache</code><br />
 | ||
| <code>Get-DnsServerDiagnostics</code></p>
 | ||
| <div class="sourceCode" id="cb30"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb30-1"><a href="#cb30-1" aria-hidden="true" tabindex="-1"></a><span class="va">$zone</span> <span class="op">=</span> <span class="fu">icm</span> <span class="va">$srv</span> <span class="op">{</span>Get-DnsServerZone<span class="op">}</span> <span class="op">|</span> <span class="fu">select</span> ZoneName<span class="op">,</span>ZoneType<span class="op">,</span>DynamicUpdate<span class="op">,</span>ReplicationScope<span class="op">,</span>SecureSecondaries<span class="op">,</span></span>
 | ||
| <span id="cb30-2"><a href="#cb30-2" aria-hidden="true" tabindex="-1"></a>DirectoryPartitionName <span class="op">|</span> <span class="fu">Out-GridView</span> <span class="op">-</span>Title <span class="st">"DNS Server: </span><span class="va">$srv</span><span class="st">"</span> –PassThru</span>
 | ||
| <span id="cb30-3"><a href="#cb30-3" aria-hidden="true" tabindex="-1"></a><span class="va">$zone_name</span> <span class="op">=</span> <span class="va">$zone</span><span class="op">.</span><span class="fu">ZoneName</span></span>
 | ||
| <span id="cb30-4"><a href="#cb30-4" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$zone_name</span> <span class="op">-ne</span> <span class="va">$null</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb30-5"><a href="#cb30-5" aria-hidden="true" tabindex="-1"></a><span class="fu">icm</span> <span class="va">$srv</span> <span class="op">{</span>Get-DnsServerResourceRecord <span class="op">-</span>ZoneName <span class="va">$using</span><span class="op">:</span><span class="va">zone_name</span> <span class="op">|</span> <span class="fu">sort</span> RecordType <span class="op">|</span> <span class="fu">select</span> RecordType<span class="op">,</span>HostName<span class="op">,</span> @<span class="op">{</span></span>
 | ||
| <span id="cb30-6"><a href="#cb30-6" aria-hidden="true" tabindex="-1"></a>Label<span class="op">=</span><span class="st">"IPAddress"</span><span class="op">;</span> Expression<span class="op">={</span><span class="va">$_</span><span class="op">.</span><span class="fu">RecordData</span><span class="op">.</span><span class="fu">IPv4Address</span><span class="op">.</span><span class="fu">IPAddressToString</span><span class="op">}},</span>TimeToLive<span class="op">,</span>Timestamp</span>
 | ||
| <span id="cb30-7"><a href="#cb30-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">|</span> <span class="fu">select</span> RecordType<span class="op">,</span>HostName<span class="op">,</span>IPAddress<span class="op">,</span>TimeToLive<span class="op">,</span>Timestamp <span class="op">|</span> <span class="fu">Out-GridView</span> <span class="op">-</span>Title <span class="st">"DNS Server: </span><span class="va">$srv</span><span class="st">"</span></span>
 | ||
| <span id="cb30-8"><a href="#cb30-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>Sync-DnsServerZone –passthru</code> синхронизировать зоны с
 | ||
| другими DC в домене<br />
 | ||
| <code>Remove-DnsServerZone -Name domain.local</code> удалить зону<br />
 | ||
| <code>Get-DnsServerResourceRecord -ZoneName domain.local -RRType A</code>
 | ||
| вывести все А-записи в указанной зоне<br />
 | ||
| <code>Add-DnsServerResourceRecordA -Name new-host-name -IPv4Address 192.168.1.100 -ZoneName domain.local -TimeToLive 01:00:00 -CreatePtr</code>
 | ||
| создать А-запись и PTR для нее<br />
 | ||
| <code>Remove-DnsServerResourceRecord -ZoneName domain.local -RRType A -Name new-host-name –Force</code>
 | ||
| удалить А-запись</p>
 | ||
| <div class="sourceCode" id="cb31"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb31-1"><a href="#cb31-1" aria-hidden="true" tabindex="-1"></a><span class="va">$DNSServer</span> <span class="op">=</span> <span class="st">"DC-01"</span></span>
 | ||
| <span id="cb31-2"><a href="#cb31-2" aria-hidden="true" tabindex="-1"></a><span class="va">$DNSFZone</span> <span class="op">=</span> <span class="st">"domain.com"</span></span>
 | ||
| <span id="cb31-3"><a href="#cb31-3" aria-hidden="true" tabindex="-1"></a><span class="va">$DataFile</span> <span class="op">=</span> <span class="st">"C:\Scripts\DNS-Create-A-Records-from-File.csv"</span></span>
 | ||
| <span id="cb31-4"><a href="#cb31-4" aria-hidden="true" tabindex="-1"></a><span class="co"># cat $DataFile</span></span>
 | ||
| <span id="cb31-5"><a href="#cb31-5" aria-hidden="true" tabindex="-1"></a><span class="co"># "HostName;IP"</span></span>
 | ||
| <span id="cb31-6"><a href="#cb31-6" aria-hidden="true" tabindex="-1"></a><span class="co"># "server-01;192.168.1.10"</span></span>
 | ||
| <span id="cb31-7"><a href="#cb31-7" aria-hidden="true" tabindex="-1"></a><span class="va">$DNSRR</span> <span class="op">=</span> <span class="op">[</span>WmiClass<span class="op">]</span><span class="st">"\\</span><span class="va">$DNSServer</span><span class="st">\root\MicrosoftDNS:MicrosoftDNS_ResourceRecord"</span></span>
 | ||
| <span id="cb31-8"><a href="#cb31-8" aria-hidden="true" tabindex="-1"></a><span class="va">$ConvFile</span> <span class="op">=</span> <span class="va">$DataFile</span> <span class="op">+</span> <span class="st">"_unicode"</span></span>
 | ||
| <span id="cb31-9"><a href="#cb31-9" aria-hidden="true" tabindex="-1"></a><span class="fu">Get-Content</span> <span class="va">$DataFile</span> <span class="op">|</span> <span class="fu">Set-Content</span> <span class="va">$ConvFile</span> <span class="op">-</span>Encoding Unicode</span>
 | ||
| <span id="cb31-10"><a href="#cb31-10" aria-hidden="true" tabindex="-1"></a><span class="fu">Import-CSV</span> <span class="va">$ConvFile</span> <span class="op">-</span>Delimiter <span class="st">";"</span> <span class="op">|</span> <span class="fu">ForEach-Object</span> <span class="op">{</span></span>
 | ||
| <span id="cb31-11"><a href="#cb31-11" aria-hidden="true" tabindex="-1"></a><span class="va">$FQDN</span> <span class="op">=</span> <span class="va">$_</span><span class="op">.</span><span class="fu">HostName</span> <span class="op">+</span> <span class="st">"."</span> <span class="op">+</span> <span class="va">$DNSFZone</span></span>
 | ||
| <span id="cb31-12"><a href="#cb31-12" aria-hidden="true" tabindex="-1"></a><span class="va">$IP</span> <span class="op">=</span> <span class="va">$_</span><span class="op">.</span><span class="fu">HostIP</span></span>
 | ||
| <span id="cb31-13"><a href="#cb31-13" aria-hidden="true" tabindex="-1"></a><span class="va">$TextA</span> <span class="op">=</span> <span class="st">"</span><span class="va">$FQDN</span><span class="st"> IN A </span><span class="va">$IP</span><span class="st">"</span></span>
 | ||
| <span id="cb31-14"><a href="#cb31-14" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Void<span class="op">]</span><span class="va">$DNSRR</span><span class="op">.</span><span class="fu">CreateInstanceFromTextRepresentation</span><span class="op">(</span><span class="va">$DNSServer</span><span class="op">,</span><span class="va">$DNSFZone</span><span class="op">,</span><span class="va">$TextA</span><span class="op">)</span></span>
 | ||
| <span id="cb31-15"><a href="#cb31-15" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <h1 id="dhcpserver">DHCPServer</h1>
 | ||
| <p><code>Get-Command -Module DhcpServer</code></p>
 | ||
| <div class="sourceCode" id="cb32"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb32-1"><a href="#cb32-1" aria-hidden="true" tabindex="-1"></a><span class="va">$mac</span> <span class="op">=</span> <span class="fu">icm</span> <span class="va">$srv</span> <span class="op">-</span>ScriptBlock <span class="op">{</span>Get-DhcpServerv4Scope <span class="op">|</span> Get-DhcpServerv4Lease<span class="op">}</span> <span class="op">|</span> <span class="fu">select</span> AddressState<span class="op">,</span></span>
 | ||
| <span id="cb32-2"><a href="#cb32-2" aria-hidden="true" tabindex="-1"></a>HostName<span class="op">,</span>IPAddress<span class="op">,</span>ClientId<span class="op">,</span>DnsRegistration<span class="op">,</span>DnsRR<span class="op">,</span>ScopeId<span class="op">,</span>ServerIP <span class="op">|</span> <span class="fu">Out-GridView</span> <span class="op">-</span>Title <span class="st">"HDCP Server: </span><span class="va">$srv</span><span class="st">"</span> –PassThru</span>
 | ||
| <span id="cb32-3"><a href="#cb32-3" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="fu">New-Object</span> <span class="op">-</span>ComObject Wscript<span class="op">.</span><span class="fu">Shell</span><span class="op">).</span><span class="fu">Popup</span><span class="op">(</span><span class="va">$mac</span><span class="op">.</span><span class="fu">ClientId</span><span class="op">,</span><span class="dv">0</span><span class="op">,</span><span class="va">$mac</span><span class="op">.</span><span class="fu">HostName</span><span class="op">,</span><span class="dv">64</span><span class="op">)</span></span></code></pre></div>
 | ||
| <p><code>Add-DhcpServerv4Reservation -ScopeId 192.168.1.0 -IPAddress 192.168.1.10 -ClientId 00-50-56-C0-00-08 -Description "new reservation"</code></p>
 | ||
| <h1 id="dfs">DFS</h1>
 | ||
| <p><code>dfsutil /root:\\domain.sys\public /export:C:\export-dfs.txt</code>
 | ||
| экспорт конфигурации namespace root<br />
 | ||
| <code>dfsutil /AddFtRoot /Server:\\$srv /Share:public</code> на новой
 | ||
| машине предварительно создать корень на основе домена<br />
 | ||
| <code>dfsutil /root:\\domain.sys\public /import:C:\export-dfs.txt /<verify /set</code>
 | ||
| Import (перед импортом данных в существующий корень DFS, утилита создает
 | ||
| резервную копию конфигурации корня в текущем каталоге, из которого
 | ||
| запускается утилита dfsutil)<br />
 | ||
| <code>/verify</code> выводит изменения, которые будут внесены в процессе
 | ||
| импорта, без применения<br />
 | ||
| <code>/set</code> меняет целевое пространство имен путем полной
 | ||
| перезаписи и замены на конфигурацию пространства имен из импортируемого
 | ||
| файла<br />
 | ||
| <code>/merge</code> импортирует конфигурацию пространства имен в
 | ||
| дополнение к существующей конфигурации для слияния, параметры из файла
 | ||
| конфигурации будут иметь больший приоритет, чем существующие параметры
 | ||
| пространства имен</p>
 | ||
| <p><code>Export-DfsrClone</code> экспортирует клонированную базу данных
 | ||
| репликации DFS и параметры конфигурации тома<br />
 | ||
| <code>Get-DfsrCloneState</code> получает состояние операции клонирования
 | ||
| базы данных<br />
 | ||
| <code>Import-DfsrClone</code> импортирует клонированную базу данных
 | ||
| репликации DFS и параметры конфигурации тома</p>
 | ||
| <p><code>net use x: \\$srv1\public\*</code> примонтировать диск<br />
 | ||
| <code>Get-DfsrFileHash x:\* | Out-File C:\$srv1.txt</code> забрать hash
 | ||
| всех файлов диска в файл (файлы с одинаковыми хешами всегда являются
 | ||
| точными копиями друг друга)<br />
 | ||
| <code>net use x: /d</code> отмонтировать<br />
 | ||
| <code>net use x: \\$srv2\public\*</code><br />
 | ||
| <code>Get-DfsrFileHash x:\* | Out-File C:\$srv2.txt</code><br />
 | ||
| <code>net use x: /d</code><br />
 | ||
| <code>Compare-Object -ReferenceObject (Get-Content C:\$srv1.txt) -DifferenceObject (Get-Content C:\$srv2.txt) -IncludeEqual</code>
 | ||
| сравнить содержимое файлов</p>
 | ||
| <p><code>Get-DfsrBacklog -DestinationComputerName "fs-06" -SourceComputerName "fs-05" -GroupName "folder-rep" -FolderName "folder" -Verbose</code>
 | ||
| получает список ожидающих обновлений файлов между двумя партнерами
 | ||
| репликации DFS<br />
 | ||
| <code>Get-DfsrConnection</code> отображает группы репликации, участников
 | ||
| и статус<br />
 | ||
| <code>Get-DfsReplicatedFolder</code> отображает имя и полный путь к
 | ||
| папкам реликации в системе DFS<br />
 | ||
| <code>Get-DfsrState -ComputerName fs-06 -Verbose</code> состояние
 | ||
| репликации DFS для члена группы<br />
 | ||
| <code>Get-DfsReplicationGroup</code> отображает группы репликации и их
 | ||
| статус<br />
 | ||
| <code>Add-DfsrConnection</code> создает соединение между членами группы
 | ||
| репликации<br />
 | ||
| <code>Add-DfsrMember</code> добавляет компьютеры в группу
 | ||
| репликации<br />
 | ||
| <code>ConvertFrom-DfsrGuid</code> преобразует идентификаторы GUID в
 | ||
| понятные имена в заданной группы репликации<br />
 | ||
| <code>Get-DfsrConnectionSchedule</code> получает расписание соединений
 | ||
| между членами группы репликации<br />
 | ||
| <code>Get-DfsrGroupSchedule</code> извлекает расписание группы
 | ||
| репликации<br />
 | ||
| <code>Get-DfsrIdRecord</code> получает записи ID для реплицированных
 | ||
| файлов или папок из базы данных репликации DFS<br />
 | ||
| <code>Get-DfsrMember</code> получает компьютеры в группе
 | ||
| репликации<br />
 | ||
| <code>Get-DfsrMembership</code> получает параметры членства для членов
 | ||
| групп репликации<br />
 | ||
| <code>Get-DfsrPreservedFiles</code> получает список файлов и папок,
 | ||
| ранее сохраненных репликацией DFS<br />
 | ||
| <code>Get-DfsrServiceConfiguration</code> получает параметры службы
 | ||
| репликации DFS для членов группы<br />
 | ||
| <code>Grant-DfsrDelegation</code> предоставляет разрешения участникам
 | ||
| безопасности для группы репликации<br />
 | ||
| <code>Revoke-DfsrDelegation</code> отменяет разрешения участников
 | ||
| безопасности для группы репликации<br />
 | ||
| <code>New-DfsReplicationGroup</code> создает группу репликации<br />
 | ||
| <code>New-DfsReplicatedFolder</code> создает реплицированную папку в
 | ||
| группе репликации<br />
 | ||
| <code>Remove-DfsrConnection</code> удаляет соединение между членами
 | ||
| группы репликации<br />
 | ||
| <code>Remove-DfsReplicatedFolder</code> удаляет реплицированную папку из
 | ||
| группы репликации<br />
 | ||
| <code>Remove-DfsReplicationGroup</code> удаляет группу репликации<br />
 | ||
| <code>Remove-DfsrMember</code> удаляет компьютеры из группы
 | ||
| репликации<br />
 | ||
| <code>Restore-DfsrPreservedFiles</code> восстанавливает файлы и папки,
 | ||
| ранее сохраненные репликацией DFS<br />
 | ||
| <code>Set-DfsrConnection</code> изменяет параметры соединения между
 | ||
| членами группы репликации<br />
 | ||
| <code>Set-DfsrConnectionSchedule</code> изменяет параметры расписания
 | ||
| соединений между членами группы репликации<br />
 | ||
| <code>Set-DfsReplicatedFolder</code> изменяет настройки реплицированной
 | ||
| папки<br />
 | ||
| <code>Set-DfsReplicationGroup</code> изменяет группу репликации<br />
 | ||
| <code>Set-DfsrGroupSchedule</code> изменяет расписание группы
 | ||
| репликации<br />
 | ||
| <code>Set-DfsrMember</code> изменяет информацию о компьютере-участнике в
 | ||
| группе репликации<br />
 | ||
| <code>Set-DfsrMembership</code> настраивает параметры членства для
 | ||
| членов группы репликации<br />
 | ||
| <code>Set-DfsrServiceConfiguration</code> изменяет параметры службы
 | ||
| репликации DFS<br />
 | ||
| <code>Sync-DfsReplicationGroup</code> синхронизирует репликацию между
 | ||
| компьютерами независимо от расписания<br />
 | ||
| <code>Suspend-DfsReplicationGroup</code> приостанавливает репликацию
 | ||
| между компьютерами независимо от расписания<br />
 | ||
| <code>Update-DfsrConfigurationFromAD</code> инициирует обновление службы
 | ||
| репликации DFS<br />
 | ||
| <code>Write-DfsrHealthReport</code> создает отчет о работоспособности
 | ||
| репликации DFS<br />
 | ||
| <code>Write-DfsrPropagationReport</code> создает отчеты для тестовых
 | ||
| файлов распространения в группе репликации<br />
 | ||
| <code>Start-DfsrPropagationTest</code> создает тестовый файл
 | ||
| распространения в реплицированной папке</p>
 | ||
| <h1 id="storagereplica">StorageReplica</h1>
 | ||
| <p><code>Install-WindowsFeature Storage-Replica –IncludeManagementTools -Restart</code><br />
 | ||
| <code>Get-Command -Module StorageReplica</code><br />
 | ||
| <code>Test-SRTopology</code> проверить соответствует ли сервер и канал
 | ||
| связи технологии Storage Replica<br />
 | ||
| <code>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</code><br />
 | ||
| <code>Get-Counter -Counter "\Storage Replica Statistics(*)"</code><br />
 | ||
| <code>Get-WinEvent -ProviderName Microsoft-Windows-StorageReplica -max 10</code><br />
 | ||
| <code>Set-SRPartnership -ReplicationMode Asynchronous</code> переключить
 | ||
| режим репликации на асинхронный<br />
 | ||
| <code>Set-SRPartnership -NewSourceComputerName srv-02 -SourceRGName srv-02-rep-group-01 -DestinationComputerName srv-01 -DestinationRGName srv-01-rep-group-01</code>
 | ||
| изменить вручную направление репликации данных, переведя вторичную копию
 | ||
| в онлайн режим (при выходе из строя основного сервера)<br />
 | ||
| <code>Get-SRGroup</code> информация о состояние группы реплизации<br />
 | ||
| <code>Get-SRPartnerShip</code> информация о направлении репликации<br />
 | ||
| <code>(Get-SRGroup).Replicas | Select-Object numofbytesremaining</code>
 | ||
| проверить длину очереди копирования<br />
 | ||
| <code>Get-SRPartnership | Remove-SRPartnership</code> удалить реплизацию
 | ||
| на основном сервере<br />
 | ||
| <code>Get-SRGroup | Remove-SRGroup</code> удалить реплизацию на обоих
 | ||
| серверах</p>
 | ||
| <h1 id="ps2exe">PS2EXE</h1>
 | ||
| <p><code>Install-Module ps2exe -Repository PSGallery</code><br />
 | ||
| <code>Get-Module -ListAvailable</code> список всех модулей<br />
 | ||
| <code>-noConsole</code> использовать GUI, без окна консоли
 | ||
| powershell<br />
 | ||
| <code>-noOutput</code> выполнение в фоне<br />
 | ||
| <code>-noError</code> без вывода ошибок<br />
 | ||
| <code>-requireAdmin</code> при запуске запросить права
 | ||
| администратора<br />
 | ||
| <code>-credentialGUI</code> вывод диалогового окна для ввода учетных
 | ||
| данных<br />
 | ||
| <code>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</code></p>
 | ||
| <h1 id="nssm">NSSM</h1>
 | ||
| <p><code>$powershell_Path = (Get-Command powershell).Source</code><br />
 | ||
| <code>$NSSM_Path = (Get-Command "C:\WinPerf-Agent\NSSM-2.24.exe").Source</code><br />
 | ||
| <code>$Script_Path = "C:\WinPerf-Agent\WinPerf-Agent-1.1.ps1"</code><br />
 | ||
| <code>$Service_Name = "WinPerf-Agent"</code><br />
 | ||
| <code>& $NSSM_Path install $Service_Name $powershell_Path -ExecutionPolicy Bypass -NoProfile -f $Script_Path</code>
 | ||
| создать Service<br />
 | ||
| <code>& $NSSM_Path start $Service_Name</code> запустить<br />
 | ||
| <code>& $NSSM_Path status $Service_Name</code> статус<br />
 | ||
| <code>$Service_Name | Restart-Service</code> перезапустить<br />
 | ||
| <code>$Service_Name | Get-Service</code> статус<br />
 | ||
| <code>$Service_Name | Stop-Service</code> остановить<br />
 | ||
| <code>& $NSSM_Path set $Service_Name description "Check performance CPU and report email"</code>
 | ||
| изменить описание<br />
 | ||
| <code>& $NSSM_Path remove $Service_Name</code> удалить</p>
 | ||
| <h1 id="jobs">Jobs</h1>
 | ||
| <p><code>Get-Job</code> получение списка задач<br />
 | ||
| <code>Start-Job</code> запуск процесса<br />
 | ||
| <code>Stop-Job</code> остановка процесса<br />
 | ||
| <code>Suspend-Job</code> приостановка работы процесса<br />
 | ||
| <code>Resume-Job</code> восстановление работы процесса<br />
 | ||
| <code>Wait-Job</code> ожидание вывода команды<br />
 | ||
| <code>Receive-Job</code> получение результатов выполненного
 | ||
| процесса<br />
 | ||
| <code>Remove-Job</code> удалить задачу</p>
 | ||
| <div class="sourceCode" id="cb33"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb33-1"><a href="#cb33-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Start-PingJob <span class="op">(</span><span class="va">$Network</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb33-2"><a href="#cb33-2" aria-hidden="true" tabindex="-1"></a><span class="va">$RNetwork</span> <span class="op">=</span> <span class="va">$Network</span> <span class="op">-replace</span> <span class="st">"\.\d{1,3}$"</span><span class="op">,</span><span class="st">"."</span></span>
 | ||
| <span id="cb33-3"><a href="#cb33-3" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span>$<span class="dv">4</span> <span class="kw">in</span> <span class="dv">1</span><span class="op">..</span><span class="dv">254</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb33-4"><a href="#cb33-4" aria-hidden="true" tabindex="-1"></a><span class="va">$ip</span> <span class="op">=</span> <span class="va">$RNetwork</span><span class="op">+</span>$<span class="dv">4</span></span>
 | ||
| <span id="cb33-5"><a href="#cb33-5" aria-hidden="true" tabindex="-1"></a><span class="co"># создаем задания, забираем 3-ю строку вывода и добавляем к выводу ip-адрес:</span></span>
 | ||
| <span id="cb33-6"><a href="#cb33-6" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="fu">Start-Job</span> <span class="op">{</span><span class="st">"</span><span class="va">$using</span><span class="op">:</span><span class="va">ip</span><span class="st"> : "</span><span class="op">+(</span>ping <span class="op">-</span>n <span class="dv">1</span> <span class="op">-</span>w <span class="dv">50</span> <span class="va">$using</span><span class="op">:</span><span class="va">ip</span><span class="op">)[</span><span class="dv">2</span><span class="op">]})</span> <span class="op">|</span> <span class="fu">Out-Null</span></span>
 | ||
| <span id="cb33-7"><a href="#cb33-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb33-8"><a href="#cb33-8" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(</span><span class="va">$True</span><span class="op">){</span></span>
 | ||
| <span id="cb33-9"><a href="#cb33-9" aria-hidden="true" tabindex="-1"></a><span class="va">$status_job</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Job</span><span class="op">).</span><span class="fu">State</span><span class="op">[</span>-1<span class="op">]</span> <span class="co"># забираем статус последнего задания</span></span>
 | ||
| <span id="cb33-10"><a href="#cb33-10" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$status_job</span> <span class="op">-like</span> <span class="st">"Completed"</span><span class="op">){</span> <span class="co"># проверяем на выполнение (задания выполняются по очереди сверху вниз)</span></span>
 | ||
| <span id="cb33-11"><a href="#cb33-11" aria-hidden="true" tabindex="-1"></a><span class="va">$ping_out</span> <span class="op">=</span> <span class="fu">Get-Job</span> <span class="op">|</span> <span class="fu">Receive-Job</span> <span class="co"># если выполнен, забираем вывод всех заданий</span></span>
 | ||
| <span id="cb33-12"><a href="#cb33-12" aria-hidden="true" tabindex="-1"></a><span class="fu">Get-Job</span> <span class="op">|</span> <span class="fu">Remove-Job</span> <span class="op">-</span>Force <span class="co"># удаляем задания</span></span>
 | ||
| <span id="cb33-13"><a href="#cb33-13" aria-hidden="true" tabindex="-1"></a><span class="va">$ping_out</span></span>
 | ||
| <span id="cb33-14"><a href="#cb33-14" aria-hidden="true" tabindex="-1"></a><span class="cf">break</span> <span class="co"># завершаем цикл</span></span>
 | ||
| <span id="cb33-15"><a href="#cb33-15" aria-hidden="true" tabindex="-1"></a><span class="op">}}</span></span>
 | ||
| <span id="cb33-16"><a href="#cb33-16" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>Start-PingJob -Network 192.168.3.0</code><br />
 | ||
| <code>(Measure-Command {Start-PingJob -Network 192.168.3.0}).TotalSeconds</code>
 | ||
| 60 Seconds</p>
 | ||
| <h3 id="threadjob">ThreadJob</h3>
 | ||
| <p><code>Install-Module -Name ThreadJob</code><br />
 | ||
| <code>Get-Module ThreadJob -list</code><br />
 | ||
| <code>Start-ThreadJob {ping ya.ru} | Out-Null</code> создать фоновую
 | ||
| задачу<br />
 | ||
| <code>Get-Job | Receive-Job -Keep</code> отобразить и не удалять
 | ||
| вывод<br />
 | ||
| <code>(Get-Job).HasMoreData</code> если False, то вывод команы
 | ||
| удален<br />
 | ||
| <code>(Get-Job)[-1].Output</code> отобразить вывод последней задачи</p>
 | ||
| <div class="sourceCode" id="cb34"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb34-1"><a href="#cb34-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Start-PingThread <span class="op">(</span><span class="va">$Network</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb34-2"><a href="#cb34-2" aria-hidden="true" tabindex="-1"></a><span class="va">$RNetwork</span> <span class="op">=</span> <span class="va">$Network</span> <span class="op">-replace</span> <span class="st">"\.\d{1,3}$"</span><span class="op">,</span><span class="st">"."</span></span>
 | ||
| <span id="cb34-3"><a href="#cb34-3" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span>$<span class="dv">4</span> <span class="kw">in</span> <span class="dv">1</span><span class="op">..</span><span class="dv">254</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb34-4"><a href="#cb34-4" aria-hidden="true" tabindex="-1"></a><span class="va">$ip</span> <span class="op">=</span> <span class="va">$RNetwork</span><span class="op">+</span>$<span class="dv">4</span></span>
 | ||
| <span id="cb34-5"><a href="#cb34-5" aria-hidden="true" tabindex="-1"></a><span class="co"># создаем задания, забираем 3-ю строку вывода и добавляем к выводу ip-адрес:</span></span>
 | ||
| <span id="cb34-6"><a href="#cb34-6" aria-hidden="true" tabindex="-1"></a><span class="op">(</span>Start-ThreadJob <span class="op">{</span><span class="st">"</span><span class="va">$using</span><span class="op">:</span><span class="va">ip</span><span class="st"> : "</span><span class="op">+(</span>ping <span class="op">-</span>n <span class="dv">1</span> <span class="op">-</span>w <span class="dv">50</span> <span class="va">$using</span><span class="op">:</span><span class="va">ip</span><span class="op">)[</span><span class="dv">2</span><span class="op">]})</span> <span class="op">|</span> <span class="fu">Out-Null</span></span>
 | ||
| <span id="cb34-7"><a href="#cb34-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb34-8"><a href="#cb34-8" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(</span><span class="va">$True</span><span class="op">){</span></span>
 | ||
| <span id="cb34-9"><a href="#cb34-9" aria-hidden="true" tabindex="-1"></a><span class="va">$status_job</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Job</span><span class="op">).</span><span class="fu">State</span><span class="op">[</span>-1<span class="op">]</span> <span class="co"># забираем статус последнего задания</span></span>
 | ||
| <span id="cb34-10"><a href="#cb34-10" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$status_job</span> <span class="op">-like</span> <span class="st">"Completed"</span><span class="op">){</span> <span class="co"># проверяем на выполнение (задания выполняются по очереди сверху вниз)</span></span>
 | ||
| <span id="cb34-11"><a href="#cb34-11" aria-hidden="true" tabindex="-1"></a><span class="va">$ping_out</span> <span class="op">=</span> <span class="fu">Get-Job</span> <span class="op">|</span> <span class="fu">Receive-Job</span> <span class="co"># если выполнен, забираем вывод всех заданий</span></span>
 | ||
| <span id="cb34-12"><a href="#cb34-12" aria-hidden="true" tabindex="-1"></a><span class="fu">Get-Job</span> <span class="op">|</span> <span class="fu">Remove-Job</span> <span class="op">-</span>Force <span class="co"># удаляем задания</span></span>
 | ||
| <span id="cb34-13"><a href="#cb34-13" aria-hidden="true" tabindex="-1"></a><span class="va">$ping_out</span></span>
 | ||
| <span id="cb34-14"><a href="#cb34-14" aria-hidden="true" tabindex="-1"></a><span class="cf">break</span> <span class="co"># завершаем цикл</span></span>
 | ||
| <span id="cb34-15"><a href="#cb34-15" aria-hidden="true" tabindex="-1"></a><span class="op">}}</span></span>
 | ||
| <span id="cb34-16"><a href="#cb34-16" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>Start-PingThread -Network 192.168.3.0</code><br />
 | ||
| <code>(Measure-Command {Start-PingThread -Network 192.168.3.0}).TotalSeconds</code>
 | ||
| 24 Seconds</p>
 | ||
| <h3 id="poshrsjob">PoshRSJob</h3>
 | ||
| <div class="sourceCode" id="cb35"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb35-1"><a href="#cb35-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Start-PingRSJob <span class="op">(</span><span class="va">$Network</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb35-2"><a href="#cb35-2" aria-hidden="true" tabindex="-1"></a><span class="va">$RNetwork</span> <span class="op">=</span> <span class="va">$Network</span> <span class="op">-replace</span> <span class="st">"\.\d{1,3}$"</span><span class="op">,</span><span class="st">"."</span></span>
 | ||
| <span id="cb35-3"><a href="#cb35-3" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span>$<span class="dv">4</span> <span class="kw">in</span> <span class="dv">1</span><span class="op">..</span><span class="dv">254</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb35-4"><a href="#cb35-4" aria-hidden="true" tabindex="-1"></a><span class="va">$ip</span> <span class="op">=</span> <span class="va">$RNetwork</span><span class="op">+</span>$<span class="dv">4</span></span>
 | ||
| <span id="cb35-5"><a href="#cb35-5" aria-hidden="true" tabindex="-1"></a><span class="op">(</span>Start-RSJob <span class="op">{</span><span class="st">"</span><span class="va">$using</span><span class="op">:</span><span class="va">ip</span><span class="st"> : "</span><span class="op">+(</span>ping <span class="op">-</span>n <span class="dv">1</span> <span class="op">-</span>w <span class="dv">50</span> <span class="va">$using</span><span class="op">:</span><span class="va">ip</span><span class="op">)[</span><span class="dv">2</span><span class="op">]})</span> <span class="op">|</span> <span class="fu">Out-Null</span></span>
 | ||
| <span id="cb35-6"><a href="#cb35-6" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb35-7"><a href="#cb35-7" aria-hidden="true" tabindex="-1"></a><span class="va">$ping_out</span> <span class="op">=</span> Get-RSJob <span class="op">|</span> Receive-RSJob</span>
 | ||
| <span id="cb35-8"><a href="#cb35-8" aria-hidden="true" tabindex="-1"></a><span class="va">$ping_out</span></span>
 | ||
| <span id="cb35-9"><a href="#cb35-9" aria-hidden="true" tabindex="-1"></a>Get-RSJob <span class="op">|</span> Remove-RSJob</span>
 | ||
| <span id="cb35-10"><a href="#cb35-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>Start-PingRSJob -Network 192.168.3.0</code><br />
 | ||
| <code>(Measure-Command {Start-PingRSJob -Network 192.168.3.0}).TotalSeconds</code>
 | ||
| 10 Seconds</p>
 | ||
| <h1 id="smtp">SMTP</h1>
 | ||
| <div class="sourceCode" id="cb36"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb36-1"><a href="#cb36-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Send-SMTP <span class="op">{</span></span>
 | ||
| <span id="cb36-2"><a href="#cb36-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span> <span class="op">(</span></span>
 | ||
| <span id="cb36-3"><a href="#cb36-3" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Parameter<span class="op">(</span>Mandatory <span class="op">=</span> <span class="va">$True</span><span class="op">)]</span><span class="va">$mess</span></span>
 | ||
| <span id="cb36-4"><a href="#cb36-4" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
 | ||
| <span id="cb36-5"><a href="#cb36-5" aria-hidden="true" tabindex="-1"></a><span class="va">$srv_smtp</span> <span class="op">=</span> <span class="st">"smtp.yandex.ru"</span> </span>
 | ||
| <span id="cb36-6"><a href="#cb36-6" aria-hidden="true" tabindex="-1"></a><span class="va">$port</span> <span class="op">=</span> <span class="st">"587"</span></span>
 | ||
| <span id="cb36-7"><a href="#cb36-7" aria-hidden="true" tabindex="-1"></a><span class="va">$from</span> <span class="op">=</span> <span class="st">"login1@yandex.ru"</span> </span>
 | ||
| <span id="cb36-8"><a href="#cb36-8" aria-hidden="true" tabindex="-1"></a><span class="va">$to</span> <span class="op">=</span> <span class="st">"login2@yandex.ru"</span> </span>
 | ||
| <span id="cb36-9"><a href="#cb36-9" aria-hidden="true" tabindex="-1"></a><span class="va">$user</span> <span class="op">=</span> <span class="st">"login1"</span></span>
 | ||
| <span id="cb36-10"><a href="#cb36-10" aria-hidden="true" tabindex="-1"></a><span class="va">$pass</span> <span class="op">=</span> <span class="st">"password"</span></span>
 | ||
| <span id="cb36-11"><a href="#cb36-11" aria-hidden="true" tabindex="-1"></a><span class="va">$subject</span> <span class="op">=</span> <span class="st">"Service status on Host: </span><span class="va">$hostname</span><span class="st">"</span></span>
 | ||
| <span id="cb36-12"><a href="#cb36-12" aria-hidden="true" tabindex="-1"></a><span class="va">$Message</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">Mail</span><span class="op">.</span><span class="fu">MailMessage</span></span>
 | ||
| <span id="cb36-13"><a href="#cb36-13" aria-hidden="true" tabindex="-1"></a><span class="va">$Message</span><span class="op">.</span><span class="fu">From</span> <span class="op">=</span> <span class="va">$from</span></span>
 | ||
| <span id="cb36-14"><a href="#cb36-14" aria-hidden="true" tabindex="-1"></a><span class="va">$Message</span><span class="op">.</span><span class="fu">To</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="va">$to</span><span class="op">)</span> </span>
 | ||
| <span id="cb36-15"><a href="#cb36-15" aria-hidden="true" tabindex="-1"></a><span class="va">$Message</span><span class="op">.</span><span class="fu">Subject</span> <span class="op">=</span> <span class="va">$subject</span> </span>
 | ||
| <span id="cb36-16"><a href="#cb36-16" aria-hidden="true" tabindex="-1"></a><span class="va">$Message</span><span class="op">.</span><span class="fu">IsBodyHTML</span> <span class="op">=</span> <span class="va">$true</span> </span>
 | ||
| <span id="cb36-17"><a href="#cb36-17" aria-hidden="true" tabindex="-1"></a><span class="va">$Message</span><span class="op">.</span><span class="fu">Body</span> <span class="op">=</span> <span class="st">"<h1> </span><span class="va">$mess</span><span class="st"> </h1>"</span></span>
 | ||
| <span id="cb36-18"><a href="#cb36-18" aria-hidden="true" tabindex="-1"></a><span class="va">$smtp</span> <span class="op">=</span> <span class="fu">New-Object</span> Net<span class="op">.</span><span class="fu">Mail</span><span class="op">.</span><span class="fu">SmtpClient</span><span class="op">(</span><span class="va">$srv_smtp</span><span class="op">,</span> <span class="va">$port</span><span class="op">)</span></span>
 | ||
| <span id="cb36-19"><a href="#cb36-19" aria-hidden="true" tabindex="-1"></a><span class="va">$smtp</span><span class="op">.</span><span class="fu">EnableSSL</span> <span class="op">=</span> <span class="va">$true</span> </span>
 | ||
| <span id="cb36-20"><a href="#cb36-20" aria-hidden="true" tabindex="-1"></a><span class="va">$smtp</span><span class="op">.</span><span class="fu">Credentials</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">NetworkCredential</span><span class="op">(</span><span class="va">$user</span><span class="op">,</span> <span class="va">$pass</span><span class="op">);</span></span>
 | ||
| <span id="cb36-21"><a href="#cb36-21" aria-hidden="true" tabindex="-1"></a><span class="va">$smtp</span><span class="op">.</span><span class="fu">Send</span><span class="op">(</span><span class="va">$Message</span><span class="op">)</span> </span>
 | ||
| <span id="cb36-22"><a href="#cb36-22" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>Send-SMTP $(Get-Service)</code></p>
 | ||
| <h1 id="hyper-v">Hyper-V</h1>
 | ||
| <p><code>Install-WindowsFeature -Name Hyper-V -IncludeManagementTools -Restart</code>
 | ||
| установить роль на Windows Server<br />
 | ||
| <code>Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V –All</code>
 | ||
| установить роль на Windows Desktop<br />
 | ||
| <code>Get-Command -Module hyper-v</code><br />
 | ||
| <code>Get-VMHost</code></p>
 | ||
| <div class="sourceCode" id="cb37"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb37-1"><a href="#cb37-1" aria-hidden="true" tabindex="-1"></a>New-VMSwitch <span class="op">-</span>name NAT <span class="op">-</span>SwitchType Internal <span class="co"># создать виртуальный коммутатор и адаптер для него</span></span>
 | ||
| <span id="cb37-2"><a href="#cb37-2" aria-hidden="true" tabindex="-1"></a>Get-NetAdapter <span class="op">|</span> <span class="fu">where</span> InterfaceDescription <span class="op">-match</span> Hyper-V <span class="co"># список сетевых адаптеров</span></span>
 | ||
| <span id="cb37-3"><a href="#cb37-3" aria-hidden="true" tabindex="-1"></a>New-NetNat <span class="op">-</span>Name LocalNat <span class="op">-</span>InternalIPInterfaceAddressPrefix <span class="st">"192.168.3.0/24"</span> <span class="co"># задать сеть</span></span>
 | ||
| <span id="cb37-4"><a href="#cb37-4" aria-hidden="true" tabindex="-1"></a>Get-NetAdapter <span class="st">"vEthernet (NAT)"</span> <span class="op">|</span> New-NetIPAddress <span class="op">-</span>IPAddress <span class="dv">192.168</span><span class="op">.</span><span class="dv">3.200</span> <span class="op">-</span>AddressFamily IPv4 <span class="op">-</span>PrefixLength <span class="dv">24</span> <span class="co"># присвоить адрес, необходимо на ВМ указать шлюз 192.168.3.200, что бы находиться за NAT, или в настройка ВМ указать соответствующий адаптер</span></span>
 | ||
| <span id="cb37-5"><a href="#cb37-5" aria-hidden="true" tabindex="-1"></a>Add-NetNatStaticMapping <span class="op">-</span>NatName LocalNat <span class="op">-</span>Protocol TCP <span class="op">-</span>ExternalIPAddress <span class="dv">0.0</span><span class="op">.</span><span class="dv">0.0</span> <span class="op">-</span>ExternalPort <span class="dv">2222</span> <span class="op">-</span>InternalIPAddress <span class="dv">192.168</span><span class="op">.</span><span class="dv">3.103</span> <span class="op">-</span>InternalPort <span class="dv">2121</span> <span class="co"># проброс, вест трафик который приходит на хост Hyper-V TCP/2222, будет перенаправляться на соответствующий порт виртуальной машины за NAT.</span></span>
 | ||
| <span id="cb37-6"><a href="#cb37-6" aria-hidden="true" tabindex="-1"></a><span class="op">(</span>Get-NetAdapter <span class="op">|</span> <span class="fu">where</span> Name <span class="op">-match</span> NAT<span class="op">).</span><span class="fu">Status</span></span></code></pre></div>
 | ||
| <p><code>Get-NetNatStaticMapping</code> отобразить пробросы (NAT)<br />
 | ||
| <code>Get-NetNat</code> список сетей<br />
 | ||
| <code>Remove-NetNatStaticMapping -StaticMappingID 0</code> удалить
 | ||
| проброс<br />
 | ||
| <code>Remove-NetNat -Name LocalNat</code> удалить сеть</p>
 | ||
| <p><code>New-VMSwitch -Name Local -AllowManagementOS $True -NetAdapterName "Ethernet 4" -SwitchType External</code>
 | ||
| создать вшений (External) виртуальный коммутатор<br />
 | ||
| <code>$VMName = "hv-dc-01"</code></p>
 | ||
| <div class="sourceCode" id="cb38"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb38-1"><a href="#cb38-1" aria-hidden="true" tabindex="-1"></a><span class="va">$VM</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb38-2"><a href="#cb38-2" aria-hidden="true" tabindex="-1"></a>Name <span class="op">=</span> <span class="va">$VMName</span></span>
 | ||
| <span id="cb38-3"><a href="#cb38-3" aria-hidden="true" tabindex="-1"></a>MemoryStartupBytes <span class="op">=</span> 4Gb</span>
 | ||
| <span id="cb38-4"><a href="#cb38-4" aria-hidden="true" tabindex="-1"></a>Generation <span class="op">=</span> <span class="dv">2</span></span>
 | ||
| <span id="cb38-5"><a href="#cb38-5" aria-hidden="true" tabindex="-1"></a><span class="dt">NewVHDPath</span> <span class="op">=</span> <span class="st">"D:\VM\</span><span class="va">$VMName</span><span class="st">\</span><span class="va">$VMName</span><span class="st">.vhdx"</span></span>
 | ||
| <span id="cb38-6"><a href="#cb38-6" aria-hidden="true" tabindex="-1"></a>NewVHDSizeBytes <span class="op">=</span> 50Gb</span>
 | ||
| <span id="cb38-7"><a href="#cb38-7" aria-hidden="true" tabindex="-1"></a>BootDevice <span class="op">=</span> <span class="st">"VHD"</span></span>
 | ||
| <span id="cb38-8"><a href="#cb38-8" aria-hidden="true" tabindex="-1"></a>Path <span class="op">=</span> <span class="st">"D:\VM\</span><span class="va">$VMName</span><span class="st">"</span></span>
 | ||
| <span id="cb38-9"><a href="#cb38-9" aria-hidden="true" tabindex="-1"></a>SwitchName <span class="op">=</span> <span class="st">"NAT"</span></span>
 | ||
| <span id="cb38-10"><a href="#cb38-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb38-11"><a href="#cb38-11" aria-hidden="true" tabindex="-1"></a>New-VM @VM</span></code></pre></div>
 | ||
| <p><code>Set-VMDvdDrive -VMName $VMName -Path "C:\Users\Lifailon\Documents\WS-2016.iso"</code><br />
 | ||
| <code>New-VHD -Path "D:\VM\$VMName\disk_d.vhdx" -SizeBytes 10GB</code>
 | ||
| создать VHDX диск<br />
 | ||
| <code>Add-VMHardDiskDrive -VMName $VMName -Path "D:\VM\$VMName\disk_d.vhdx"</code>
 | ||
| примонтировать диск<br />
 | ||
| <code>Get-VM –VMname $VMName | Set-VM –AutomaticStartAction Start</code>
 | ||
| автозапуск<br />
 | ||
| <code>Get-VM -Name $VMName | Set-VMMemory -StartupBytes 8Gb</code><br />
 | ||
| <code>Set-VMProcessor $VMName -Count 2</code><br />
 | ||
| <code>Get-VM -Name $VMName | Checkpoint-VM -SnapshotName "Snapshot-1"</code><br />
 | ||
| <code>Restore-VMCheckpoint -Name Snapshot-1" -VMName $VMName -Confirm:$false</code><br />
 | ||
| <code>Get-VM | Select -ExpandProperty NetworkAdapters | Select VMName,IPAddresses,Status</code>
 | ||
| получить IP адрес всех ВМ<br />
 | ||
| <code>vmconnect.exe localhost $VMHost</code></p>
 | ||
| <p><code>Get-NetTCPConnection -State Established,Listen | Where-Object LocalPort -Match 2179</code>
 | ||
| найти порт слушателя
 | ||
| <code>Get-Process -Id (Get-NetTCPConnection -State Established,Listen | Where-Object LocalPort -Match 2179).OwningProcess</code>
 | ||
| найти процесс по ID (vmms/VMConnect)<br />
 | ||
| <code>New-NetFirewallRule -Name "Hyper-V" -DisplayName "Hyper-V" -Group "Hyper-V" -Direction Inbound -Protocol TCP -LocalPort 2179 -Action Allow -Profile Public</code><br />
 | ||
| <code>Get-LocalGroupMember -Group "Администраторы Hyper-V"</code> или
 | ||
| “Hyper-V Administrators”<br />
 | ||
| <code>Add-LocalGroupMember -Group "Администраторы Hyper-V" -Member "lifailon"</code><br />
 | ||
| <code>Get-VM * | select name,ID</code> добавить id в RDCMan для
 | ||
| подключения<br />
 | ||
| <code>Grant-VMConnectAccess -ComputerName plex-01 -VMName hv-devops-01 -UserName lifailon</code>
 | ||
| дать доступ на подключение не администратору<br />
 | ||
| <code>Grant-VMConnectAccess -ComputerName huawei-book -VMName hv-devops-01 -UserName lifailon</code><br />
 | ||
| <code>Get-VMConnectAccess</code><br />
 | ||
| <code>Revoke-VMConnectAccess -VMName hv-devops-01 -UserName lifailon</code></p>
 | ||
| <p>Error: <code>Unknown disconnection reason 3848</code> - добавить
 | ||
| ключи реестра на стороне клиента</p>
 | ||
| <div class="sourceCode" id="cb39"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb39-1"><a href="#cb39-1" aria-hidden="true" tabindex="-1"></a><span class="fu">New-ItemProperty</span> <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentialsDomain <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">"Microsoft Virtual Console Service/*"</span> <span class="op">-</span>Force</span>
 | ||
| <span id="cb39-2"><a href="#cb39-2" aria-hidden="true" tabindex="-1"></a><span class="fu">New-ItemProperty</span> <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowDefaultCredentials <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">"Microsoft Virtual Console Service/*"</span> <span class="op">-</span>Force</span>
 | ||
| <span id="cb39-3"><a href="#cb39-3" aria-hidden="true" tabindex="-1"></a><span class="fu">New-ItemProperty</span> <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentialsWhenNTLMOnlyDomain <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">"Microsoft Virtual Console Service/*"</span> <span class="op">-</span>Force</span>
 | ||
| <span id="cb39-4"><a href="#cb39-4" aria-hidden="true" tabindex="-1"></a>ItemProperty <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowDefaultCredentialsDomain <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">"Microsoft Virtual Console Service/*"</span> <span class="op">-</span>Force</span>
 | ||
| <span id="cb39-5"><a href="#cb39-5" aria-hidden="true" tabindex="-1"></a><span class="fu">New-ItemProperty</span> <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentials <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">"Microsoft Virtual Console Service/*"</span> <span class="op">-</span>Force</span>
 | ||
| <span id="cb39-6"><a href="#cb39-6" aria-hidden="true" tabindex="-1"></a><span class="fu">New-ItemProperty</span> <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentialsWhenNTLMOnly <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">"Microsoft Virtual Console Service/*"</span> <span class="op">-</span>Force</span>
 | ||
| <span id="cb39-7"><a href="#cb39-7" aria-hidden="true" tabindex="-1"></a><span class="fu">New-ItemProperty</span> <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowSavedCredentialsWhenNTLMOnly <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">"Microsoft Virtual Console Service/*"</span> <span class="op">-</span>Force</span>
 | ||
| <span id="cb39-8"><a href="#cb39-8" aria-hidden="true" tabindex="-1"></a><span class="fu">New-ItemProperty</span> <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowSavedCredentials <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">"Microsoft Virtual Console Service/*"</span> <span class="op">-</span>Force</span>
 | ||
| <span id="cb39-9"><a href="#cb39-9" aria-hidden="true" tabindex="-1"></a><span class="fu">New-ItemProperty</span> <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowSavedCredentialsDomain <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">"Microsoft Virtual Console Service/*"</span> <span class="op">-</span>Force</span></code></pre></div>
 | ||
| <h1 id="vmwarepowercli">VMWare/PowerCLI</h1>
 | ||
| <p><code>Install-Module -Name VMware.PowerCLI # -AllowClobber</code>
 | ||
| установить модуль (PackageProvider: nuget)<br />
 | ||
| <code>Get-Module -ListAvailable VMware* | Select Name,Version</code><br />
 | ||
| <code>Import-Module VMware.VimAutomation.Core</code> импортировать в
 | ||
| сессию<br />
 | ||
| <code>Get-PSProvider | format-list Name,PSSnapIn,ModuleName</code>
 | ||
| список оснасток Windows PowerShell</p>
 | ||
| <p><code>Get-PowerCLIConfiguration</code> конфигурация подключения<br />
 | ||
| <code>Set-PowerCLIConfiguration -Scope AllUsers -InvalidCertificateAction ignore -confirm:$false</code>
 | ||
| eсли используется самоподписанный сертификат, изменить значение
 | ||
| параметра InvalidCertificateAction с Unset на Ignore/Warn<br />
 | ||
| <code>Set-PowerCLIConfiguration -Scope AllUsers -ParticipateInCeip $false</code>
 | ||
| отключить уведомление сбора данных через VMware Customer Experience
 | ||
| Improvement Program (CEIP)</p>
 | ||
| <p><code>Read-Host –AsSecureString | ConvertFrom-SecureString | Out-File "$home\Documents\vcsa_password.txt"</code>
 | ||
| зашифровать пароль и сохранить в файл<br />
 | ||
| <code>$esxi = "vcsa.domain.local"</code><br />
 | ||
| <code>$user = "administrator@vsphere.local"</code><br />
 | ||
| <code>$pass = Get-Content "$home\Documents\vcsa_password.txt" | ConvertTo-SecureString</code>
 | ||
| прочитать пароль<br />
 | ||
| <code>$pass = "password"</code><br />
 | ||
| <code>$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user ,$pass</code><br />
 | ||
| <code>Connect-VIServer $esxi -User $Cred.Username -Password $Cred.GetNetworkCredential().password</code>
 | ||
| подключиться, используя PSCredential ($Cred)<br />
 | ||
| <code>Connect-VIServer $esxi -User $user -Password $pass</code>
 | ||
| подключиться, используя логин и пароль</p>
 | ||
| <p><code>Get-Command –Module *vmware*</code><br />
 | ||
| <code>Get-Command –Module *vmware* -name *get*iscsi*</code><br />
 | ||
| <code>Get-IScsiHbaTarget</code><br />
 | ||
| <code>Get-Datacenter</code><br />
 | ||
| <code>Get-Cluster</code><br />
 | ||
| <code>Get-VMHost</code><br />
 | ||
| <code>Get-VMHost | select Name,Model,ProcessorType,MaxEVCMode,NumCpu,CpuTotalMhz,CpuUsageMhz,MemoryTotalGB,MemoryUsageGB</code><br />
 | ||
| <code>Get-VMHostDisk | select VMHost,ScsiLun,TotalSectors</code></p>
 | ||
| <p><code>Get-Datastore</code><br />
 | ||
| <code>Get-Datastore TNAS-vmfs-4tb-01</code><br />
 | ||
| <code>Get-Datastore TNAS-vmfs-4tb-01 | get-vm</code><br />
 | ||
| <code>Get-Datastore -RelatedObject vm-01</code><br />
 | ||
| <code>(Get-Datastore TNAS-vmfs-4tb-01).ExtensionData.Info.GetType()</code><br />
 | ||
| <code>(Get-Datastore TNAS-vmfs-4tb-01).ExtensionData.Info.Vmfs.Extent</code></p>
 | ||
| <p><code>Get-Command –Module *vmware* -name *disk*</code><br />
 | ||
| <code>Get-VM vm-01 | Get-Datastore</code><br />
 | ||
| <code>Get-VM vm-01 | Get-HardDisk</code><br />
 | ||
| <code>Get-VM | Get-HardDisk | select Parent,Name,CapacityGB,StorageFormat,FileName | ft</code><br />
 | ||
| <code>Copy-HardDisk</code><br />
 | ||
| <code>Get-VM | Get-Snapshot</code><br />
 | ||
| <code>Get-VM | where {$_.Powerstate -eq "PoweredOn"}</code><br />
 | ||
| <code>Get-VMHost esxi-05 | Get-VM | where {$_.Powerstate -eq "PoweredOff"} | Move-VM –Destination (Get-VMHost esxi-06)</code></p>
 | ||
| <p><code>Get-VM | select Name,VMHost,PowerState,NumCpu,MemoryGB,</code><br />
 | ||
| <code>@{Name="UsedSpaceGB"; Expression={[int32]($_.UsedSpaceGB)}},@{Name="ProvisionedSpaceGB"; Expression={[int32]($_.ProvisionedSpaceGB)}},</code><br />
 | ||
| <code>CreateDate,CpuHotAddEnabled,MemoryHotAddEnabled,CpuHotRemoveEnabled,Notes</code></p>
 | ||
| <p><code>Get-VMGuest vm-01 | Update-Tools</code><br />
 | ||
| <code>Get-VMGuest vm-01 | select OSFullName,IPAddress,HostName,State,Disks,Nics,ToolsVersion</code><br />
 | ||
| <code>Get-VMGuest * | select -ExpandProperty IPAddress</code><br />
 | ||
| <code>Restart-VMGuest -vm vm-01 -Confirm:$False</code><br />
 | ||
| <code>Start-VM -vm vm-01 -Confirm:$False</code><br />
 | ||
| <code>Shutdown-VMGuest -vm vm-01 -Confirm:$false</code></p>
 | ||
| <p><code>New-VM –Name vm-01 -VMHost esxi-06 –ResourcePool Production –DiskGB 60 –DiskStorageFormat Thin –Datastore TNAS-vmfs-4tb-01</code><br />
 | ||
| <code>Get-VM vm-01 | Copy-VMGuestFile -Source "\\$srv\Install\Soft\Btest.exe" -Destination "C:\Install\" -LocalToGuest -GuestUser USER -GuestPassword PASS -force</code></p>
 | ||
| <p><code>Get-VM -name vm-01 | Export-VApp -Destination C:\Install -Format OVF</code>
 | ||
| Export template (.ovf, .vmdk, .mf)<br />
 | ||
| <code>Get-VM -name vm-01 | Export-VApp -Destination C:\Install -Format OVA</code></p>
 | ||
| <p><code>Get-VMHostNetworkAdapter | select VMHost,Name,Mac,IP,@{Label="Port Group"; Expression={$_.ExtensionData.Portgroup}} | ft</code><br />
 | ||
| <code>Get-VM | Get-NetworkAdapter | select Parent,Name,Id,Type,MacAddress,ConnectionState,WakeOnLanEnabled | ft</code></p>
 | ||
| <p><code>Get-Command –Module *vmware* -name *event*</code><br />
 | ||
| <code>Get-VIEvent -MaxSamples 1000 | where {($_.FullFormattedMessage -match "power")} | select username,CreatedTime,FullFormattedMessage</code><br />
 | ||
| <code>Get-logtype | select Key,SourceEntityId,Filename,Creator,Info</code><br />
 | ||
| <code>(Get-Log vpxd:vpxd.log).Entries | select -Last 50</code></p>
 | ||
| <p><code>Get-Command –Module *vmware* -name *syslog*</code><br />
 | ||
| <code>Set-VMHostSysLogServer -VMHost esxi-05 -SysLogServer "tcp://192.168.3.100" -SysLogServerPort 3515</code><br />
 | ||
| <code>Get-VMHostSysLogServer -VMHost esxi-05</code></p>
 | ||
| <h1 id="exchangeemshell">Exchange/EMShell</h1>
 | ||
| <p><code>$srv_cas = "exchange-cas"</code><br />
 | ||
| <code>$session_exchange = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://$srv_cas/PowerShell/</code>
 | ||
| -Credential $Cred -Authentication Kerberos<br />
 | ||
| <code>Get-PSSession</code><br />
 | ||
| <code>Import-PSSession $session_exchange -DisableNameChecking</code>
 | ||
| импортировать в текущую сессию</p>
 | ||
| <p><code>Get-ExchangeServer | select name,serverrole,admindisplayversion,Edition,OriginatingServer,WhenCreated,WhenChanged,DataPath | ft</code>
 | ||
| список всех серверов</p>
 | ||
| <p><code>Get-ImapSettings</code> настройки IMAP<br />
 | ||
| <code>Get-ExchangeCertificate</code> список сертификатов<br />
 | ||
| <code>Get-ExchangeCertificate -Thumbprint "5CEC8544D4743BC279E5FEA1679F79F5BD0C2B3A" | Enable-ExchangeCertificate -Services  IMAP, POP, IIS, SMTP</code><br />
 | ||
| <code>iisreset</code><br />
 | ||
| <code>Get-ClientAccessService | fl identity, *uri*</code> настройки
 | ||
| службы автообнаружения в Exchange 2016<br />
 | ||
| <code>Get-ClientAccessService -Identity $srv | Set-ClientAccessService -AutoDiscoverServiceInternalUri https://mail.domain.ru/Autodiscover/Autodiscover.xml</code>
 | ||
| изменить на внешний адрес<br />
 | ||
| <code>Get-OutlookAnywhere</code> OA позволяет клиентам Outlook
 | ||
| подключаться к своим почтовым ящикам за пределами локальной сети (без
 | ||
| использования VPN)<br />
 | ||
| <code>Get-WebServicesVirtualDirectory</code><br />
 | ||
| <code>Get-OwaVirtualDirectory</code><br />
 | ||
| <code>Get-ActiveSyncVirtualDirectory</code><br />
 | ||
| <code>Get-OabVirtualDirectory</code> виртуальная директория автономной
 | ||
| адресной книги<br />
 | ||
| <code>Get-OabVirtualDirectory -Server $srv | Set-OabVirtualDirectory -InternalUrl "https://mail.domain.ru/OAB" -ExternalUrl "https://mail.domain.ru/OAB"</code></p>
 | ||
| <h3 id="roles">Roles</h3>
 | ||
| <p>MS (Mailbox) - сервер с БД почтовых ящиков и общих папок, отвечает
 | ||
| только за их размещение и не выполняет маршрутизацию никаких
 | ||
| сообщений.<br />
 | ||
| CAS (Client Access Server) - обработка клиентских подключений к почтовым
 | ||
| ящикам, которые создаются клиентами Outlook Web Access (HTTP для Outlook
 | ||
| Web App), Outlook Anywhere, ActiveSync (для мобильных устройств),
 | ||
| интернет протоколы POP3 и IMAP4, MAPI для клиентов Microsoft
 | ||
| Outlook.<br />
 | ||
| Hub Transort - ответвечает за маршрутизацию сообщений интернета и
 | ||
| инфраструктурой Exchange, а также между серверами Exchange. Сообщения
 | ||
| всегда маршрутизируются с помощью роли транспортного
 | ||
| сервера-концентратора, даже если почтовые ящики источника и назначения
 | ||
| находятся в одной базе данных почтовых ящиков.<br />
 | ||
| Relay - роль пограничного транспортного сервера (шлюз SMTP в периметре
 | ||
| сети).</p>
 | ||
| <p>SCP (Service Connection Point) - запись прописывается в AD, при
 | ||
| создание сервера CAS. Outlook запрашивает SCP, выбирает те, которые
 | ||
| находятся в одном сайте с ним и по параметру WhenCreated – по дате
 | ||
| создания, выбирая самый старый.<br />
 | ||
| Autodiscover. Outlook выбирает в качестве сервера Client Access тот,
 | ||
| который прописан в атрибуте RPCClientAccessServer базы данных
 | ||
| пользователя. Сведения о базе данных и сервере mailbox, на котором она
 | ||
| лежит, берутся из AD.</p>
 | ||
| <h3 id="messagetrackinglog">MessageTrackingLog</h3>
 | ||
| <p><code>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+$"}}</code><br />
 | ||
| <code>Get-MessageTrackingLog -Start (Get-Date).AddHours(-24) -ResultSize Unlimited | where {[string]$_.recipients -like "*@yandex.ru"}</code>
 | ||
| вывести сообщения за последние 24 часа, где получателем был указанный
 | ||
| домен<br />
 | ||
| -Start “04/01/2023 09:00:00” -End “04/01/2023 18:00:00” - поиск по
 | ||
| указанному промежутку времени<br />
 | ||
| -MessageSubject “Тест” - поиск по теме письма<br />
 | ||
| -Recipients “support4@domain.ru” - поиск по получателю<br />
 | ||
| -Sender - поиск по отправителю<br />
 | ||
| -EventID – поиск по коду события сервера (RECEIVE, SEND, FAIL, DSN,
 | ||
| DELIVER, BADMAIL, RESOLVE, EXPAND, REDIRECT, TRANSFER, SUBMIT,
 | ||
| POISONMESSAGE, DEFER)<br />
 | ||
| -Server – поиск на определенном транспортном сервере<br />
 | ||
| -messageID – трекинг письма по его ID</p>
 | ||
| <h3 id="mailbox">Mailbox</h3>
 | ||
| <p><code>Get-Mailbox -Database "it2"</code> список почтовых серверов в
 | ||
| базе данных<br />
 | ||
| <code>Get-Mailbox -resultsize unlimited | ? Emailaddresses -like "support4" | format-list name,emailaddresses,database,servername</code>
 | ||
| какую БД, сервер и smtp-адреса использует почтовый ящик<br />
 | ||
| <code>Get-Mailbox -Database $db_name -Archive</code> отобразить архивные
 | ||
| почтовые ящики</p>
 | ||
| <p><code>Get-MailboxFolderStatistics -Identity "support4" -FolderScope All | select Name,ItemsInFolder,FolderSize</code>
 | ||
| отобразить кол-во писем и размер в каждой папке<br />
 | ||
| <code>Get-MailboxStatistics "support4" | select DisplayName,LastLoggedOnUserAccount,LastLogonTime,LastLogoffTime,ItemCount,TotalItemSize,DeletedItemCount,TotalDeletedItemSize,Database,ServerName</code>
 | ||
| общее кол-во писем, их размер, время последнего входа и выхода, имя
 | ||
| сервера и БД<br />
 | ||
| <code>Get-Mailbox -Server s2 | Get-MailboxStatistics | where {$_.Lastlogontime -lt (get-date).AddDays(-30)} | Sort Lastlogontime -desc | ft displayname,Lastlogontime,totalitemsize</code>
 | ||
| ящики, которые не использовались 30 и более дней</p>
 | ||
| <p><code>Enable-Mailbox -Identity support9 -Database test_base</code>
 | ||
| создать почтовый ящик для существующего пользователя в AD<br />
 | ||
| <code>New-Mailbox -Name $login -UserPrincipalName "$login@$domain" -Database $select_db -OrganizationalUnit $path -Password (ConvertTo-SecureString -String "$password" -AsPlainText -Force)</code>
 | ||
| создать новый почтовый ящик без привязки к пользователю AD<br />
 | ||
| <code>Get-MailboxDatabase -Database $db_name | Remove-MailboxDatabase</code>
 | ||
| удалить БД</p>
 | ||
| <p><code>Set-MailBox "support4" -PrimarySmtpAddress support24@domain.ru -EmailAddressPolicyEnabled $false</code>
 | ||
| добавить и изменить основной SMTP-адрес электронной почты для
 | ||
| пользователя<br />
 | ||
| <code>Set-Mailbox -Identity "support4" -DeliverToMailboxAndForward $true -ForwardingSMTPAddress "username@outlook.com"</code>
 | ||
| включить переадресацию почты (электронная почта попадает в почтовый ящик
 | ||
| пользователя support4 и одновременно пересылается по адресу
 | ||
| username@outlook.com)</p>
 | ||
| <h3 id="moverequest">MoveRequest</h3>
 | ||
| <p><code>Get-Mailbox -Database $db_in | New-MoveRequest -TargetDatabase $db_out</code>
 | ||
| переместить все почтовые ящики из одной БД в другую<br />
 | ||
| <code>New-MoveRequest -Identity $db_in -TargetDatabase $db_out</code>
 | ||
| переместить один почтовый ящик<br />
 | ||
| <code>Get-MoveRequest | Suspend-MoveRequest</code> остановить запросы
 | ||
| перемещения<br />
 | ||
| <code>Get-MoveRequest | Remove-MoveRequest</code> удалить запросы на
 | ||
| перемещение<br />
 | ||
| <code>Get-MoveRequest | Get-MoveRequestStatistics</code> статус
 | ||
| перемещения</p>
 | ||
| <p>Status:<br />
 | ||
| Cleanup - нужно подождать<br />
 | ||
| Queued - в очереди<br />
 | ||
| InProgress - в процессе<br />
 | ||
| Percent Complete - процент выполнения<br />
 | ||
| CompletionInProgress - завершение процесса<br />
 | ||
| Completed - завершено</p>
 | ||
| <p><code>Remove-MoveRequest -Identity $db_name</code> завершить процесс
 | ||
| перемещения (убрать статус перемещения с почтового ящика и очистить
 | ||
| список перемещений)<br />
 | ||
| <code>Get-MailboxDatabase | Select Name, MailboxRetention</code> после
 | ||
| перемещения ящиков, размер базы не изменится, полное удаление из базы
 | ||
| произойдет, как пройдет количество дней, выставленное в параметре
 | ||
| MailboxRetention<br />
 | ||
| <code>Set-MailboxDatabase -MailboxRetention '0.00:00:00' -Identity $db_name</code>
 | ||
| изменить значение</p>
 | ||
| <h3 id="archive">Archive</h3>
 | ||
| <p><code>Enable-Mailbox -Identity $name -Archive</code> включить архив
 | ||
| для пользователя<br />
 | ||
| <code>Get-Mailbox $name | New-MoveReques –ArchiveOnly –ArchiveTargetDatabase DBArch</code>
 | ||
| переместить архивный почтовый ящик в другую БД<br />
 | ||
| <code>Get-Mailbox $name | fl Name,Database,ArchiveDatabase</code> место
 | ||
| расположения БД пользователя и БД его архива<br />
 | ||
| <code>Disable-Mailbox -Identity $name -Archive</code> отключить
 | ||
| архив<br />
 | ||
| <code>Connect-Mailbox -Identity "8734c04e-981e-4ccf-a547-1c1ac7ebf3e2" -Archive -User $name -Database it2</code>
 | ||
| подключение архива пользователя к указанному почтовому ящику<br />
 | ||
| <code>Get-Mailbox $name | Set-Mailbox -ArchiveQuota 20GB -ArchiveWarningQuota 19GB</code>
 | ||
| настроить квоты хранения архива</p>
 | ||
| <h3 id="quota">Quota</h3>
 | ||
| <p><code>Get-Mailbox -Identity $mailbox | fl IssueWarningQuota, ProhibitSendQuota, ProhibitSendReceiveQuota, UseDatabaseQuotaDefaults</code>
 | ||
| отобразить квоты почтового ящика<br />
 | ||
| IssueWarningQuota — квота, при достижении которой Exchange отправит
 | ||
| уведомление<br />
 | ||
| ProhibitSendQuota — при достижении будет запрещена отправка<br />
 | ||
| ProhibitSendReceiveQuota — при достижении будет запрещена отправка и
 | ||
| получение<br />
 | ||
| UseDatabaseQuotaDefaults — используется ли квота БД или false -
 | ||
| индвидиуальные<br />
 | ||
| <code>Set-Mailbox -Identity $mailbox -UseDatabaseQuotaDefaults $false -IssueWarningQuota "3 GB" -ProhibitSendQuota "4 GB" -ProhibitSendReceiveQuota "5 GB"</code>
 | ||
| задать квоту для пользователя</p>
 | ||
| <p><code>Get-MailboxDatabase $db_name | fl Name, *Quota</code>
 | ||
| отобразить квоты наложенные на БД<br />
 | ||
| <code>Set-MailboxDatabase $db -ProhibitSendReceiveQuota "5 GB" -ProhibitSendQuota "4 GB" -IssueWarningQuota "3 GB"</code>
 | ||
| настроить квоты на БД</p>
 | ||
| <h3 id="database">Database</h3>
 | ||
| <p><code>Get-MailboxDatabase -Status | select ServerName,Name,DatabaseSize</code>
 | ||
| список и размер всех БД на всех MX-серверах<br />
 | ||
| <code>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</code>
 | ||
| создать БД<br />
 | ||
| <code>Restart-Service MSExchangeIS</code><br />
 | ||
| <code>Get-Service | Where {$_ -match "exchange"} | Restart-Service</code><br />
 | ||
| <code>Get-MailboxDatabase -Server exch-01</code> список баз данных на
 | ||
| MX-сервере<br />
 | ||
| <code>New-MoveRequest -Identity "support4" -TargetDatabase it_2022</code>
 | ||
| переместить почтовый ящик в новую БД<br />
 | ||
| <code>Move-Databasepath $db_name –EdbFilepath "F:\DB\$db_name\$db_name.edb" –LogFolderpath "E:\DB\$db_name\logs\"</code>
 | ||
| переместить БД и транзакционные логи на другой диск<br />
 | ||
| <code>Set-MailboxDatabase -CircularLoggingEnabled $true -Identity $db_name</code>
 | ||
| включить циклическое ведение журнала (Circular Logging), где
 | ||
| последовательно пишутся 4 файла логов по 5 МБ, после чего первый
 | ||
| лог-файл перезаписывается<br />
 | ||
| <code>Set-MailboxDatabase -CircularLoggingEnabled $false -Identity $db_name</code>
 | ||
| отключить циклическое ведение журнала<br />
 | ||
| <code>Get-MailboxDatabase -Server "exch-mx-01" -Status | select EdbFilePath,LogFolderPath,LogFilePrefix</code>
 | ||
| путь к БД, логам, имя текущего актуального лог-файла</p>
 | ||
| <h3 id="mailboxrepairrequest">MailboxRepairRequest</h3>
 | ||
| <p><code>New-MailboxRepairRequest -Database it2 -CorruptionType ProvisionedFolder, SearchFolder, AggregateCounts, Folderview</code>
 | ||
| запустить последовательный тест (в конкретный момент времени не доступен
 | ||
| один почтовый ящик) и исправление ошибок на прикладном уровне<br />
 | ||
| <code>Get-MailboxRepairRequest -Database it2</code> прогресс
 | ||
| выполнения<br />
 | ||
| Позволяет исправить:<br />
 | ||
| ProvisionedFolder – нарушения логической структуры папок<br />
 | ||
| SearchFolder – ошибки в папках поиска<br />
 | ||
| AggregateCounts – проверка и исправление информации о количестве
 | ||
| элементов в папках и их размере<br />
 | ||
| FolderView – неверное содержимое, отображаемое представлениями папок</p>
 | ||
| <h3 id="eseutil">eseutil</h3>
 | ||
| <p>При отправке/получении любого письма Exchange сначала вносит
 | ||
| информацию в транзакционный лог, и только потом сохраняет элемент
 | ||
| непосредственно в базу данных. Размер одного лог файла - 1 Мб. Есть три
 | ||
| способа урезания логов: DAG, Backup на базе Volume Shadow Copy, Circular
 | ||
| Logging.</p>
 | ||
| <p>Ручное удаление журналов транзакций:<br />
 | ||
| <code>cd E:\MS_Exchange_2010\MailBox\Reg_v1_MailBoxes\</code> перейти в
 | ||
| каталог с логами<br />
 | ||
| <code>ls E*.chk</code> узнать имя файла, в котором находится информация
 | ||
| из контрольной точки фиксации журналов<br />
 | ||
| <code>eseutil /mk .\E18.chk</code> узнать последний файл журнала,
 | ||
| действия из которого были занесены в БД Exchange<br />
 | ||
| <code>Checkpoint: (0x561299,8,16)</code> 561299 имя файла, который был
 | ||
| последним зафиксирован (его информация уже в базе данных)<br />
 | ||
| Находим в проводнике файл E0500561299.txt, можно удалять все файлы
 | ||
| журналов, которые старше найденного файла</p>
 | ||
| <p>Восстановление БД (если две копии БД с ошибкой):<br />
 | ||
| <code>Get-MailboxDatabaseCopyStatus -Identity db_name\* | Format-List Name,Status,ContentIndexState</code><br />
 | ||
| Status : FailedAndSuspended<br />
 | ||
| ContentIndexState : Failed<br />
 | ||
| Status : Dismounted<br />
 | ||
| ContentIndexState : Failed</p>
 | ||
| <p><code>Get-MailboxDatabase -Server exch-mx-01 -Status | fl Name,EdbFilePath,LogFolderPath</code>
 | ||
| проверить расположение базы и транзакционных логов<br />
 | ||
| LogFolderPath - директория логов<br />
 | ||
| E18 - имя транкзакционного лога (из него читаются остальные логи)<br />
 | ||
| <code>dismount-Database db_name</code> отмантировать БД<br />
 | ||
| <code>eseutil /mh D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb</code>
 | ||
| проверить базу<br />
 | ||
| State: Dirty Shutdown - несогласованное состояние, означает, что часть
 | ||
| транзакций не перенесена в базу, например, после того, как была
 | ||
| осуществлена аварийная перезагрузка сервера.<br />
 | ||
| <code>eseutil /ml E:\MS_Exchange_2010\MailBox\db_name\E18</code>
 | ||
| проверка целостности транзакционных логи, если есть логи транзакций и
 | ||
| они не испорчены, то можно восстановить из них, из файла E18 считываются
 | ||
| все логи, должен быть статус - ОК</p>
 | ||
| <p>Soft Recovery (мягкое восстановление) - необходимо перевести базу в
 | ||
| состояние корректного отключения (Clear shutdown) путем записи
 | ||
| недостающих файлов журналов транзакций в БД.<br />
 | ||
| <code>eseutil /R E18 /l E:\MS_Exchange_2010\MailBox\db_name\ /d D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb</code><br />
 | ||
| <code>eseutil /R E18 /a /i /l E:\MS_Exchange_2010\MailBox\db_name\ /d D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb</code>
 | ||
| если с логами что-то не так, можно попробовать восстановить базу
 | ||
| игнорируя ошибку в логах<br />
 | ||
| <code>eseutil /mk D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb</code>
 | ||
| cостоянии файла контрольных точек<br />
 | ||
| <code>eseutil /g D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb</code>
 | ||
| проверка целостности БД<br />
 | ||
| <code>eseutil /k D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb</code>
 | ||
| проверка контрольных сумм базы (CRC)</p>
 | ||
| <p>Hard Recovery - если логи содержат ошибки и база не
 | ||
| восстанавливается, то восстанавливаем базу без логов.<br />
 | ||
| <code>eseutil /p D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb</code><br />
 | ||
| /p - удалит поврежденные страницы, эта информация будет удалена из БД и
 | ||
| восстановит целостность<br />
 | ||
| <code>esetuil /d D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb</code>
 | ||
| выполнить дефрагментацию (если был потерян большой объем данных, то
 | ||
| может сильно снизиться производительность)<br />
 | ||
| После выполнения команд необходимо вручную удалить все файлы с
 | ||
| расширением log в папке MDBDATA, перед попыткой смонтировать базу
 | ||
| данных.<br />
 | ||
| <code>isinteg -s "db_name.edb" -test alltests</code> проверьте
 | ||
| целостность базы данных<br />
 | ||
| <code>isinteg -s "server_name" -fix -test -alltests</code> если проверка
 | ||
| будет провалена. Выполнять команду до тех пор, пока у всех ошибок не
 | ||
| станет статус 0 или статус не перестанет меняться, иногда необходимо 3
 | ||
| прохода для достижения результата.<br />
 | ||
| <code>eseutil /mh D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb | Select-String -Pattern "State:","Log Required:"</code>
 | ||
| проверить статус<br />
 | ||
| State: Clear shutdown - успешный статус<br />
 | ||
| <code>Log Required</code> требуются ли файлы журналов, необходимые базе,
 | ||
| чтобы перейти в согласованное состояние. Если база размонтирована
 | ||
| корректно, то это значение будет равняться 0.<br />
 | ||
| <code>mount-Database -force db_name</code> примонтировать БД<br />
 | ||
| <code>Get-MailboxDatabase –Status db_name | fl Mounted</code> статус
 | ||
| БД<br />
 | ||
| <code>New-MailboxRepairRequest -Database db_name -CorruptionType SearchFolder,AggregateCounts,ProvisionedFolder,FolderView</code>
 | ||
| восстановление логической целостности данных<br />
 | ||
| После этого восстановить Index.<br />
 | ||
| Если индексы не восстанавливаются, но БД монтируется, то перенести
 | ||
| почтовые ящики в новую БД.</p>
 | ||
| <p>Восстановление БД из Backup:</p>
 | ||
| <p>1-й вариант: 1. Отмантировать текущую БД и удалить или переименовать
 | ||
| директорию с файлами текущей БД. 3. Восстановить в ту же директорию из
 | ||
| Backup базу с логами. 4. Запустить мягкое восстановление БД (Soft
 | ||
| Recovery). 5. Примониторвать.</p>
 | ||
| <p>2-й вариант: 1. Отмантировать и удалить текущую БД. 2. Восстановить
 | ||
| БД с логами из Backup в любое место. 3. Запустить мягкое восстановление
 | ||
| БД (Soft Recovery). 4. Создать новую БД. 5. Создать Recovery Database и
 | ||
| смонтировать в нее восстановленную из бэкапа БД, скопировать из неё
 | ||
| почтовые ящики в новую БД и переключить на них пользователей. 6. Если
 | ||
| использовать Dial Tone Recovery, то так же перенести из временной БД
 | ||
| промежуточные данные почтовых ящиков.</p>
 | ||
| <p>3-й вариант: 1. Восстановить целостность Soft Repair или Hard
 | ||
| Recovery. 2. Создать новую БД. Указывать в свойствах: «база может быть
 | ||
| перезаписана при восстановлении». 3. Если база была только что оздана и
 | ||
| еще не была подмонтирована, то эта папка будет пуста, туда перемещаем
 | ||
| базу из Backup, которая была обработана ESEUTIL вместе со всеми файлами.
 | ||
| Указать имя .edb такое же, которое было при создании новой базы. 4.
 | ||
| Монтируем базу. 5. Перенацеливаем ящики со старой (Mailbox_DB_02),
 | ||
| неисправной базы, на новую базу (Mailbox_DB_02_02):
 | ||
| <code>Get-Mailbox -Database Mailbox_DB_02 | where {$_.ObjectClass -NotMatch '(SystemAttendantMailbox|ExOleDbSystemMailbox)'} | Set-Mailbox -Database Mailbox_DB_02_02</code>
 | ||
| 6. Восстановление логической целостности данных:
 | ||
| <code>New-MailboxRepairRequest -Database "Mailbox_DB_02_02" -CorruptionType ProvisionedFolder, SearchFolder, AggregateCounts, Folderview</code></p>
 | ||
| <h3 id="dial-tone-recovery">Dial Tone Recovery</h3>
 | ||
| <p><code>Get-Mailbox -Database "MailboxDB" | Set-Mailbox -Database "TempDB"</code>
 | ||
| перенацелить ящики с одной БД (нерабочей) на другую (пустую)<br />
 | ||
| <code>Get-Mailbox -Database TempDB</code> отобразить почтовые ящики в БД
 | ||
| TempDB<br />
 | ||
| <code>Restart-Service MSExchangeIS</code> перезапустить службу Mailbox
 | ||
| Information Store (банка данных), иначе пользователи будут по-прежнему
 | ||
| пытаться подключиться к старой БД<br />
 | ||
| <code>iisreset</code><br />
 | ||
| <code>Get-Mailbox -Database "TempDB" | Set-Mailbox -Database "MailboxDB"</code>
 | ||
| после восстановления старой БД, нужно переключить пользователей с
 | ||
| временной БД обратно<br />
 | ||
| После этого сделать слияние с временной БД с помощью Recovery.</p>
 | ||
| <h3 id="recovery-database-rdb">Recovery database (RDB)</h3>
 | ||
| <p><code>New-MailboxDatabase –Recovery –Name RecoveryDB –Server $exch_mx –EdbFilePath "D:\TempDB\TempDB.edb" -LogFolderPath "D:\TempDB"</code>
 | ||
| для переноса новых писем из временной БД в основную необходим только сам
 | ||
| файл TempDB.edb со статусом Clean Shutdown, из нее необходимо создать
 | ||
| служебную БД (ключ -Recovery)<br />
 | ||
| <code>Mount-Database "D:\TempDB\TempDB.edb"</code> примонтировать
 | ||
| БД<br />
 | ||
| <code>Get-MailboxStatistics -Database RecoveryDB</code><br />
 | ||
| <code>New-MailboxRestoreRequest –SourceDatabase RecoveryDB –SourceStoreMailbox support –TargetMailbox support</code>
 | ||
| скопировать данные почтового ящика с DisplayName: support из RecoveryDB
 | ||
| в почтовый ящик с псевдонимом support существующей базы. По умолчанию
 | ||
| ищет в почтовой базе совпадающие LegacyExchangeDN либо проверяет
 | ||
| совпадение адреса X500, если нужно восстановить данные в другой ящик,
 | ||
| нужно указывать ключ -AllowLegacyDNMisMatch<br />
 | ||
| <code>New-MailboxRestoreRequest –SourceDatabase RecoveryDB –SourceStoreMailbox support –TargetMailbox support –TargetRootFolder "Restore"</code>
 | ||
| скопировать письма в отдельную папку в ящике назначения (создается
 | ||
| автоматически), возможно восстановить содержимое конкретной папки
 | ||
| -IncludeFolders “#Inbox#”<br />
 | ||
| <code>Get-MailboxRestoreRequest | Get-MailboxRestoreRequestStatistics</code>
 | ||
| статус запроса восстановления<br />
 | ||
| <code>Get-MailboxRestoreRequestStatistics -Identity support</code><br />
 | ||
| <code>Get-MailboxRestoreRequest -Status Completed | Remove-MailboxRestoreRequest</code>
 | ||
| удалить все успешные запросы</p>
 | ||
| <h3 id="transport">Transport</h3>
 | ||
| <p><code>Get-TransportServer $srv_cas | select MaxConcurrentMailboxDeliveries,MaxConcurrentMailboxSubmissions,MaxConnectionRatePerMinute,MaxOutboundConnections,MaxPerDomainOutboundConnections,PickupDirectoryMaxMessagesPerMinute</code>
 | ||
| настройки пропускной способности транспортного сервера<br />
 | ||
| MaxConcurrentMailboxDeliveries — максимальное количество одновременных
 | ||
| потоков, которое может открыть сервер для отправки писем.<br />
 | ||
| MaxConcurrentMailboxSubmissions — максимальное количество одновременных
 | ||
| потоков, которое может открыть сервер для получения писем.<br />
 | ||
| MaxConnectionRatePerMinute — максимальное возможная скорость открытия
 | ||
| входящих соединений в минуту.<br />
 | ||
| MaxOutboundConnections — максимальное возможное количество соединений,
 | ||
| которое может открыть Exchange для отправки.<br />
 | ||
| MaxPerDomainOutboundConnections — максимальное возможное количество
 | ||
| исходящих соединений, которое может открыть Exchange для одного
 | ||
| удаленного домена.<br />
 | ||
| PickupDirectoryMaxMessagesPerMinute — скорость внутренней обработки
 | ||
| сообщений в минуту (распределение писем по папкам).<br />
 | ||
| <code>Set-TransportServer exchange-cas -MaxConcurrentMailboxDeliveries 21 -MaxConcurrentMailboxSubmissions 21 -MaxConnectionRatePerMinute 1201 -MaxOutboundConnections 1001 -MaxPerDomainOutboundConnections 21 -PickupDirectoryMaxMessagesPerMinute 101</code>
 | ||
| изменить значения</p>
 | ||
| <p><code>Get-TransportConfig | select MaxSendSize, MaxReceiveSize</code>
 | ||
| ограничение размера сообщения на уровне траспорта (наименьший приоритет,
 | ||
| после коннектора и почтового ящика).<br />
 | ||
| <code>New-TransportRule -Name AttachmentLimit -AttachmentSizeOver 15MB -RejectMessageReasonText "Sorry, messages with attachments over 15 MB are not accepted"</code>
 | ||
| создать транспортное правило для проверки размера вложения</p>
 | ||
| <h3 id="connector">Connector</h3>
 | ||
| <p><code>Get-ReceiveConnector | select Name,MaxMessageSize,RemoteIPRanges,WhenChanged</code>
 | ||
| ограничения размера сообщения на уровне коннектора (приоритет ниже, чем
 | ||
| у почтового ящика)<br />
 | ||
| <code>Set-ReceiveConnector ((Get-ReceiveConnector).Identity)[-1] -MaxMessageSize 30Mb</code>
 | ||
| изменить размер у последнего коннектора в списке (приоритет выше, чем у
 | ||
| траспорта)<br />
 | ||
| <code>Get-Mailbox "support4" | select MaxSendSize, MaxReceiveSize</code>
 | ||
| наивысший приоритет<br />
 | ||
| <code>Set-Mailbox "support4" -MaxSendSize 30MB -MaxReceiveSize 30MB</code>
 | ||
| изменить размер</p>
 | ||
| <p><code>Set-SendConnector -Identity "ConnectorName" -Port 26</code>
 | ||
| изменить порт коннектора отправки<br />
 | ||
| <code>Get-SendConnector "proxmox" | select port</code></p>
 | ||
| <p><code>Get-ReceiveConnector | select Name,MaxRecipientsPerMessage</code>
 | ||
| по умолчанию Exchange принимает ограниченное количество адресатов в
 | ||
| одном письме (200)<br />
 | ||
| <code>Set-ReceiveConnector ((Get-ReceiveConnector).Identity)[-1] -MaxRecipientsPerMessage 50</code>
 | ||
| изменить значение<br />
 | ||
| <code>Set-ReceiveConnector ((Get-ReceiveConnector).Identity)[-1] -MessageRateLimit 1000</code>
 | ||
| задать лимит обработки сообщений в минуту для коннектора</p>
 | ||
| <p><code>Get-OfflineAddressbook | Update-OfflineAddressbook</code>
 | ||
| обновить OAB<br />
 | ||
| <code>Get-ClientAccessServer | Update-FileDistributionService</code></p>
 | ||
| <h3 id="pst">PST</h3>
 | ||
| <p><code>New-MailboxExportRequest -Mailbox $name -filepath "\\$srv\pst\$name.PST" # -ContentFilter {(Received -lt "01/01/2021")} -Priority Highest/Lower # -IsArchive</code>
 | ||
| выполнить экспорт из архива пользователя<br />
 | ||
| <code>New-MailboxExportRequest -Mailbox $name -IncludeFolders "#Inbox#" -FilePath "\\$srv\pst\$name.PST"</code>
 | ||
| только папку входящие<br />
 | ||
| <code>New-MailboxImportRequest -Mailbox $name "\\$srv\pst\$name.PST"</code>
 | ||
| импорт из PST<br />
 | ||
| <code>Get-MailboxExportRequest</code> статус запросов<br />
 | ||
| <code>Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest</code>
 | ||
| удалить успешно завершенные запросы<br />
 | ||
| <code>Remove-MailboxExportRequest -RequestQueue MBXDB01 -RequestGuid 25e0eaf2-6cc2-4353-b83e-5cb7b72d441f</code>
 | ||
| отменить экспорт</p>
 | ||
| <h3 id="distributiongroup">DistributionGroup</h3>
 | ||
| <p><code>Get-DistributionGroup</code> список групп рассылки<br />
 | ||
| <code>Get-DistributionGroupMember "!_Офис"</code> список пользователей в
 | ||
| группе<br />
 | ||
| <code>Add-DistributionGroupMember -Identity "!_Офис" -Member "$name@$domain"</code>
 | ||
| добавить в группу рассылки<br />
 | ||
| <code>Remove-DistributionGroupMember -Identity "!_Офис" -Member "$name@$domain"</code><br />
 | ||
| <code>New-DistributionGroup -Name "!_Тест" -Members "$name@$domain"</code>
 | ||
| создать группу<br />
 | ||
| <code>Set-DistributionGroup -Identity "support4" -HiddenFromAddressListsEnabled $true (или Set-Mailbox)</code>
 | ||
| скрыть из списка адресов Exchange</p>
 | ||
| <h3 id="search">Search</h3>
 | ||
| <p><code>Search-Mailbox -Identity "support4" -SearchQuery 'Тема:"Mikrotik DOWN"'</code>
 | ||
| поиск писем по теме<br />
 | ||
| <code>Search-Mailbox -Identity "support4" -SearchQuery 'Subject:"Mikrotik DOWN"'</code><br />
 | ||
| <code>Search-Mailbox -Identity "support4" -SearchQuery 'attachment -like:"*.rar"'</code><br />
 | ||
| <code>Search-Mailbox -Identity "support4" -SearchQuery "отправлено: < 01/01/2020" -DeleteContent -Force</code>
 | ||
| удаление писем по дате</p>
 | ||
| <p>Формат даты в зависимости от региональных настроек сервера:<br />
 | ||
| <code>20/07/2018</code><br />
 | ||
| <code>07/20/2018</code><br />
 | ||
| <code>20-Jul-2018</code><br />
 | ||
| <code>20/July/2018</code></p>
 | ||
| <h3 id="auditlog">AuditLog</h3>
 | ||
| <p><code>Get-AdminAuditLogConfig</code> настройки аудита<br />
 | ||
| <code>Set-Mailbox -Identity "support4" -AuditOwner HardDelete</code>
 | ||
| добавить логирование HardDelete писем<br />
 | ||
| <code>Set-mailbox -identity "support4" -AuditlogAgelimit 120</code>
 | ||
| указать время хранения<br />
 | ||
| <code>Get-mailbox -identity "support4" | Format-list Audit*</code>
 | ||
| данные аудита<br />
 | ||
| <code>Search-MailboxAuditLog -Identity "support4" -LogonTypes Delegate -ShowDetails -Start "2022-02-22 18:00" -End "2022-03-22 18:00"</code>
 | ||
| просмотр логов<br />
 | ||
| <code>Search-AdminAuditLog -StartDate "02/20/2022" | ft CmdLetName,Caller,RunDate,ObjectModified -Autosize</code>
 | ||
| поиск событий истории выполненых команд в журнале аудита Exchange</p>
 | ||
| <h3 id="test">Test</h3>
 | ||
| <p><code>Test-ServiceHealth</code> проверить доступность ролей сервера:
 | ||
| почтовых ящиков, клиентского доступа, единой системы обмена сообщениями,
 | ||
| траспортного сервера<br />
 | ||
| <code>$mx_srv_list | %{Test-MapiConnectivity -Server $_}</code> проверка
 | ||
| подключения MX-серверов к БД<br />
 | ||
| <code>Test-MAPIConnectivity -Database $db</code> проверка возможности
 | ||
| логина в базу<br />
 | ||
| <code>Test-MAPIConnectivity –Identity $user@$domain</code> проверка
 | ||
| возможности логина в почтовый ящик<br />
 | ||
| <code>Test-ComputerSecureChannel</code> проверка работы службы AD<br />
 | ||
| <code>Test-MailFlow</code> результат тестового потока почты</p>
 | ||
| <h3 id="queue">Queue</h3>
 | ||
| <p><code>Get-TransportServer | %{Get-Queue -Server $_.Name}</code>
 | ||
| отобразить очереди на всех транспортных серверах<br />
 | ||
| <code>Get-Queue -Identity EXCHANGE-CAS\155530 | Format-List</code>
 | ||
| подробная информация об очереди<br />
 | ||
| <code>Get-Queue -Identity EXCHANGE-CAS\155530 | Get-Message -ResultSize Unlimited | Select FromAddress,Recipients</code>
 | ||
| отобразить список отправителей (FromAddress) и список получателей в
 | ||
| очереди (Recipients)<br />
 | ||
| <code>Get-Message -Queue EXCHANGE-CAS\155530</code> отобразить
 | ||
| индентификатор сообщений в конкретной очереди (серверписьма)<br />
 | ||
| <code>Resume-Message EXCHANGE-CAS\155530\444010</code> повторить
 | ||
| отправку письма из очереди<br />
 | ||
| <code>Retry-Queue -Filter {Status -eq "Retry"}</code> принудительно
 | ||
| повторить отправку всех сообщений c статусом “Повторить”<br />
 | ||
| <code>Get-Queue -Identity EXCHANGE-CAS\155530 | Get-Message -ResultSize unlimited | Remove-Message -WithNDR $False</code>
 | ||
| очистить очередь<br />
 | ||
| <code>Get-transportserver EXCHANGE-CAS | Select MessageExpirationTimeout</code>
 | ||
| отобразить время жизни сообщений в очереди (по умолчанию, 2 дня)</p>
 | ||
| <p>Error Exchange 452 4.3.1 Insufficient system resources - окончание
 | ||
| свободного места на диске, на котором находятся очереди службы Exchange
 | ||
| Hub Transport, за мониторинг отвечает компонент доступных ресурсов Back
 | ||
| Pressure, который в том числе отслеживает свободное место на диске<br />
 | ||
| Порог Medium (90%) — перестать принимать по SMTP почту от внешних
 | ||
| отправителей (почта от MAPI клиентов при этом обрабатывается)<br />
 | ||
| Порог High (99%) — обработка потока почты полностью прекращается<br />
 | ||
| Решение: очистить, например логи IIS (C:3SVC1), увеличить размер диска,
 | ||
| отключить мониторинг Back Pressure (плохой вариант) или перенести
 | ||
| транспортные очередь на другой диск достаточного объёма.</p>
 | ||
| <p><code>Get-Service | ? name -like "MSExchangeTransport" | Stop-Service</code>
 | ||
| остановить служу очереди<br />
 | ||
| <code>Rename-Item "C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\data\Queue" "C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\data\Queue_old"</code>
 | ||
| очистить базу очереди<br />
 | ||
| <code>C:\Program Files\Microsoft\Exchange Server\V15\Bin\EdgeTransport.exe.config</code>
 | ||
| конфигурационный файл, который содержит путь к бд с очередью (блок
 | ||
| <appSettings> ключи <add key="QueueDatabasePath" value="$new_path" /> и
 | ||
| QueueDatabaseLoggingPath)<br />
 | ||
| Для переноса БД, необходимо переместить существующие файлы базы данных
 | ||
| Mail.que и Trn.chk (контрольные точки для отслеживания записи в логах)
 | ||
| из исходного местоположения в новое. Переместите существующие файлы
 | ||
| журнала транзакций Trn.log, Trntmp.log, Trn nnnn.log , Trnres00001.jrs,
 | ||
| Trnres00002.jrs и Temp.edb из старого расположения в новое. tmp.edb —
 | ||
| временный файл для проверки схемы самой базы, перености не нужно.<br />
 | ||
| После запуска службы транспорта удалить старую базу данных очереди и
 | ||
| файлы журнала транзакций из старого расположения.</p>
 | ||
| <h3 id="defrag">Defrag</h3>
 | ||
| <p><code>Get-MailboxDatabase -Status | ft Name, DatabaseSize, AvailableNewMailboxSpace</code><br />
 | ||
| DatabaseSize - текущий размер базы<br />
 | ||
| AvailableNewMailboxSpace - объём пустых страниц, пространство, которое
 | ||
| можно освободить при дефрагментации<br />
 | ||
| (DatabaseSize — AvailableNewMailboxSpace) x 1,1 - необходимо
 | ||
| дополнительно иметь свободного места не менее 110% от текущего размера
 | ||
| базы (без учета пустых страниц)<br />
 | ||
| <code>cd $path</code><br />
 | ||
| <code>Dismount-Database "$path\$db_name"</code> отмонтировать БД<br />
 | ||
| <code>eseutil /d "$path\$db_name.edb"</code><br />
 | ||
| <code>Mount-Database "$path\$db"</code> примонтировать БД</p>
 | ||
| <h3 id="dag-database-availability-group">DAG (Database Availability
 | ||
| Group)</h3>
 | ||
| <p><code>Install-WindowsFeature -Name Failover-Clustering -ComputerName EXCH-MX-01</code>
 | ||
| основывается на технологии Windows Server Failover Cluster<br />
 | ||
| <code>New-DatabaseAvailabilityGroup -Name dag-01 -WitnessServer fs-05 -WitnessDirectory C:\witness_exchange1</code>
 | ||
| создать группу с указанием файлового свидетеля для кворума<br />
 | ||
| Quorum - это процесс голосования, в котором для принятия решения нужно
 | ||
| иметь большинство голосов, что бы сделать текущую копию базы данных
 | ||
| активной.<br />
 | ||
| WitnessDirectory — используется для хранения данных файлового
 | ||
| ресурса-свидетеля.<br />
 | ||
| <code>Set-DatabaseAvailabilityGroup dag-01 –DatabaseAvailabilityGroupIPAdress $ip</code>
 | ||
| изменить ip-адрес группы<br />
 | ||
| <code>Get-DatabaseAvailabilityGroup</code> список всех групп<br />
 | ||
| <code>Get-DatabaseAvailabilityGroup -Identity dag-01</code><br />
 | ||
| <code>Add-DatabaseAvailabilityGroupServer -Identity dag-01 -MailboxServer EXCH-MX-01</code>
 | ||
| добавить первый сервер (все БД на серверах в DAG должны храниться по
 | ||
| одинаковому пути)<br />
 | ||
| <code>Add-MailboxDatabaseCopy -Identity db_name -MailboxServer EXCH-MX-04</code>
 | ||
| добавить копию БД<br />
 | ||
| <code>Get-MailboxDatabaseCopyStatus -Identity db_name\* | select Name,Status,LastInspectedLogTime</code>
 | ||
| статус и время последнего копирования журнала транзакий</p>
 | ||
| <p>Status:<br />
 | ||
| Mounted - рабочая база<br />
 | ||
| Suspended - приостановлено копирование<br />
 | ||
| Healthy - рабочая пассивная копия<br />
 | ||
| ServiceDown - недоступна (выключен сервер)<br />
 | ||
| Dismounted - отмонтирована<br />
 | ||
| FailedAndSuspended - ошибка и приостановка копирования<br />
 | ||
| Resynchronizing - процесс синхронизация, где будет постепенно
 | ||
| уменьшаться длина очереди<br />
 | ||
| CopyQueue Length - длина репликационной очереди копирования (0 - значит
 | ||
| все изменения из активной базы реплицированы в пассивную копию)</p>
 | ||
| <p><code>Resume-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04</code>
 | ||
| возобновить (Resume) или запустить копирование бд на EXCH-MX-04 (из
 | ||
| статуса Suspended в Healthy)<br />
 | ||
| <code>Suspend-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04</code>
 | ||
| остановить копирование (в статус Suspended)<br />
 | ||
| <code>Update-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04 -DeleteExistingFiles</code>
 | ||
| обновить копию БД (сделать Full Backup)<br />
 | ||
| <code>Set-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04 -ActivationPreference 1</code>
 | ||
| изменить приоритет для активации копий БД (какую использовать, 1 – самое
 | ||
| высокое значение)<br />
 | ||
| <code>Move-ActiveMailboxDatabase db_name -ActivateOnServer EXCH-MX-04 -MountDialOverride:None -Confirm:$false</code>
 | ||
| включить копию БД в DAG (переключиться на активную копию)<br />
 | ||
| <code>Remove-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04 -Confirm:$False</code>
 | ||
| удалить копии пассивной базы в DAG-группе (у БД должно быть отключено
 | ||
| ведение циклического журнала)<br />
 | ||
| <code>Remove-DatabaseAvailabilityGroupServer -Identity dag-01 -MailboxServer EXCH-MX-04 -ConfigurationOnly</code>
 | ||
| удалить MX сервер из группы DAG<br />
 | ||
| <code>Import-Module FailoverClusters</code><br />
 | ||
| <code>Get-ClusterNode EXCH-MX-04 | Remove-ClusterNode -Force</code>
 | ||
| удалить отказавший узел из Windows Failover Cluster</p>
 | ||
| <p><code>Get-DatabaseAvailabilityGroup | Get-DatabaseAvailabilityGroupHealth</code>
 | ||
| мониторинг</p>
 | ||
| <h3 id="index-1">Index</h3>
 | ||
| <p><code>Get-MailboxDatabaseCopyStatus * | select name,status,ContentIndexState,ContentIndexErrorMessage,ActiveDatabaseCopy,LatestCopyBackupTime,CopyQueueLength</code>
 | ||
| узнать состояние работы индксов БД и текст ошибки, на каком сервере
 | ||
| активная копия БД, дата последней копии и текущая очередь<br />
 | ||
| <code>Get-MailboxDatabaseCopyStatus -Identity $db_name\* | Format-List Name,ContentIndexState</code>
 | ||
| отобразить список всех копий конкретной БД на всех серверах, и статус их
 | ||
| индексов, если у второго сервера статус Healthy, можно восстановить из
 | ||
| него<br />
 | ||
| <code>Get-MailboxDatabaseCopyStatus -Identity $db_name\EXCH-MX-04 | Update-MailboxDatabaseCopy -SourceServer EXCH-MX-01 -CatalogOnly</code>
 | ||
| восстановить БД из копии<br />
 | ||
| <code>cd %PROGRAMFILES%\Microsoft\Exchange Server\V14\Scripts</code> или
 | ||
| v15 для Exchange 2016<br />
 | ||
| <code>.\ResetSearchIndex.ps1 $db_name</code> скрипт восстановления
 | ||
| индекса</p>
 | ||
| <p><code>Get-MailboxDatabaseCopyStatus * | where {$_.ContentIndexState -eq "Failed" -or $_.ContentIndexState -eq "FailedAndSuspended"}</code>
 | ||
| отобразить у какой БД произошел сбой работы (FailedAndSuspended) или
 | ||
| индекса (ContentIndexState)</p>
 | ||
| <h1 id="truenas">TrueNAS</h1>
 | ||
| <p><code>import-Module TrueNas</code><br />
 | ||
| <code>(Get-Module TrueNas).ExportedCommands</code><br />
 | ||
| <code>Connect-TrueNasServer -Server tnas-01 -SkipCertificateCheck</code><br />
 | ||
| <code>Get-TrueNasCertificate</code> настройки сертификата<br />
 | ||
| <code>Get-TrueNasSetting</code> настройки языка, time zone, syslog level
 | ||
| и server, https port<br />
 | ||
| <code>Get-TrueNasUser</code> список пользователей<br />
 | ||
| <code>Get-TrueNasSystemVersion</code> характеристики (Physical Memory,
 | ||
| Model, Cores) и Uptime<br />
 | ||
| <code>Get-TrueNasSystemAlert</code> snmp для оповещений<br />
 | ||
| <code>Get-TrueNasSystemNTP</code> список используемых NTP серверов<br />
 | ||
| <code>Get-TrueNasDisk</code> список разделов физического диска<br />
 | ||
| <code>Get-TrueNasInterface</code> сетевые интерфейсы<br />
 | ||
| <code>Get-TrueNasGlobalConfig</code> сетевые настройки<br />
 | ||
| <code>Get-TrueNasDnsServer</code> настроенные DNS-сервера<br />
 | ||
| <code>Get-TrueNasIscsiTarget</code> отобразить ID группы инициаторов
 | ||
| использующих таргет, используемый portal, authentification и
 | ||
| authen-method<br />
 | ||
| <code>Get-TrueNasIscsiInitiator</code> отобразить группы
 | ||
| инициаторов<br />
 | ||
| <code>Get-TrueNasIscsiPortal</code> слушатель (Listen) и порт<br />
 | ||
| <code>Get-TrueNasIscsiExtent</code> список ISCSi Target (статус работы,
 | ||
| путь)<br />
 | ||
| <code>Get-TrueNasPool</code> список pool (Id, Path, Status,
 | ||
| Healthy)<br />
 | ||
| <code>Get-TrueNasVolume -Type FILESYSTEM</code> список pool файловых
 | ||
| систем<br />
 | ||
| <code>Get-TrueNasVolume -Type VOLUME</code> список разделов в pool и их
 | ||
| размер<br />
 | ||
| <code>Get-TrueNasService | ft</code> список служб и их статус<br />
 | ||
| <code>Start-TrueNasService ssh</code> запустить службу<br />
 | ||
| <code>Stop-TrueNasService ssh</code> остановить службу</p>
 | ||
| <h1 id="veeam">Veeam</h1>
 | ||
| <p><code>Set-ExecutionPolicy AllSigned</code> or Set-ExecutionPolicy
 | ||
| Bypass -Scope Process<br />
 | ||
| <code>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'))</code><br />
 | ||
| <code>choco install veeam-backup-and-replication-console</code><br />
 | ||
| <code>Get-Module Veeam.Backup.PowerShell</code><br />
 | ||
| <code>Get-Command -Module Veeam.Backup.PowerShell</code> or
 | ||
| Get-VBRCommand<br />
 | ||
| <code>Connect-VBRServer -Server $srv -Credential $cred</code> or -User
 | ||
| and -Password<code>- Port 9392</code> default<br />
 | ||
| <code>Get-VBRJob</code><br />
 | ||
| <code>Get-VBRCommand *get*backup*</code><br />
 | ||
| <code>Get-VBRComputerBackupJob</code><br />
 | ||
| <code>Get-VBRBackup</code><br />
 | ||
| <code>Get-VBRBackupRepository</code><br />
 | ||
| <code>Get-VBRBackupSession</code><br />
 | ||
| <code>Get-VBRBackupServerCertificate</code><br />
 | ||
| <code>Get-VBRRestorePoint</code><br />
 | ||
| <code>Get-VBRViProxy</code></p>
 | ||
| <h1 id="rest-api">REST API</h1>
 | ||
| <p><code>$url = "https://habr.com/ru/rss/users/Lifailon/publications/articles/?fl=ru"</code>
 | ||
| RSS лента публикаций на Habr<br />
 | ||
| <code>Invoke-RestMethod $url</code><br />
 | ||
| <code>$iwr = Invoke-WebRequest -Uri $url</code><br />
 | ||
| <code>$iwr | Get-Member</code><br />
 | ||
| <code>$iwr.Content</code><br />
 | ||
| <code>$iwr.StatusCode -eq 200</code><br />
 | ||
| <code>$iwr.Headers</code><br />
 | ||
| <code>$iwr.ParsedHtml | Select lastModified</code><br />
 | ||
| <code>$iwr.Links | fl title,innerText,href</code><br />
 | ||
| <code>$iwr.Images.src</code></p>
 | ||
| <h3 id="methods">Methods</h3>
 | ||
| <p><strong>GET</strong> - Read<br />
 | ||
| <strong>POST</strong> - Create<br />
 | ||
| <strong>PATCH</strong> - Partial update/modify<br />
 | ||
| <strong>PUT</strong> - Update/replace<br />
 | ||
| <strong>DELETE</strong> - Remove</p>
 | ||
| <h3 id="download-image">Download Image</h3>
 | ||
| <div class="sourceCode" id="cb40"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb40-1"><a href="#cb40-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Download-Image <span class="op">{</span></span>
 | ||
| <span id="cb40-2"><a href="#cb40-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span> <span class="op">(</span></span>
 | ||
| <span id="cb40-3"><a href="#cb40-3" aria-hidden="true" tabindex="-1"></a>    <span class="op">[</span>Parameter<span class="op">(</span>Mandatory <span class="op">=</span> <span class="va">$True</span><span class="op">)]</span><span class="va">$url</span></span>
 | ||
| <span id="cb40-4"><a href="#cb40-4" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
 | ||
| <span id="cb40-5"><a href="#cb40-5" aria-hidden="true" tabindex="-1"></a>    <span class="va">$folder</span> <span class="op">=</span> <span class="va">$url</span> <span class="op">-replace</span> <span class="st">"http.+://"</span> <span class="op">-replace</span> <span class="st">"/"</span><span class="op">,</span><span class="st">"-"</span> <span class="op">-replace</span> <span class="st">"-$"</span></span>
 | ||
| <span id="cb40-6"><a href="#cb40-6" aria-hidden="true" tabindex="-1"></a>    <span class="va">$path</span> <span class="op">=</span> <span class="st">"</span><span class="va">$home</span><span class="st">\Pictures\</span><span class="va">$folder</span><span class="st">"</span></span>
 | ||
| <span id="cb40-7"><a href="#cb40-7" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span><span class="fu">Test-Path</span> <span class="va">$path</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb40-8"><a href="#cb40-8" aria-hidden="true" tabindex="-1"></a>        <span class="fu">Remove-Item</span> <span class="va">$path</span> <span class="op">-</span>Recurse <span class="op">-</span>Force</span>
 | ||
| <span id="cb40-9"><a href="#cb40-9" aria-hidden="true" tabindex="-1"></a>        <span class="fu">New-Item</span> <span class="op">-</span>ItemType Directory <span class="va">$path</span> <span class="op">></span> <span class="va">$null</span></span>
 | ||
| <span id="cb40-10"><a href="#cb40-10" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span> <span class="cf">else</span> <span class="op">{</span></span>
 | ||
| <span id="cb40-11"><a href="#cb40-11" aria-hidden="true" tabindex="-1"></a>        <span class="fu">New-Item</span> <span class="op">-</span>ItemType Directory <span class="va">$path</span> <span class="op">></span> <span class="va">$null</span></span>
 | ||
| <span id="cb40-12"><a href="#cb40-12" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb40-13"><a href="#cb40-13" aria-hidden="true" tabindex="-1"></a>    <span class="va">$irm</span> <span class="op">=</span> <span class="fu">Invoke-WebRequest</span> <span class="op">-</span>Uri <span class="va">$url</span></span>
 | ||
| <span id="cb40-14"><a href="#cb40-14" aria-hidden="true" tabindex="-1"></a>    <span class="cf">foreach</span> <span class="op">(</span><span class="va">$img</span> <span class="kw">in</span> <span class="va">$irm</span><span class="op">.</span><span class="fu">Images</span><span class="op">.</span><span class="fu">src</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb40-15"><a href="#cb40-15" aria-hidden="true" tabindex="-1"></a>        <span class="va">$name</span> <span class="op">=</span> <span class="va">$img</span> <span class="op">-replace</span> <span class="st">".+/"</span></span>
 | ||
| <span id="cb40-16"><a href="#cb40-16" aria-hidden="true" tabindex="-1"></a>        <span class="fu">Start-Job</span> <span class="op">{</span></span>
 | ||
| <span id="cb40-17"><a href="#cb40-17" aria-hidden="true" tabindex="-1"></a>            <span class="fu">Invoke-WebRequest</span> <span class="va">$using</span><span class="op">:</span><span class="va">img</span> <span class="op">-</span>OutFile <span class="st">"</span><span class="va">$using</span><span class="op">:</span><span class="va">path</span><span class="st">\</span><span class="va">$using</span><span class="op">:</span><span class="va">name</span><span class="st">"</span></span>
 | ||
| <span id="cb40-18"><a href="#cb40-18" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span> <span class="op">></span> <span class="va">$null</span></span>
 | ||
| <span id="cb40-19"><a href="#cb40-19" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb40-20"><a href="#cb40-20" aria-hidden="true" tabindex="-1"></a>    <span class="cf">while</span> <span class="op">(</span><span class="va">$True</span><span class="op">){</span></span>
 | ||
| <span id="cb40-21"><a href="#cb40-21" aria-hidden="true" tabindex="-1"></a>        <span class="va">$status_job</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Job</span><span class="op">).</span><span class="fu">State</span><span class="op">[</span>-1<span class="op">]</span></span>
 | ||
| <span id="cb40-22"><a href="#cb40-22" aria-hidden="true" tabindex="-1"></a>        <span class="cf">if</span> <span class="op">(</span><span class="va">$status_job</span> <span class="op">-like</span> <span class="st">"Completed"</span><span class="op">){</span></span>
 | ||
| <span id="cb40-23"><a href="#cb40-23" aria-hidden="true" tabindex="-1"></a>        <span class="fu">Get-Job</span> <span class="op">|</span> <span class="fu">Remove-Job</span> <span class="op">-</span>Force</span>
 | ||
| <span id="cb40-24"><a href="#cb40-24" aria-hidden="true" tabindex="-1"></a>        <span class="cf">break</span></span>
 | ||
| <span id="cb40-25"><a href="#cb40-25" aria-hidden="true" tabindex="-1"></a>    <span class="op">}}</span></span>
 | ||
| <span id="cb40-26"><a href="#cb40-26" aria-hidden="true" tabindex="-1"></a>    <span class="va">$count_all</span> <span class="op">=</span> <span class="va">$irm</span><span class="op">.</span><span class="fu">Images</span><span class="op">.</span><span class="fu">src</span><span class="op">.</span><span class="fu">Count</span></span>
 | ||
| <span id="cb40-27"><a href="#cb40-27" aria-hidden="true" tabindex="-1"></a>    <span class="va">$count_down</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Item</span> <span class="va">$path</span>\<span class="op">*).</span><span class="fu">count</span></span>
 | ||
| <span id="cb40-28"><a href="#cb40-28" aria-hidden="true" tabindex="-1"></a>    <span class="st">"Downloaded </span><span class="va">$count_down</span><span class="st"> of </span><span class="va">$count_all</span><span class="st"> files to </span><span class="va">$path</span><span class="st">"</span></span>
 | ||
| <span id="cb40-29"><a href="#cb40-29" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>Download-Image -url https://losst.pro/</code></p>
 | ||
| <h3 id="token">Token</h3>
 | ||
| <div class="sourceCode" id="cb41"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb41-1"><a href="#cb41-1" aria-hidden="true" tabindex="-1"></a>https<span class="op">://</span>veeam-11<span class="op">:</span><span class="dv">9419</span><span class="op">/</span>swagger<span class="op">/</span>ui<span class="op">/</span>index<span class="op">.</span><span class="fu">html</span></span>
 | ||
| <span id="cb41-2"><a href="#cb41-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Header</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb41-3"><a href="#cb41-3" aria-hidden="true" tabindex="-1"></a><span class="st">"x-api-version"</span> <span class="op">=</span> <span class="st">"1.0-rev2"</span></span>
 | ||
| <span id="cb41-4"><a href="#cb41-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb41-5"><a href="#cb41-5" aria-hidden="true" tabindex="-1"></a><span class="va">$Body</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb41-6"><a href="#cb41-6" aria-hidden="true" tabindex="-1"></a><span class="st">"grant_type"</span> <span class="op">=</span> <span class="st">"password"</span></span>
 | ||
| <span id="cb41-7"><a href="#cb41-7" aria-hidden="true" tabindex="-1"></a><span class="st">"username"</span> <span class="op">=</span> <span class="st">"</span><span class="va">$login</span><span class="st">"</span></span>
 | ||
| <span id="cb41-8"><a href="#cb41-8" aria-hidden="true" tabindex="-1"></a><span class="st">"password"</span> <span class="op">=</span> <span class="st">"</span><span class="va">$password</span><span class="st">"</span></span>
 | ||
| <span id="cb41-9"><a href="#cb41-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb41-10"><a href="#cb41-10" aria-hidden="true" tabindex="-1"></a><span class="va">$vpost</span> <span class="op">=</span> <span class="fu">iwr</span> <span class="st">"https://veeam-11:9419/api/oauth2/token"</span> <span class="op">-</span>Method POST <span class="op">-</span>Headers <span class="va">$Header</span> <span class="op">-</span>Body <span class="va">$Body</span> <span class="op">-</span>SkipCertificateCheck</span>
 | ||
| <span id="cb41-11"><a href="#cb41-11" aria-hidden="true" tabindex="-1"></a><span class="va">$vtoken</span> <span class="op">=</span> <span class="op">((</span><span class="va">$vpost</span><span class="op">.</span><span class="fu">Content</span><span class="op">)</span> <span class="op">-split</span> <span class="st">'"'</span><span class="op">)[</span><span class="dv">3</span><span class="op">]</span></span></code></pre></div>
 | ||
| <h3 id="get">GET</h3>
 | ||
| <div class="sourceCode" id="cb42"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb42-1"><a href="#cb42-1" aria-hidden="true" tabindex="-1"></a><span class="va">$token</span> <span class="op">=</span> <span class="va">$vtoken</span> <span class="op">|</span> <span class="fu">ConvertTo-SecureString</span> <span class="op">-</span>AsPlainText –Force</span>
 | ||
| <span id="cb42-2"><a href="#cb42-2" aria-hidden="true" tabindex="-1"></a><span class="va">$vjob</span> <span class="op">=</span> <span class="fu">iwr</span> <span class="st">"https://veeam-11:9419/api/v1/jobs"</span> <span class="op">-</span>Method GET <span class="op">-</span>Headers <span class="va">$Header</span> <span class="op">-</span>Authentication Bearer <span class="op">-</span>Token <span class="va">$token</span> <span class="op">-</span>SkipCertificateCheck</span>
 | ||
| <span id="cb42-3"><a href="#cb42-3" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb42-4"><a href="#cb42-4" aria-hidden="true" tabindex="-1"></a><span class="va">$Header</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb42-5"><a href="#cb42-5" aria-hidden="true" tabindex="-1"></a><span class="st">"x-api-version"</span> <span class="op">=</span> <span class="st">"1.0-rev1"</span></span>
 | ||
| <span id="cb42-6"><a href="#cb42-6" aria-hidden="true" tabindex="-1"></a><span class="st">"Authorization"</span> <span class="op">=</span> <span class="st">"Bearer </span><span class="va">$vtoken</span><span class="st">"</span></span>
 | ||
| <span id="cb42-7"><a href="#cb42-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb42-8"><a href="#cb42-8" aria-hidden="true" tabindex="-1"></a><span class="va">$vjob</span> <span class="op">=</span> <span class="fu">iwr</span> <span class="st">"https://veeam-11:9419/api/v1/jobs"</span> <span class="op">-</span>Method GET <span class="op">-</span>Headers <span class="va">$Header</span> <span class="op">-</span>SkipCertificateCheck</span>
 | ||
| <span id="cb42-9"><a href="#cb42-9" aria-hidden="true" tabindex="-1"></a><span class="va">$vjob</span> <span class="op">=</span> <span class="va">$vjob</span><span class="op">.</span><span class="fu">Content</span> <span class="op">|</span> <span class="fu">ConvertFrom-Json</span></span>
 | ||
| <span id="cb42-10"><a href="#cb42-10" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb42-11"><a href="#cb42-11" aria-hidden="true" tabindex="-1"></a><span class="va">$vjob</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="st">"https://veeam-11:9419/api/v1/jobs"</span> <span class="op">-</span>Method GET <span class="op">-</span>Headers <span class="va">$Header</span> <span class="op">-</span>SkipCertificateCheck</span>
 | ||
| <span id="cb42-12"><a href="#cb42-12" aria-hidden="true" tabindex="-1"></a><span class="va">$vjob</span><span class="op">.</span><span class="fu">data</span><span class="op">.</span><span class="fu">virtualMachines</span><span class="op">.</span><span class="fu">includes</span><span class="op">.</span><span class="fu">inventoryObject</span></span></code></pre></div>
 | ||
| <h1 id="pode">Pode</h1>
 | ||
| <div class="sourceCode" id="cb43"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb43-1"><a href="#cb43-1" aria-hidden="true" tabindex="-1"></a>Start-PodeServer <span class="op">{</span></span>
 | ||
| <span id="cb43-2"><a href="#cb43-2" aria-hidden="true" tabindex="-1"></a>    Add-PodeEndpoint <span class="op">-</span>Address localhost <span class="op">-</span>Port <span class="st">"8080"</span> <span class="op">-</span>Protocol <span class="st">"HTTP"</span></span>
 | ||
| <span id="cb43-3"><a href="#cb43-3" aria-hidden="true" tabindex="-1"></a>    <span class="co">### Get info endpoints</span></span>
 | ||
| <span id="cb43-4"><a href="#cb43-4" aria-hidden="true" tabindex="-1"></a>    Add-PodeRoute <span class="op">-</span>Path <span class="st">"/"</span> <span class="op">-</span>Method <span class="st">"GET"</span> <span class="op">-</span>ScriptBlock <span class="op">{</span></span>
 | ||
| <span id="cb43-5"><a href="#cb43-5" aria-hidden="true" tabindex="-1"></a>        Write-PodeJsonResponse <span class="op">-</span>Value @<span class="op">{</span></span>
 | ||
| <span id="cb43-6"><a href="#cb43-6" aria-hidden="true" tabindex="-1"></a>        <span class="st">"service"</span><span class="op">=</span><span class="st">"/api/service"</span><span class="op">;</span></span>
 | ||
| <span id="cb43-7"><a href="#cb43-7" aria-hidden="true" tabindex="-1"></a>        <span class="st">"process"</span><span class="op">=</span><span class="st">"/api/process"</span></span>
 | ||
| <span id="cb43-8"><a href="#cb43-8" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb43-9"><a href="#cb43-9" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb43-10"><a href="#cb43-10" aria-hidden="true" tabindex="-1"></a>    <span class="co">### GET</span></span>
 | ||
| <span id="cb43-11"><a href="#cb43-11" aria-hidden="true" tabindex="-1"></a>    Add-PodeRoute <span class="op">-</span>Path <span class="st">"/api/service"</span> <span class="op">-</span>Method <span class="st">"GET"</span> <span class="op">-</span>ScriptBlock <span class="op">{</span></span>
 | ||
| <span id="cb43-12"><a href="#cb43-12" aria-hidden="true" tabindex="-1"></a>        Write-PodeJsonResponse <span class="op">-</span>Value <span class="op">$(</span></span>
 | ||
| <span id="cb43-13"><a href="#cb43-13" aria-hidden="true" tabindex="-1"></a>            <span class="fu">Get-Service</span> <span class="op">|</span> <span class="fu">Select-Object</span> Name<span class="op">,</span>@<span class="op">{</span></span>
 | ||
| <span id="cb43-14"><a href="#cb43-14" aria-hidden="true" tabindex="-1"></a>                Name<span class="op">=</span><span class="st">"Status"</span><span class="op">;</span> Expression<span class="op">={[</span><span class="dt">string</span><span class="op">]</span><span class="va">$_</span><span class="op">.</span><span class="fu">Status</span><span class="op">}</span></span>
 | ||
| <span id="cb43-15"><a href="#cb43-15" aria-hidden="true" tabindex="-1"></a>            <span class="op">},</span>@<span class="op">{</span></span>
 | ||
| <span id="cb43-16"><a href="#cb43-16" aria-hidden="true" tabindex="-1"></a>                Name<span class="op">=</span><span class="st">"StartType"</span><span class="op">;</span> Expression<span class="op">={[</span><span class="dt">string</span><span class="op">]</span><span class="va">$_</span><span class="op">.</span><span class="fu">StartType</span><span class="op">}</span></span>
 | ||
| <span id="cb43-17"><a href="#cb43-17" aria-hidden="true" tabindex="-1"></a>            <span class="op">}</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span></span>
 | ||
| <span id="cb43-18"><a href="#cb43-18" aria-hidden="true" tabindex="-1"></a>        <span class="op">)</span></span>
 | ||
| <span id="cb43-19"><a href="#cb43-19" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb43-20"><a href="#cb43-20" aria-hidden="true" tabindex="-1"></a>    Add-PodeRoute <span class="op">-</span>Path <span class="st">"/api/process"</span> <span class="op">-</span>Method <span class="st">"GET"</span> <span class="op">-</span>ScriptBlock <span class="op">{</span></span>
 | ||
| <span id="cb43-21"><a href="#cb43-21" aria-hidden="true" tabindex="-1"></a>        Write-PodeJsonResponse <span class="op">-</span>Value <span class="op">$(</span></span>
 | ||
| <span id="cb43-22"><a href="#cb43-22" aria-hidden="true" tabindex="-1"></a>            <span class="fu">Get-Process</span> <span class="op">|</span> <span class="fu">Sort-Object</span> <span class="op">-</span>Descending CPU <span class="op">|</span> <span class="fu">Select-Object</span> <span class="op">-</span>First <span class="dv">15</span> ProcessName<span class="op">,</span></span>
 | ||
| <span id="cb43-23"><a href="#cb43-23" aria-hidden="true" tabindex="-1"></a>            @<span class="op">{</span>Name<span class="op">=</span><span class="st">"ProcessorTime"</span><span class="op">;</span> Expression<span class="op">={</span><span class="va">$_</span><span class="op">.</span><span class="fu">TotalProcessorTime</span> <span class="op">-replace</span> <span class="st">"\.\d+$"</span><span class="op">}},</span></span>
 | ||
| <span id="cb43-24"><a href="#cb43-24" aria-hidden="true" tabindex="-1"></a>            @<span class="op">{</span>Name<span class="op">=</span><span class="st">"Memory"</span><span class="op">;</span> Expression<span class="op">={[</span><span class="dt">string</span><span class="op">]([</span><span class="dt">int</span><span class="op">](</span><span class="va">$_</span><span class="op">.</span><span class="fu">WS</span> <span class="op">/</span> <span class="dv">1024</span><span class="dt">kb</span><span class="op">))+</span><span class="st">"MB"</span><span class="op">}},</span></span>
 | ||
| <span id="cb43-25"><a href="#cb43-25" aria-hidden="true" tabindex="-1"></a>            @<span class="op">{</span>Label<span class="op">=</span><span class="st">"RunTime"</span><span class="op">;</span> Expression<span class="op">={((</span><span class="fu">Get-Date</span><span class="op">)</span> <span class="op">-</span> <span class="va">$_</span><span class="op">.</span><span class="fu">StartTime</span><span class="op">)</span> <span class="op">-replace</span> <span class="st">"\.\d+$"</span><span class="op">}}</span></span>
 | ||
| <span id="cb43-26"><a href="#cb43-26" aria-hidden="true" tabindex="-1"></a>        <span class="op">)</span></span>
 | ||
| <span id="cb43-27"><a href="#cb43-27" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb43-28"><a href="#cb43-28" aria-hidden="true" tabindex="-1"></a>    Add-PodeRoute <span class="op">-</span>Path <span class="st">"/api/process-html"</span> <span class="op">-</span>Method <span class="st">"GET"</span> <span class="op">-</span>ScriptBlock <span class="op">{</span></span>
 | ||
| <span id="cb43-29"><a href="#cb43-29" aria-hidden="true" tabindex="-1"></a>        Write-PodeHtmlResponse <span class="op">-</span>Value <span class="op">(</span></span>
 | ||
| <span id="cb43-30"><a href="#cb43-30" aria-hidden="true" tabindex="-1"></a>            <span class="fu">Get-Process</span> <span class="op">|</span> <span class="fu">Sort-Object</span> <span class="op">-</span>Descending CPU <span class="op">|</span> <span class="fu">Select-Object</span> <span class="op">-</span>First <span class="dv">15</span> ProcessName<span class="op">,</span></span>
 | ||
| <span id="cb43-31"><a href="#cb43-31" aria-hidden="true" tabindex="-1"></a>            @<span class="op">{</span>Name<span class="op">=</span><span class="st">"ProcessorTime"</span><span class="op">;</span> Expression<span class="op">={</span><span class="va">$_</span><span class="op">.</span><span class="fu">TotalProcessorTime</span> <span class="op">-replace</span> <span class="st">"\.\d+$"</span><span class="op">}},</span></span>
 | ||
| <span id="cb43-32"><a href="#cb43-32" aria-hidden="true" tabindex="-1"></a>            @<span class="op">{</span>Name<span class="op">=</span><span class="st">"Memory"</span><span class="op">;</span> Expression<span class="op">={[</span><span class="dt">string</span><span class="op">]([</span><span class="dt">int</span><span class="op">](</span><span class="va">$_</span><span class="op">.</span><span class="fu">WS</span> <span class="op">/</span> <span class="dv">1024</span><span class="dt">kb</span><span class="op">))+</span><span class="st">"MB"</span><span class="op">}},</span></span>
 | ||
| <span id="cb43-33"><a href="#cb43-33" aria-hidden="true" tabindex="-1"></a>            @<span class="op">{</span>Label<span class="op">=</span><span class="st">"RunTime"</span><span class="op">;</span> Expression<span class="op">={((</span><span class="fu">Get-Date</span><span class="op">)</span> <span class="op">-</span> <span class="va">$_</span><span class="op">.</span><span class="fu">StartTime</span><span class="op">)</span> <span class="op">-replace</span> <span class="st">"\.\d+$"</span><span class="op">}}</span> <span class="co"># Auto ConvertTo-Html</span></span>
 | ||
| <span id="cb43-34"><a href="#cb43-34" aria-hidden="true" tabindex="-1"></a>        <span class="op">)</span></span>
 | ||
| <span id="cb43-35"><a href="#cb43-35" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb43-36"><a href="#cb43-36" aria-hidden="true" tabindex="-1"></a>    <span class="co">### POST</span></span>
 | ||
| <span id="cb43-37"><a href="#cb43-37" aria-hidden="true" tabindex="-1"></a>    Add-PodeRoute <span class="op">-</span>Path <span class="st">"/api/service"</span> <span class="op">-</span>Method <span class="st">"POST"</span> <span class="op">-</span>ScriptBlock <span class="op">{</span></span>
 | ||
| <span id="cb43-38"><a href="#cb43-38" aria-hidden="true" tabindex="-1"></a>        <span class="co"># https://pode.readthedocs.io/en/latest/Tutorials/WebEvent/</span></span>
 | ||
| <span id="cb43-39"><a href="#cb43-39" aria-hidden="true" tabindex="-1"></a>        <span class="co"># $WebEvent | Out-Default</span></span>
 | ||
| <span id="cb43-40"><a href="#cb43-40" aria-hidden="true" tabindex="-1"></a>        <span class="va">$Value</span> <span class="op">=</span> <span class="va">$WebEvent</span><span class="op">.</span><span class="fu">Data</span><span class="op">[</span><span class="st">"ServiceName"</span><span class="op">]</span></span>
 | ||
| <span id="cb43-41"><a href="#cb43-41" aria-hidden="true" tabindex="-1"></a>        <span class="va">$Status</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Service</span> <span class="op">-</span>Name <span class="va">$Value</span><span class="op">).</span><span class="fu">Status</span></span>
 | ||
| <span id="cb43-42"><a href="#cb43-42" aria-hidden="true" tabindex="-1"></a>        Write-PodeJsonResponse <span class="op">-</span>Value @<span class="op">{</span></span>
 | ||
| <span id="cb43-43"><a href="#cb43-43" aria-hidden="true" tabindex="-1"></a>            <span class="st">"Name"</span><span class="op">=</span><span class="st">"</span><span class="va">$Value</span><span class="st">"</span><span class="op">;</span></span>
 | ||
| <span id="cb43-44"><a href="#cb43-44" aria-hidden="true" tabindex="-1"></a>            <span class="st">"Status"</span><span class="op">=</span><span class="st">"</span><span class="va">$Status</span><span class="st">"</span><span class="op">;</span></span>
 | ||
| <span id="cb43-45"><a href="#cb43-45" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb43-46"><a href="#cb43-46" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb43-47"><a href="#cb43-47" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>irm http://localhost:8080/api/service -Method Get</code><br />
 | ||
| <code>irm http://localhost:8080/api/process -Method Get</code><br />
 | ||
| <code>http://localhost:8080/api/process-html</code> использовать
 | ||
| браузер<br />
 | ||
| <code>irm http://localhost:8080/api/service -Method Post -Body @{"ServiceName" = "AnyDesk"}</code></p>
 | ||
| <h1 id="selenium">Selenium</h1>
 | ||
| <p><code>Invoke-Expression(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/Lifailon/Deploy-Selenium/rsa/Deploy-Selenium-Drivers.ps1")</code>
 | ||
| установка всех драйверов и Chromium соответствующий версии для
 | ||
| драйвера</p>
 | ||
| <pre><code>$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()
 | ||
| }</code></pre>
 | ||
| <h3 id="selenium-modules">Selenium modules</h3>
 | ||
| <div class="sourceCode" id="cb45"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb45-1"><a href="#cb45-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-RestMethod</span> https<span class="op">://</span>raw<span class="op">.</span><span class="fu">githubusercontent</span><span class="op">.</span><span class="fu">com</span><span class="op">/</span>Lifailon<span class="op">/</span>Selenium-Modules<span class="op">/</span>rsa<span class="op">/</span>Modules<span class="op">/</span>Get-GPT<span class="op">/</span>Get-GPT<span class="op">.</span><span class="fu">psm1</span> <span class="op">|</span> <span class="fu">Out-File</span> <span class="op">-</span>FilePath <span class="st">"</span><span class="op">$(</span><span class="fu">New-Item</span> <span class="op">-</span>Path <span class="st">"</span><span class="op">$($(</span><span class="va">$Env</span><span class="op">:</span><span class="va">PSModulePath</span> <span class="op">-split</span> <span class="st">";"</span><span class="op">)[</span><span class="dv">0</span><span class="op">])</span><span class="st">\Get-GPT"</span> <span class="op">-</span>ItemType Directory <span class="op">-</span>Force<span class="op">)</span><span class="st">\Get-GPT.psm1"</span> <span class="op">-</span>Force</span></code></pre></div>
 | ||
| <p><code>Get-GPT "Исполняй роль калькулятора. Посчитай сумму чисел: 22+33"</code></p>
 | ||
| <div class="sourceCode" id="cb46"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb46-1"><a href="#cb46-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-RestMethod</span> https<span class="op">://</span>raw<span class="op">.</span><span class="fu">githubusercontent</span><span class="op">.</span><span class="fu">com</span><span class="op">/</span>Lifailon<span class="op">/</span>Selenium-Modules<span class="op">/</span>rsa<span class="op">/</span>Modules<span class="op">/</span>Get-Translation<span class="op">/</span>Get-Translation<span class="op">.</span><span class="fu">psm1</span> <span class="op">|</span> <span class="fu">Out-File</span> <span class="op">-</span>FilePath <span class="st">"</span><span class="op">$(</span><span class="fu">New-Item</span> <span class="op">-</span>Path <span class="st">"</span><span class="op">$($(</span><span class="va">$Env</span><span class="op">:</span><span class="va">PSModulePath</span> <span class="op">-split</span> <span class="st">";"</span><span class="op">)[</span><span class="dv">0</span><span class="op">])</span><span class="st">\Get-Translation"</span> <span class="op">-</span>ItemType Directory <span class="op">-</span>Force<span class="op">)</span><span class="st">\Get-Translation.psm1"</span> <span class="op">-</span>Force</span></code></pre></div>
 | ||
| <p><code>Get-Translation -Provider DeepL -Text "I translating the text"</code><br />
 | ||
| <code>Get-Translation -Provider DeepL -Text "Я перевожу текст"</code><br />
 | ||
| <code>Get-Translation -Provider Google -Text "I translating the text"</code><br />
 | ||
| <code>Get-Translation -Provider Google -Text "Я перевожу текст" -Language en</code></p>
 | ||
| <div class="sourceCode" id="cb47"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb47-1"><a href="#cb47-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-RestMethod</span> https<span class="op">://</span>raw<span class="op">.</span><span class="fu">githubusercontent</span><span class="op">.</span><span class="fu">com</span><span class="op">/</span>Lifailon<span class="op">/</span>Selenium-Modules<span class="op">/</span>rsa<span class="op">/</span>Modules<span class="op">/</span>Get-SpeedTest<span class="op">/</span>Get-SpeedTest<span class="op">.</span><span class="fu">psm1</span> <span class="op">|</span> <span class="fu">Out-File</span> <span class="op">-</span>FilePath <span class="st">"</span><span class="op">$(</span><span class="fu">New-Item</span> <span class="op">-</span>Path <span class="st">"</span><span class="op">$($(</span><span class="va">$Env</span><span class="op">:</span><span class="va">PSModulePath</span> <span class="op">-split</span> <span class="st">";"</span><span class="op">)[</span><span class="dv">0</span><span class="op">])</span><span class="st">\Get-SpeedTest"</span> <span class="op">-</span>ItemType Directory <span class="op">-</span>Force<span class="op">)</span><span class="st">\Get-SpeedTest.psm1"</span> <span class="op">-</span>Force</span></code></pre></div>
 | ||
| <p><code>Get-SpeedTest -Provider Libre</code><br />
 | ||
| <code>Get-SpeedTest -Provider Open</code><br />
 | ||
| <code>Get-SpeedTest -Provider Ookla</code></p>
 | ||
| <h1 id="ie">IE</h1>
 | ||
| <p><code>$ie.document.IHTMLDocument3_getElementsByTagName("input")  | select name</code>
 | ||
| получить имена всех Input Box<br />
 | ||
| <code>$ie.document.IHTMLDocument3_getElementsByTagName("button") | select innerText</code>
 | ||
| получить имена всех Button<br />
 | ||
| <code>$ie.Document.documentElement.innerHTML</code> прочитать сырой Web
 | ||
| Content (<input name=“login” tabindex=“100” class=“input__control
 | ||
| input__input” id=“uniq32005644019429136” spellcheck=“false”
 | ||
| placeholder=“Логин”)<br />
 | ||
| <code>$All_Elements = $ie.document.IHTMLDocument3_getElementsByTagName("*")</code>
 | ||
| забрать все элементы<br />
 | ||
| <code>$Go_Button = $All_Elements | ? innerText -like "go"</code> поиск
 | ||
| элемента по имени<br />
 | ||
| <code>$Go_Button | select ie9_tagName</code> получить TagName (SPAN) для
 | ||
| быстрого дальнейшего поиска<br />
 | ||
| <code>$SPAN_Elements = $ie.document.IHTMLDocument3_getElementsByTagName("SPAN")</code></p>
 | ||
| <div class="sourceCode" id="cb48"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb48-1"><a href="#cb48-1" aria-hidden="true" tabindex="-1"></a><span class="va">$ie</span> <span class="op">=</span> <span class="fu">New-Object</span> <span class="op">-</span>ComObject InternetExplorer<span class="op">.</span><span class="fu">Application</span></span>
 | ||
| <span id="cb48-2"><a href="#cb48-2" aria-hidden="true" tabindex="-1"></a><span class="va">$ie</span><span class="op">.</span><span class="fu">navigate</span><span class="op">(</span><span class="st">"https://yandex.ru"</span><span class="op">)</span></span>
 | ||
| <span id="cb48-3"><a href="#cb48-3" aria-hidden="true" tabindex="-1"></a><span class="va">$ie</span><span class="op">.</span><span class="fu">visible</span> <span class="op">=</span> <span class="va">$true</span></span>
 | ||
| <span id="cb48-4"><a href="#cb48-4" aria-hidden="true" tabindex="-1"></a><span class="va">$ie</span><span class="op">.</span><span class="fu">document</span><span class="op">.</span><span class="fu">IHTMLDocument3_getElementByID</span><span class="op">(</span><span class="st">"login"</span><span class="op">).</span><span class="fu">value</span> <span class="op">=</span> <span class="st">"Login"</span></span>
 | ||
| <span id="cb48-5"><a href="#cb48-5" aria-hidden="true" tabindex="-1"></a><span class="va">$ie</span><span class="op">.</span><span class="fu">document</span><span class="op">.</span><span class="fu">IHTMLDocument3_getElementByID</span><span class="op">(</span><span class="st">"passwd"</span><span class="op">).</span><span class="fu">value</span> <span class="op">=</span> <span class="st">"Password"</span></span>
 | ||
| <span id="cb48-6"><a href="#cb48-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Button_Auth</span> <span class="op">=</span> <span class="op">(</span><span class="va">$ie</span><span class="op">.</span><span class="fu">document</span><span class="op">.</span><span class="fu">IHTMLDocument3_getElementsByTagName</span><span class="op">(</span><span class="st">"button"</span><span class="op">))</span> <span class="op">|</span> <span class="op">?</span> innerText <span class="op">-match</span> <span class="st">"Войти"</span></span>
 | ||
| <span id="cb48-7"><a href="#cb48-7" aria-hidden="true" tabindex="-1"></a><span class="va">$Button_Auth</span><span class="op">.</span><span class="fu">Click</span><span class="op">()</span></span>
 | ||
| <span id="cb48-8"><a href="#cb48-8" aria-hidden="true" tabindex="-1"></a><span class="va">$Result</span> <span class="op">=</span> <span class="va">$ie</span><span class="op">.</span><span class="fu">Document</span><span class="op">.</span><span class="fu">documentElement</span><span class="op">.</span><span class="fu">innerHTML</span></span>
 | ||
| <span id="cb48-9"><a href="#cb48-9" aria-hidden="true" tabindex="-1"></a><span class="va">$ie</span><span class="op">.</span><span class="fu">Quit</span><span class="op">()</span></span></code></pre></div>
 | ||
| <h1 id="com">COM</h1>
 | ||
| <p><code>$wshell = New-Object -ComObject Wscript.Shell</code><br />
 | ||
| <code>$wshell | Get-Member</code><br />
 | ||
| <code>$link = $wshell.CreateShortcut("$Home\Desktop\Yandex.lnk")</code>
 | ||
| создать ярлык<br />
 | ||
| <code>$link | Get-Member</code><br />
 | ||
| <code>$link.TargetPath = "https://yandex.ru"</code> куда ссылается
 | ||
| (метод TargetPath объекта <span class="math inline">$link где хранится
 | ||
| объект CreateShortcut) \
 | ||
| `$</span>link.Save()` сохранить</p>
 | ||
| <p><code>Set-WinUserLanguageList -LanguageList en-us,ru -Force</code>
 | ||
| изменить языковую раскладку клавиатуры</p>
 | ||
| <h3 id="wscript.shell.sendkeys">Wscript.Shell.SendKeys</h3>
 | ||
| <p><code>(New-Object -ComObject Wscript.shell).SendKeys([char]173)</code>
 | ||
| включить/выключить звук<br />
 | ||
| <code>$wshell.Exec("notepad.exe")</code> запустить приложение<br />
 | ||
| <code>$wshell.AppActivate("Блокнот")</code> развернуть запущенное
 | ||
| приложение</p>
 | ||
| <p><code>$wshell.SendKeys("Login")</code> текст<br />
 | ||
| <code>$wshell.SendKeys("{A 5}")</code> напечатать букву 5 раз
 | ||
| подряд<br />
 | ||
| <code>$wshell.SendKeys("%{TAB}")</code> ALT+TAB<br />
 | ||
| <code>$wshell.SendKeys("^")</code> CTRL<br />
 | ||
| <code>$wshell.SendKeys("%")</code> ALT<br />
 | ||
| <code>$wshell.SendKeys("+")</code> SHIFT<br />
 | ||
| <code>$wshell.SendKeys("{DOWN}")</code> вниз<br />
 | ||
| <code>$wshell.SendKeys("{UP}")</code> вверх<br />
 | ||
| <code>$wshell.SendKeys("{LEFT}")</code> влево<br />
 | ||
| <code>$wshell.SendKeys("{RIGHT}")</code> вправо<br />
 | ||
| <code>$wshell.SendKeys("{PGUP}")</code> PAGE UP<br />
 | ||
| <code>$wshell.SendKeys("{PGDN}")</code> PAGE DOWN<br />
 | ||
| <code>$wshell.SendKeys("{BACKSPACE}")</code> BACKSPACE/BKSP/BS<br />
 | ||
| <code>$wshell.SendKeys("{DEL}")</code> DEL/DELETE<br />
 | ||
| <code>$wshell.SendKeys("{INS}")</code> INS/INSERT<br />
 | ||
| <code>$wshell.SendKeys("{PRTSC}")</code> PRINT SCREEN<br />
 | ||
| <code>$wshell.SendKeys("{ENTER}")</code><br />
 | ||
| <code>$wshell.SendKeys("{ESC}")</code><br />
 | ||
| <code>$wshell.SendKeys("{TAB}")</code><br />
 | ||
| <code>$wshell.SendKeys("{END}")</code><br />
 | ||
| <code>$wshell.SendKeys("{HOME}")</code><br />
 | ||
| <code>$wshell.SendKeys("{BREAK}")</code><br />
 | ||
| <code>$wshell.SendKeys("{SCROLLLOCK}")</code><br />
 | ||
| <code>$wshell.SendKeys("{CAPSLOCK}")</code><br />
 | ||
| <code>$wshell.SendKeys("{NUMLOCK}")</code><br />
 | ||
| <code>$wshell.SendKeys("{F1}")</code><br />
 | ||
| <code>$wshell.SendKeys("{F12}")</code><br />
 | ||
| <code>$wshell.SendKeys("{+}{^}{%}{~}{(}{)}{[}{]}{{}{}}")</code></p>
 | ||
| <div class="sourceCode" id="cb49"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb49-1"><a href="#cb49-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-AltTab <span class="op">{</span></span>
 | ||
| <span id="cb49-2"><a href="#cb49-2" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="fu">New-Object</span> <span class="op">-</span>ComObject wscript<span class="op">.</span><span class="fu">shell</span><span class="op">).</span><span class="fu">SendKeys</span><span class="op">(</span><span class="st">"%{Tab}"</span><span class="op">)</span></span>
 | ||
| <span id="cb49-3"><a href="#cb49-3" aria-hidden="true" tabindex="-1"></a><span class="fu">Start-Sleep</span> <span class="op">$(</span><span class="fu">Get-Random</span> <span class="op">-</span>Minimum <span class="dv">30</span> <span class="op">-</span>Maximum <span class="dv">180</span><span class="op">)</span></span>
 | ||
| <span id="cb49-4"><a href="#cb49-4" aria-hidden="true" tabindex="-1"></a>Get-AltTab</span>
 | ||
| <span id="cb49-5"><a href="#cb49-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb49-6"><a href="#cb49-6" aria-hidden="true" tabindex="-1"></a>Get-AltTab</span></code></pre></div>
 | ||
| <h3 id="wscript.shell.popup">Wscript.Shell.Popup</h3>
 | ||
| <p><code>$wshell = New-Object -ComObject Wscript.Shell</code><br />
 | ||
| <code>$output = $wshell.Popup("Выберите действие?",0,"Заголовок",4)</code><br />
 | ||
| <code>if ($output -eq 6) {"yes"} elseif ($output -eq 7) {"no"} else {"no good"}</code></p>
 | ||
| <pre><code>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 Нет</code></pre>
 | ||
| <h3 id="wscript.network">WScript.Network</h3>
 | ||
| <p><code>$wshell = New-Object -ComObject WScript.Network</code><br />
 | ||
| <code>$wshell | Get-Member</code><br />
 | ||
| <code>$wshell.UserName</code><br />
 | ||
| <code>$wshell.ComputerName</code><br />
 | ||
| <code>$wshell.UserDomain</code></p>
 | ||
| <h3 id="shell.application">Shell.Application</h3>
 | ||
| <p><code>$wshell = New-Object -ComObject Shell.Application</code><br />
 | ||
| <code>$wshell | Get-Member</code><br />
 | ||
| <code>$wshell.Explore("C:\")</code><br />
 | ||
| <code>$wshell.Windows() | Get-Member</code> получить доступ к открытым в
 | ||
| проводнике или браузере Internet Explorer окон</p>
 | ||
| <p><code>$shell = New-Object -Com Shell.Application</code><br />
 | ||
| <code>$RecycleBin = $shell.Namespace(10)</code><br />
 | ||
| <code>$RecycleBin.Items()</code></p>
 | ||
| <h3 id="outlook">Outlook</h3>
 | ||
| <p><code>$Outlook = New-Object -ComObject Outlook.Application</code><br />
 | ||
| <code>$Outlook | Get-Member</code><br />
 | ||
| <code>$Outlook.Version</code></p>
 | ||
| <div class="sourceCode" id="cb51"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb51-1"><a href="#cb51-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Outlook</span> <span class="op">=</span> <span class="fu">New-Object</span> <span class="op">-</span>ComObject Outlook<span class="op">.</span><span class="fu">Application</span></span>
 | ||
| <span id="cb51-2"><a href="#cb51-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Namespace</span> <span class="op">=</span> <span class="va">$Outlook</span><span class="op">.</span><span class="fu">GetNamespace</span><span class="op">(</span><span class="st">"MAPI"</span><span class="op">)</span></span>
 | ||
| <span id="cb51-3"><a href="#cb51-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Folder</span> <span class="op">=</span> <span class="va">$namespace</span><span class="op">.</span><span class="fu">GetDefaultFolder</span><span class="op">(</span><span class="dv">4</span><span class="op">)</span><span class="ch">` </span>исходящие</span>
 | ||
| <span id="cb51-4"><a href="#cb51-4" aria-hidden="true" tabindex="-1"></a><span class="va">$Folder</span> <span class="op">=</span> <span class="va">$namespace</span><span class="op">.</span><span class="fu">GetDefaultFolder</span><span class="op">(</span><span class="dv">6</span><span class="op">)</span><span class="ch">` </span>входящие</span>
 | ||
| <span id="cb51-5"><a href="#cb51-5" aria-hidden="true" tabindex="-1"></a><span class="va">$Explorer</span> <span class="op">=</span> <span class="va">$Folder</span><span class="op">.</span><span class="fu">GetExplorer</span><span class="op">()</span></span>
 | ||
| <span id="cb51-6"><a href="#cb51-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Explorer</span><span class="op">.</span><span class="fu">Display</span><span class="op">()</span> </span>
 | ||
| <span id="cb51-7"><a href="#cb51-7" aria-hidden="true" tabindex="-1"></a><span class="va">$Outlook</span><span class="op">.</span><span class="fu">Quit</span><span class="op">()</span></span></code></pre></div>
 | ||
| <h3 id="microsoft.update">Microsoft.Update</h3>
 | ||
| <p><code>(New-Object -com 'Microsoft.Update.AutoUpdate').Settings</code><br />
 | ||
| <code>(New-Object -com 'Microsoft.Update.AutoUpdate').Results</code><br />
 | ||
| <code>(New-Timespan -Start ((New-Object -com 'Microsoft.Update.AutoUpdate').Results|Select -ExpandProperty LastInstallationSuccessDate) -End (Get-Date)).hours</code>
 | ||
| кол-во часов, прошедших с последней даты установки обновления
 | ||
| безопасности в Windows.</p>
 | ||
| <h1 id="dotnet">dotNET</h1>
 | ||
| <p><code>[System.Diagnostics.EventLog] | select Assembly,Module</code><br />
 | ||
| <code>$EventLog = [System.Diagnostics.EventLog]::new("Application")</code><br />
 | ||
| <code>$EventLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application,192.168.3.100</code><br />
 | ||
| <code>$EventLog | Get-Member -MemberType Method</code><br />
 | ||
| <code>$EventLog.MaximumKilobytes</code> максимальный размер
 | ||
| журнала<br />
 | ||
| <code>$EventLog.Entries</code> просмотреть журнал<br />
 | ||
| <code>$EventLog.Clear()</code> очистить журнал</p>
 | ||
| <p><code>Join-Path C: Install Test</code><br />
 | ||
| <code>[System.IO.Path]::Combine("C:", "Install", "Test")</code></p>
 | ||
| <h3 id="match">Match</h3>
 | ||
| <p><code>[System.Math] | Get-Member -Static -MemberType Methods</code><br />
 | ||
| <code>[System.Math]::Max(2,7)</code><br />
 | ||
| <code>[System.Math]::Min(2,7)</code><br />
 | ||
| <code>[System.Math]::Floor(3.9)</code><br />
 | ||
| <code>[System.Math]::Truncate(3.9)</code></p>
 | ||
| <h3 id="generatepassword">GeneratePassword</h3>
 | ||
| <p><code>Add-Type -AssemblyName System.Web</code><br />
 | ||
| <code>[System.Web.Security.Membership]::GeneratePassword(10,2)</code></p>
 | ||
| <h3 id="soundplayer">SoundPlayer</h3>
 | ||
| <div class="sourceCode" id="cb52"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb52-1"><a href="#cb52-1" aria-hidden="true" tabindex="-1"></a><span class="va">$CriticalSound</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Media</span><span class="op">.</span><span class="fu">SoundPlayer</span></span>
 | ||
| <span id="cb52-2"><a href="#cb52-2" aria-hidden="true" tabindex="-1"></a><span class="va">$CriticalSound</span><span class="op">.</span><span class="fu">SoundLocation</span> <span class="op">=</span> <span class="st">"C:\WINDOWS\Media\Windows Critical Stop.wav"</span></span>
 | ||
| <span id="cb52-3"><a href="#cb52-3" aria-hidden="true" tabindex="-1"></a><span class="va">$CriticalSound</span><span class="op">.</span><span class="fu">Play</span><span class="op">()</span></span>
 | ||
| <span id="cb52-4"><a href="#cb52-4" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb52-5"><a href="#cb52-5" aria-hidden="true" tabindex="-1"></a><span class="va">$GoodSound</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Media</span><span class="op">.</span><span class="fu">SoundPlayer</span></span>
 | ||
| <span id="cb52-6"><a href="#cb52-6" aria-hidden="true" tabindex="-1"></a><span class="va">$GoodSound</span><span class="op">.</span><span class="fu">SoundLocation</span> <span class="op">=</span> <span class="st">"C:\WINDOWS\Media\tada.wav"</span></span>
 | ||
| <span id="cb52-7"><a href="#cb52-7" aria-hidden="true" tabindex="-1"></a><span class="va">$GoodSound</span><span class="op">.</span><span class="fu">Play</span><span class="op">()</span></span></code></pre></div>
 | ||
| <h3 id="static-class">Static Class</h3>
 | ||
| <p><code>[System.Environment] | Get-Member -Static</code><br />
 | ||
| <code>[System.Environment]::OSVersion</code><br />
 | ||
| <code>[System.Environment]::Version</code><br />
 | ||
| <code>[System.Environment]::MachineName</code><br />
 | ||
| <code>[System.Environment]::UserName</code></p>
 | ||
| <p><code>[System.Diagnostics.Process] | Get-Member -Static</code><br />
 | ||
| <code>[System.Diagnostics.Process]::Start('notepad.exe')</code></p>
 | ||
| <h3 id="clicker">[Clicker]</h3>
 | ||
| <div class="sourceCode" id="cb53"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb53-1"><a href="#cb53-1" aria-hidden="true" tabindex="-1"></a><span class="va">$cSource</span> <span class="op">=</span> <span class="vs">@'</span></span>
 | ||
| <span id="cb53-2"><a href="#cb53-2" aria-hidden="true" tabindex="-1"></a><span class="vs">using System;</span></span>
 | ||
| <span id="cb53-3"><a href="#cb53-3" aria-hidden="true" tabindex="-1"></a><span class="vs">using System.Drawing;</span></span>
 | ||
| <span id="cb53-4"><a href="#cb53-4" aria-hidden="true" tabindex="-1"></a><span class="vs">using System.Runtime.InteropServices;</span></span>
 | ||
| <span id="cb53-5"><a href="#cb53-5" aria-hidden="true" tabindex="-1"></a><span class="vs">using System.Windows.Forms;</span></span>
 | ||
| <span id="cb53-6"><a href="#cb53-6" aria-hidden="true" tabindex="-1"></a><span class="vs">public class Clicker</span></span>
 | ||
| <span id="cb53-7"><a href="#cb53-7" aria-hidden="true" tabindex="-1"></a><span class="vs">{</span></span>
 | ||
| <span id="cb53-8"><a href="#cb53-8" aria-hidden="true" tabindex="-1"></a><span class="vs">//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx</span></span>
 | ||
| <span id="cb53-9"><a href="#cb53-9" aria-hidden="true" tabindex="-1"></a><span class="vs">[StructLayout(LayoutKind.Sequential)]</span></span>
 | ||
| <span id="cb53-10"><a href="#cb53-10" aria-hidden="true" tabindex="-1"></a><span class="vs">struct INPUT</span></span>
 | ||
| <span id="cb53-11"><a href="#cb53-11" aria-hidden="true" tabindex="-1"></a><span class="vs">{ </span></span>
 | ||
| <span id="cb53-12"><a href="#cb53-12" aria-hidden="true" tabindex="-1"></a><span class="vs">    public int        type; // 0 = INPUT_MOUSE,</span></span>
 | ||
| <span id="cb53-13"><a href="#cb53-13" aria-hidden="true" tabindex="-1"></a><span class="vs">                            // 1 = INPUT_KEYBOARD</span></span>
 | ||
| <span id="cb53-14"><a href="#cb53-14" aria-hidden="true" tabindex="-1"></a><span class="vs">                            // 2 = INPUT_HARDWARE</span></span>
 | ||
| <span id="cb53-15"><a href="#cb53-15" aria-hidden="true" tabindex="-1"></a><span class="vs">    public MOUSEINPUT mi;</span></span>
 | ||
| <span id="cb53-16"><a href="#cb53-16" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
 | ||
| <span id="cb53-17"><a href="#cb53-17" aria-hidden="true" tabindex="-1"></a><span class="vs">//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646273(v=vs.85).aspx</span></span>
 | ||
| <span id="cb53-18"><a href="#cb53-18" aria-hidden="true" tabindex="-1"></a><span class="vs">[StructLayout(LayoutKind.Sequential)]</span></span>
 | ||
| <span id="cb53-19"><a href="#cb53-19" aria-hidden="true" tabindex="-1"></a><span class="vs">struct MOUSEINPUT</span></span>
 | ||
| <span id="cb53-20"><a href="#cb53-20" aria-hidden="true" tabindex="-1"></a><span class="vs">{</span></span>
 | ||
| <span id="cb53-21"><a href="#cb53-21" aria-hidden="true" tabindex="-1"></a><span class="vs">    public int    dx ;</span></span>
 | ||
| <span id="cb53-22"><a href="#cb53-22" aria-hidden="true" tabindex="-1"></a><span class="vs">    public int    dy ;</span></span>
 | ||
| <span id="cb53-23"><a href="#cb53-23" aria-hidden="true" tabindex="-1"></a><span class="vs">    public int    mouseData ;</span></span>
 | ||
| <span id="cb53-24"><a href="#cb53-24" aria-hidden="true" tabindex="-1"></a><span class="vs">    public int    dwFlags;</span></span>
 | ||
| <span id="cb53-25"><a href="#cb53-25" aria-hidden="true" tabindex="-1"></a><span class="vs">    public int    time;</span></span>
 | ||
| <span id="cb53-26"><a href="#cb53-26" aria-hidden="true" tabindex="-1"></a><span class="vs">    public IntPtr dwExtraInfo;</span></span>
 | ||
| <span id="cb53-27"><a href="#cb53-27" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
 | ||
| <span id="cb53-28"><a href="#cb53-28" aria-hidden="true" tabindex="-1"></a><span class="vs">//This covers most use cases although complex mice may have additional buttons</span></span>
 | ||
| <span id="cb53-29"><a href="#cb53-29" aria-hidden="true" tabindex="-1"></a><span class="vs">//There are additional constants you can use for those cases, see the msdn page</span></span>
 | ||
| <span id="cb53-30"><a href="#cb53-30" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_MOVED      = 0x0001 ;</span></span>
 | ||
| <span id="cb53-31"><a href="#cb53-31" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_LEFTDOWN   = 0x0002 ;</span></span>
 | ||
| <span id="cb53-32"><a href="#cb53-32" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_LEFTUP     = 0x0004 ;</span></span>
 | ||
| <span id="cb53-33"><a href="#cb53-33" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_RIGHTDOWN  = 0x0008 ;</span></span>
 | ||
| <span id="cb53-34"><a href="#cb53-34" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_RIGHTUP    = 0x0010 ;</span></span>
 | ||
| <span id="cb53-35"><a href="#cb53-35" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_MIDDLEDOWN = 0x0020 ;</span></span>
 | ||
| <span id="cb53-36"><a href="#cb53-36" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_MIDDLEUP   = 0x0040 ;</span></span>
 | ||
| <span id="cb53-37"><a href="#cb53-37" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_WHEEL      = 0x0080 ;</span></span>
 | ||
| <span id="cb53-38"><a href="#cb53-38" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_XDOWN      = 0x0100 ;</span></span>
 | ||
| <span id="cb53-39"><a href="#cb53-39" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_XUP        = 0x0200 ;</span></span>
 | ||
| <span id="cb53-40"><a href="#cb53-40" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_ABSOLUTE   = 0x8000 ;</span></span>
 | ||
| <span id="cb53-41"><a href="#cb53-41" aria-hidden="true" tabindex="-1"></a><span class="vs">const int screen_length          = 0x10000 ;</span></span>
 | ||
| <span id="cb53-42"><a href="#cb53-42" aria-hidden="true" tabindex="-1"></a><span class="vs">//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx</span></span>
 | ||
| <span id="cb53-43"><a href="#cb53-43" aria-hidden="true" tabindex="-1"></a><span class="vs">[System.Runtime.InteropServices.DllImport("user32.dll")]</span></span>
 | ||
| <span id="cb53-44"><a href="#cb53-44" aria-hidden="true" tabindex="-1"></a><span class="vs">extern static uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);</span></span>
 | ||
| <span id="cb53-45"><a href="#cb53-45" aria-hidden="true" tabindex="-1"></a><span class="vs">public static void LeftClickAtPoint(int x, int y)</span></span>
 | ||
| <span id="cb53-46"><a href="#cb53-46" aria-hidden="true" tabindex="-1"></a><span class="vs">{</span></span>
 | ||
| <span id="cb53-47"><a href="#cb53-47" aria-hidden="true" tabindex="-1"></a><span class="vs">    //Move the mouse</span></span>
 | ||
| <span id="cb53-48"><a href="#cb53-48" aria-hidden="true" tabindex="-1"></a><span class="vs">    INPUT[] input = new INPUT[3];</span></span>
 | ||
| <span id="cb53-49"><a href="#cb53-49" aria-hidden="true" tabindex="-1"></a><span class="vs">    input[0].mi.dx = x*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width);</span></span>
 | ||
| <span id="cb53-50"><a href="#cb53-50" aria-hidden="true" tabindex="-1"></a><span class="vs">    input[0].mi.dy = y*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height);</span></span>
 | ||
| <span id="cb53-51"><a href="#cb53-51" aria-hidden="true" tabindex="-1"></a><span class="vs">    input[0].mi.dwFlags = MOUSEEVENTF_MOVED | MOUSEEVENTF_ABSOLUTE;</span></span>
 | ||
| <span id="cb53-52"><a href="#cb53-52" aria-hidden="true" tabindex="-1"></a><span class="vs">    //Left mouse button down</span></span>
 | ||
| <span id="cb53-53"><a href="#cb53-53" aria-hidden="true" tabindex="-1"></a><span class="vs">    input[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;</span></span>
 | ||
| <span id="cb53-54"><a href="#cb53-54" aria-hidden="true" tabindex="-1"></a><span class="vs">    //Left mouse button up</span></span>
 | ||
| <span id="cb53-55"><a href="#cb53-55" aria-hidden="true" tabindex="-1"></a><span class="vs">    input[2].mi.dwFlags = MOUSEEVENTF_LEFTUP;</span></span>
 | ||
| <span id="cb53-56"><a href="#cb53-56" aria-hidden="true" tabindex="-1"></a><span class="vs">    SendInput(3, input, Marshal.SizeOf(input[0]));</span></span>
 | ||
| <span id="cb53-57"><a href="#cb53-57" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
 | ||
| <span id="cb53-58"><a href="#cb53-58" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
 | ||
| <span id="cb53-59"><a href="#cb53-59" aria-hidden="true" tabindex="-1"></a><span class="vs">'@</span></span></code></pre></div>
 | ||
| <p><code>Add-Type -TypeDefinition $cSource -ReferencedAssemblies System.Windows.Forms,System.Drawing</code><br />
 | ||
| <code>[Clicker]::LeftClickAtPoint(1900,1070)</code></p>
 | ||
| <h3 id="audio">[Audio]</h3>
 | ||
| <div class="sourceCode" id="cb54"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb54-1"><a href="#cb54-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Add-Type</span> <span class="op">-</span>Language CsharpVersion3 <span class="op">-</span>TypeDefinition <span class="vs">@"</span></span>
 | ||
| <span id="cb54-2"><a href="#cb54-2" aria-hidden="true" tabindex="-1"></a><span class="vs">using System.Runtime.InteropServices;</span></span>
 | ||
| <span id="cb54-3"><a href="#cb54-3" aria-hidden="true" tabindex="-1"></a><span class="vs">[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]</span></span>
 | ||
| <span id="cb54-4"><a href="#cb54-4" aria-hidden="true" tabindex="-1"></a><span class="vs">interface IAudioEndpointVolume {</span></span>
 | ||
| <span id="cb54-5"><a href="#cb54-5" aria-hidden="true" tabindex="-1"></a><span class="vs">// f(), g(), ... are unused COM method slots. Define these if you care</span></span>
 | ||
| <span id="cb54-6"><a href="#cb54-6" aria-hidden="true" tabindex="-1"></a><span class="vs">int f(); int g(); int h(); int i();</span></span>
 | ||
| <span id="cb54-7"><a href="#cb54-7" aria-hidden="true" tabindex="-1"></a><span class="vs">int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext);</span></span>
 | ||
| <span id="cb54-8"><a href="#cb54-8" aria-hidden="true" tabindex="-1"></a><span class="vs">int j();</span></span>
 | ||
| <span id="cb54-9"><a href="#cb54-9" aria-hidden="true" tabindex="-1"></a><span class="vs">int GetMasterVolumeLevelScalar(out float pfLevel);</span></span>
 | ||
| <span id="cb54-10"><a href="#cb54-10" aria-hidden="true" tabindex="-1"></a><span class="vs">int k(); int l(); int m(); int n();</span></span>
 | ||
| <span id="cb54-11"><a href="#cb54-11" aria-hidden="true" tabindex="-1"></a><span class="vs">int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext);</span></span>
 | ||
| <span id="cb54-12"><a href="#cb54-12" aria-hidden="true" tabindex="-1"></a><span class="vs">int GetMute(out bool pbMute);</span></span>
 | ||
| <span id="cb54-13"><a href="#cb54-13" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
 | ||
| <span id="cb54-14"><a href="#cb54-14" aria-hidden="true" tabindex="-1"></a><span class="vs">[Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]</span></span>
 | ||
| <span id="cb54-15"><a href="#cb54-15" aria-hidden="true" tabindex="-1"></a><span class="vs">interface IMMDevice {</span></span>
 | ||
| <span id="cb54-16"><a href="#cb54-16" aria-hidden="true" tabindex="-1"></a><span class="vs">int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev);</span></span>
 | ||
| <span id="cb54-17"><a href="#cb54-17" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
 | ||
| <span id="cb54-18"><a href="#cb54-18" aria-hidden="true" tabindex="-1"></a><span class="vs">[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]</span></span>
 | ||
| <span id="cb54-19"><a href="#cb54-19" aria-hidden="true" tabindex="-1"></a><span class="vs">interface IMMDeviceEnumerator {</span></span>
 | ||
| <span id="cb54-20"><a href="#cb54-20" aria-hidden="true" tabindex="-1"></a><span class="vs">int f(); // Unused</span></span>
 | ||
| <span id="cb54-21"><a href="#cb54-21" aria-hidden="true" tabindex="-1"></a><span class="vs">int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint);</span></span>
 | ||
| <span id="cb54-22"><a href="#cb54-22" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
 | ||
| <span id="cb54-23"><a href="#cb54-23" aria-hidden="true" tabindex="-1"></a><span class="vs">[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { }</span></span>
 | ||
| <span id="cb54-24"><a href="#cb54-24" aria-hidden="true" tabindex="-1"></a><span class="vs">public class Audio {</span></span>
 | ||
| <span id="cb54-25"><a href="#cb54-25" aria-hidden="true" tabindex="-1"></a><span class="vs">static IAudioEndpointVolume Vol() {</span></span>
 | ||
| <span id="cb54-26"><a href="#cb54-26" aria-hidden="true" tabindex="-1"></a><span class="vs">var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;</span></span>
 | ||
| <span id="cb54-27"><a href="#cb54-27" aria-hidden="true" tabindex="-1"></a><span class="vs">IMMDevice dev = null;</span></span>
 | ||
| <span id="cb54-28"><a href="#cb54-28" aria-hidden="true" tabindex="-1"></a><span class="vs">Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev));</span></span>
 | ||
| <span id="cb54-29"><a href="#cb54-29" aria-hidden="true" tabindex="-1"></a><span class="vs">IAudioEndpointVolume epv = null;</span></span>
 | ||
| <span id="cb54-30"><a href="#cb54-30" aria-hidden="true" tabindex="-1"></a><span class="vs">var epvid = typeof(IAudioEndpointVolume).GUID;</span></span>
 | ||
| <span id="cb54-31"><a href="#cb54-31" aria-hidden="true" tabindex="-1"></a><span class="vs">Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv));</span></span>
 | ||
| <span id="cb54-32"><a href="#cb54-32" aria-hidden="true" tabindex="-1"></a><span class="vs">return epv;</span></span>
 | ||
| <span id="cb54-33"><a href="#cb54-33" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
 | ||
| <span id="cb54-34"><a href="#cb54-34" aria-hidden="true" tabindex="-1"></a><span class="vs">public static float Volume {</span></span>
 | ||
| <span id="cb54-35"><a href="#cb54-35" aria-hidden="true" tabindex="-1"></a><span class="vs">get {float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v;}</span></span>
 | ||
| <span id="cb54-36"><a href="#cb54-36" aria-hidden="true" tabindex="-1"></a><span class="vs">set {Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty));}</span></span>
 | ||
| <span id="cb54-37"><a href="#cb54-37" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
 | ||
| <span id="cb54-38"><a href="#cb54-38" aria-hidden="true" tabindex="-1"></a><span class="vs">public static bool Mute {</span></span>
 | ||
| <span id="cb54-39"><a href="#cb54-39" aria-hidden="true" tabindex="-1"></a><span class="vs">get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; }</span></span>
 | ||
| <span id="cb54-40"><a href="#cb54-40" aria-hidden="true" tabindex="-1"></a><span class="vs">set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); }</span></span>
 | ||
| <span id="cb54-41"><a href="#cb54-41" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
 | ||
| <span id="cb54-42"><a href="#cb54-42" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
 | ||
| <span id="cb54-43"><a href="#cb54-43" aria-hidden="true" tabindex="-1"></a><span class="vs">"@</span></span></code></pre></div>
 | ||
| <p><code>[Audio]::Volume = 0.50</code><br />
 | ||
| <code>[Audio]::Mute = $true</code></p>
 | ||
| <h3 id="netsessionenum">NetSessionEnum</h3>
 | ||
| <p>Function:
 | ||
| https://learn.microsoft.com/ru-ru/windows/win32/api/lmshare/nf-lmshare-netsessionenum?redirectedfrom=MSDN<br />
 | ||
| Source: https://fuzzysecurity.com/tutorials/24.html</p>
 | ||
| <div class="sourceCode" id="cb55"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb55-1"><a href="#cb55-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Invoke-NetSessionEnum <span class="op">{</span></span>
 | ||
| <span id="cb55-2"><a href="#cb55-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span> <span class="op">(</span></span>
 | ||
| <span id="cb55-3"><a href="#cb55-3" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Parameter<span class="op">(</span>Mandatory <span class="op">=</span> <span class="va">$True</span><span class="op">)][</span><span class="dt">string</span><span class="op">]</span><span class="va">$HostName</span></span>
 | ||
| <span id="cb55-4"><a href="#cb55-4" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
 | ||
| <span id="cb55-5"><a href="#cb55-5" aria-hidden="true" tabindex="-1"></a><span class="fu">Add-Type</span> <span class="op">-</span>TypeDefinition <span class="vs">@"</span></span>
 | ||
| <span id="cb55-6"><a href="#cb55-6" aria-hidden="true" tabindex="-1"></a><span class="vs">using System;</span></span>
 | ||
| <span id="cb55-7"><a href="#cb55-7" aria-hidden="true" tabindex="-1"></a><span class="vs">using System.Diagnostics;</span></span>
 | ||
| <span id="cb55-8"><a href="#cb55-8" aria-hidden="true" tabindex="-1"></a><span class="vs">using System.Runtime.InteropServices;</span></span>
 | ||
| <span id="cb55-9"><a href="#cb55-9" aria-hidden="true" tabindex="-1"></a><span class="vs">[StructLayout(LayoutKind.Sequential)]</span></span>
 | ||
| <span id="cb55-10"><a href="#cb55-10" aria-hidden="true" tabindex="-1"></a><span class="vs">public struct SESSION_INFO_10</span></span>
 | ||
| <span id="cb55-11"><a href="#cb55-11" aria-hidden="true" tabindex="-1"></a><span class="vs">{</span></span>
 | ||
| <span id="cb55-12"><a href="#cb55-12" aria-hidden="true" tabindex="-1"></a><span class="vs">    [MarshalAs(UnmanagedType.LPWStr)]public string OriginatingHost;</span></span>
 | ||
| <span id="cb55-13"><a href="#cb55-13" aria-hidden="true" tabindex="-1"></a><span class="vs">    [MarshalAs(UnmanagedType.LPWStr)]public string DomainUser;</span></span>
 | ||
| <span id="cb55-14"><a href="#cb55-14" aria-hidden="true" tabindex="-1"></a><span class="vs">    public uint SessionTime;</span></span>
 | ||
| <span id="cb55-15"><a href="#cb55-15" aria-hidden="true" tabindex="-1"></a><span class="vs">    public uint IdleTime;</span></span>
 | ||
| <span id="cb55-16"><a href="#cb55-16" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
 | ||
| <span id="cb55-17"><a href="#cb55-17" aria-hidden="true" tabindex="-1"></a><span class="vs">public static class Netapi32</span></span>
 | ||
| <span id="cb55-18"><a href="#cb55-18" aria-hidden="true" tabindex="-1"></a><span class="vs">{</span></span>
 | ||
| <span id="cb55-19"><a href="#cb55-19" aria-hidden="true" tabindex="-1"></a><span class="vs">[DllImport("Netapi32.dll", SetLastError=true)]</span></span>
 | ||
| <span id="cb55-20"><a href="#cb55-20" aria-hidden="true" tabindex="-1"></a><span class="vs">    public static extern int NetSessionEnum(</span></span>
 | ||
| <span id="cb55-21"><a href="#cb55-21" aria-hidden="true" tabindex="-1"></a><span class="vs">        [In,MarshalAs(UnmanagedType.LPWStr)] string ServerName,</span></span>
 | ||
| <span id="cb55-22"><a href="#cb55-22" aria-hidden="true" tabindex="-1"></a><span class="vs">        [In,MarshalAs(UnmanagedType.LPWStr)] string UncClientName,</span></span>
 | ||
| <span id="cb55-23"><a href="#cb55-23" aria-hidden="true" tabindex="-1"></a><span class="vs">        [In,MarshalAs(UnmanagedType.LPWStr)] string UserName,</span></span>
 | ||
| <span id="cb55-24"><a href="#cb55-24" aria-hidden="true" tabindex="-1"></a><span class="vs">        Int32 Level,</span></span>
 | ||
| <span id="cb55-25"><a href="#cb55-25" aria-hidden="true" tabindex="-1"></a><span class="vs">        out IntPtr bufptr,</span></span>
 | ||
| <span id="cb55-26"><a href="#cb55-26" aria-hidden="true" tabindex="-1"></a><span class="vs">        int prefmaxlen,</span></span>
 | ||
| <span id="cb55-27"><a href="#cb55-27" aria-hidden="true" tabindex="-1"></a><span class="vs">        ref Int32 entriesread,</span></span>
 | ||
| <span id="cb55-28"><a href="#cb55-28" aria-hidden="true" tabindex="-1"></a><span class="vs">        ref Int32 totalentries,</span></span>
 | ||
| <span id="cb55-29"><a href="#cb55-29" aria-hidden="true" tabindex="-1"></a><span class="vs">        ref Int32 resume_handle);</span></span>
 | ||
| <span id="cb55-30"><a href="#cb55-30" aria-hidden="true" tabindex="-1"></a><span class="vs">         </span></span>
 | ||
| <span id="cb55-31"><a href="#cb55-31" aria-hidden="true" tabindex="-1"></a><span class="vs">[DllImport("Netapi32.dll", SetLastError=true)]</span></span>
 | ||
| <span id="cb55-32"><a href="#cb55-32" aria-hidden="true" tabindex="-1"></a><span class="vs">    public static extern int NetApiBufferFree(</span></span>
 | ||
| <span id="cb55-33"><a href="#cb55-33" aria-hidden="true" tabindex="-1"></a><span class="vs">        IntPtr Buffer);</span></span>
 | ||
| <span id="cb55-34"><a href="#cb55-34" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
 | ||
| <span id="cb55-35"><a href="#cb55-35" aria-hidden="true" tabindex="-1"></a><span class="vs">"@</span></span>
 | ||
| <span id="cb55-36"><a href="#cb55-36" aria-hidden="true" tabindex="-1"></a><span class="co"># Create SessionInfo10 Struct</span></span>
 | ||
| <span id="cb55-37"><a href="#cb55-37" aria-hidden="true" tabindex="-1"></a><span class="va">$SessionInfo10</span> <span class="op">=</span> <span class="fu">New-Object</span> SESSION_INFO_10</span>
 | ||
| <span id="cb55-38"><a href="#cb55-38" aria-hidden="true" tabindex="-1"></a><span class="va">$SessionInfo10StructSize</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Runtime</span><span class="op">.</span><span class="fu">InteropServices</span><span class="op">.</span><span class="fu">Marshal</span><span class="op">]::</span>SizeOf<span class="op">(</span><span class="va">$SessionInfo10</span><span class="op">)</span><span class="ch">` </span>Grab size to loop bufptr</span>
 | ||
| <span id="cb55-39"><a href="#cb55-39" aria-hidden="true" tabindex="-1"></a><span class="va">$SessionInfo10</span> <span class="op">=</span> <span class="va">$SessionInfo10</span><span class="op">.</span><span class="fu">GetType</span><span class="op">()</span><span class="ch">` </span>Hacky<span class="op">,</span> but we need this <span class="op">;))</span></span>
 | ||
| <span id="cb55-40"><a href="#cb55-40" aria-hidden="true" tabindex="-1"></a><span class="co"># NetSessionEnum params</span></span>
 | ||
| <span id="cb55-41"><a href="#cb55-41" aria-hidden="true" tabindex="-1"></a><span class="va">$OutBuffPtr</span> <span class="op">=</span> <span class="op">[</span>IntPtr<span class="op">]::</span>Zero<span class="ch">` </span>Struct output buffer</span>
 | ||
| <span id="cb55-42"><a href="#cb55-42" aria-hidden="true" tabindex="-1"></a><span class="va">$EntriesRead</span> <span class="op">=</span> <span class="va">$TotalEntries</span> <span class="op">=</span> <span class="va">$ResumeHandle</span> <span class="op">=</span> <span class="dv">0</span><span class="ch">` </span>Counters <span class="op">&</span> ResumeHandle</span>
 | ||
| <span id="cb55-43"><a href="#cb55-43" aria-hidden="true" tabindex="-1"></a><span class="va">$CallResult</span> <span class="op">=</span> <span class="op">[</span>Netapi32<span class="op">]::</span>NetSessionEnum<span class="op">(</span><span class="va">$HostName</span><span class="op">,</span> <span class="st">""</span><span class="op">,</span> <span class="st">""</span><span class="op">,</span> <span class="dv">10</span><span class="op">,</span> <span class="op">[</span>ref<span class="op">]</span><span class="va">$OutBuffPtr</span><span class="op">,</span> <span class="op">-</span><span class="dv">1</span><span class="op">,</span> <span class="op">[</span>ref<span class="op">]</span><span class="va">$EntriesRead</span><span class="op">,</span> <span class="op">[</span>ref<span class="op">]</span><span class="va">$TotalEntries</span><span class="op">,</span> <span class="op">[</span>ref<span class="op">]</span><span class="va">$ResumeHandle</span><span class="op">)</span></span>
 | ||
| <span id="cb55-44"><a href="#cb55-44" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$CallResult</span> <span class="op">-ne</span> <span class="dv">0</span><span class="op">){</span></span>
 | ||
| <span id="cb55-45"><a href="#cb55-45" aria-hidden="true" tabindex="-1"></a><span class="fu">echo</span> <span class="st">"Mmm something went wrong!</span><span class="ch">`n</span><span class="st">Error Code: </span><span class="va">$CallResult</span><span class="st">"</span></span>
 | ||
| <span id="cb55-46"><a href="#cb55-46" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb55-47"><a href="#cb55-47" aria-hidden="true" tabindex="-1"></a><span class="cf">else</span> <span class="op">{</span></span>
 | ||
| <span id="cb55-48"><a href="#cb55-48" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">([</span>System<span class="op">.</span><span class="fu">IntPtr</span><span class="op">]::</span>Size <span class="op">-eq</span> <span class="dv">4</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb55-49"><a href="#cb55-49" aria-hidden="true" tabindex="-1"></a><span class="fu">echo</span> <span class="st">"</span><span class="ch">`n</span><span class="st">Netapi32::NetSessionEnum Buffer Offset  --> 0x</span><span class="op">$(</span><span class="st">"{0:X8}"</span> <span class="op">-</span>f <span class="va">$OutBuffPtr</span><span class="op">.</span><span class="fu">ToInt32</span><span class="op">()</span><span class="st">)"</span></span>
 | ||
| <span id="cb55-50"><a href="#cb55-50" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb55-51"><a href="#cb55-51" aria-hidden="true" tabindex="-1"></a><span class="cf">else</span> <span class="op">{</span></span>
 | ||
| <span id="cb55-52"><a href="#cb55-52" aria-hidden="true" tabindex="-1"></a><span class="fu">echo</span> <span class="st">"</span><span class="ch">`n</span><span class="st">Netapi32::NetSessionEnum Buffer Offset  --> 0x</span><span class="op">$(</span><span class="st">"{0:X16}"</span> <span class="op">-</span>f <span class="va">$OutBuffPtr</span><span class="op">.</span><span class="fu">ToInt64</span><span class="op">()</span><span class="st">)"</span></span>
 | ||
| <span id="cb55-53"><a href="#cb55-53" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb55-54"><a href="#cb55-54" aria-hidden="true" tabindex="-1"></a><span class="fu">echo</span> <span class="st">"Result-set contains </span><span class="va">$EntriesRead</span><span class="st"> session(s)!"</span></span>
 | ||
| <span id="cb55-55"><a href="#cb55-55" aria-hidden="true" tabindex="-1"></a><span class="co"># Change buffer offset to int</span></span>
 | ||
| <span id="cb55-56"><a href="#cb55-56" aria-hidden="true" tabindex="-1"></a><span class="va">$BufferOffset</span> <span class="op">=</span> <span class="va">$OutBuffPtr</span><span class="op">.</span><span class="fu">ToInt64</span><span class="op">()</span></span>
 | ||
| <span id="cb55-57"><a href="#cb55-57" aria-hidden="true" tabindex="-1"></a><span class="co"># Loop buffer entries and cast pointers as SessionInfo10</span></span>
 | ||
| <span id="cb55-58"><a href="#cb55-58" aria-hidden="true" tabindex="-1"></a><span class="cf">for</span> <span class="op">(</span><span class="va">$Count</span> <span class="op">=</span> <span class="dv">0</span><span class="op">;</span> <span class="op">(</span><span class="va">$Count</span> <span class="op">-lt</span> <span class="va">$EntriesRead</span><span class="op">);</span> <span class="va">$Count</span><span class="op">++){</span></span>
 | ||
| <span id="cb55-59"><a href="#cb55-59" aria-hidden="true" tabindex="-1"></a><span class="va">$NewIntPtr</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Intptr</span> <span class="op">-</span>ArgumentList <span class="va">$BufferOffset</span></span>
 | ||
| <span id="cb55-60"><a href="#cb55-60" aria-hidden="true" tabindex="-1"></a><span class="va">$Info</span> <span class="op">=</span> <span class="op">[</span>system<span class="op">.</span><span class="fu">runtime</span><span class="op">.</span><span class="fu">interopservices</span><span class="op">.</span><span class="fu">marshal</span><span class="op">]::</span>PtrToStructure<span class="op">(</span><span class="va">$NewIntPtr</span><span class="op">,[</span>type<span class="op">]</span><span class="va">$SessionInfo10</span><span class="op">)</span></span>
 | ||
| <span id="cb55-61"><a href="#cb55-61" aria-hidden="true" tabindex="-1"></a><span class="va">$Info</span></span>
 | ||
| <span id="cb55-62"><a href="#cb55-62" aria-hidden="true" tabindex="-1"></a><span class="va">$BufferOffset</span> <span class="op">=</span> <span class="va">$BufferOffset</span> <span class="op">+</span> <span class="va">$SessionInfo10StructSize</span></span>
 | ||
| <span id="cb55-63"><a href="#cb55-63" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb55-64"><a href="#cb55-64" aria-hidden="true" tabindex="-1"></a><span class="fu">echo</span> <span class="st">"</span><span class="ch">`n</span><span class="st">Calling NetApiBufferFree, no memleaks here!"</span></span>
 | ||
| <span id="cb55-65"><a href="#cb55-65" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Netapi32<span class="op">]::</span>NetApiBufferFree<span class="op">(</span><span class="va">$OutBuffPtr</span><span class="op">)</span> <span class="op">|</span><span class="fu">Out-Null</span></span>
 | ||
| <span id="cb55-66"><a href="#cb55-66" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb55-67"><a href="#cb55-67" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>Invoke-NetSessionEnum localhost</code></p>
 | ||
| <h3 id="copyfile">CopyFile</h3>
 | ||
| <p>Function:
 | ||
| https://learn.microsoft.com/ru-ru/windows/win32/api/winbase/nf-winbase-copyfile<br />
 | ||
| Source:
 | ||
| https://devblogs.microsoft.com/scripting/use-powershell-to-interact-with-the-windows-api-part-1/</p>
 | ||
| <div class="sourceCode" id="cb56"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb56-1"><a href="#cb56-1" aria-hidden="true" tabindex="-1"></a><span class="va">$MethodDefinition</span> <span class="op">=</span> <span class="vs">@"</span></span>
 | ||
| <span id="cb56-2"><a href="#cb56-2" aria-hidden="true" tabindex="-1"></a><span class="vs">[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]</span></span>
 | ||
| <span id="cb56-3"><a href="#cb56-3" aria-hidden="true" tabindex="-1"></a><span class="vs">public static extern bool CopyFile(string lpExistingFileName, string lpNewFileName, bool bFailIfExists);</span></span>
 | ||
| <span id="cb56-4"><a href="#cb56-4" aria-hidden="true" tabindex="-1"></a><span class="vs">"@</span></span>
 | ||
| <span id="cb56-5"><a href="#cb56-5" aria-hidden="true" tabindex="-1"></a><span class="va">$Kernel32</span> <span class="op">=</span> <span class="fu">Add-Type</span> <span class="op">-</span>MemberDefinition <span class="va">$MethodDefinition</span> <span class="op">-</span>Name <span class="st">"Kernel32"</span> <span class="op">-</span>Namespace <span class="st">"Win32"</span> <span class="op">-</span>PassThru</span>
 | ||
| <span id="cb56-6"><a href="#cb56-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Kernel32</span><span class="op">::</span>CopyFile<span class="op">(</span><span class="st">"</span><span class="op">$(</span><span class="va">$Env</span><span class="op">:</span><span class="va">SystemRoot</span><span class="op">)</span><span class="st">\System32\calc.exe"</span><span class="op">,</span> <span class="st">"</span><span class="op">$(</span><span class="va">$Env</span><span class="op">:</span><span class="va">USERPROFILE</span><span class="op">)</span><span class="st">\Desktop\calc.exe"</span><span class="op">,</span> <span class="va">$False</span><span class="op">)</span> </span></code></pre></div>
 | ||
| <h3 id="showwindowasync">ShowWindowAsync</h3>
 | ||
| <p>Function:
 | ||
| https://learn.microsoft.com/ru-ru/windows/win32/api/winuser/nf-winuser-showwindowasync</p>
 | ||
| <div class="sourceCode" id="cb57"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb57-1"><a href="#cb57-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Signature</span> <span class="op">=</span> <span class="vs">@"</span></span>
 | ||
| <span id="cb57-2"><a href="#cb57-2" aria-hidden="true" tabindex="-1"></a><span class="vs">[DllImport("user32.dll")]public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);</span></span>
 | ||
| <span id="cb57-3"><a href="#cb57-3" aria-hidden="true" tabindex="-1"></a><span class="vs">"@</span></span>
 | ||
| <span id="cb57-4"><a href="#cb57-4" aria-hidden="true" tabindex="-1"></a><span class="va">$ShowWindowAsync</span> <span class="op">=</span> <span class="fu">Add-Type</span> <span class="op">-</span>MemberDefinition <span class="va">$Signature</span> <span class="op">-</span>Name <span class="st">"Win32ShowWindowAsync"</span> <span class="op">-</span>Namespace Win32Functions <span class="op">-</span>PassThru</span>
 | ||
| <span id="cb57-5"><a href="#cb57-5" aria-hidden="true" tabindex="-1"></a><span class="va">$ShowWindowAsync</span> <span class="op">|</span> <span class="fu">Get-Member</span> <span class="op">-</span>Static</span>
 | ||
| <span id="cb57-6"><a href="#cb57-6" aria-hidden="true" tabindex="-1"></a><span class="va">$ShowWindowAsync</span><span class="op">::</span>ShowWindowAsync<span class="op">((</span><span class="fu">Get-Process</span> <span class="op">-</span>Id <span class="va">$pid</span><span class="op">).</span><span class="fu">MainWindowHandle</span><span class="op">,</span> <span class="dv">2</span><span class="op">)</span></span>
 | ||
| <span id="cb57-7"><a href="#cb57-7" aria-hidden="true" tabindex="-1"></a><span class="va">$ShowWindowAsync</span><span class="op">::</span>ShowWindowAsync<span class="op">((</span><span class="fu">Get-Process</span> <span class="op">-</span>Id <span class="va">$Pid</span><span class="op">).</span><span class="fu">MainWindowHandle</span><span class="op">,</span> <span class="dv">3</span><span class="op">)</span></span>
 | ||
| <span id="cb57-8"><a href="#cb57-8" aria-hidden="true" tabindex="-1"></a><span class="va">$ShowWindowAsync</span><span class="op">::</span>ShowWindowAsync<span class="op">((</span><span class="fu">Get-Process</span> <span class="op">-</span>Id <span class="va">$Pid</span><span class="op">).</span><span class="fu">MainWindowHandle</span><span class="op">,</span> <span class="dv">4</span><span class="op">)</span></span></code></pre></div>
 | ||
| <h3 id="getasynckeystate">GetAsyncKeyState</h3>
 | ||
| <p>Function:
 | ||
| https://learn.microsoft.com/ru-ru/windows/win32/api/winuser/nf-winuser-getasynckeystate</p>
 | ||
| <p><code>Add-Type -AssemblyName System.Windows.Forms</code><br />
 | ||
| <code>[int][System.Windows.Forms.Keys]::F1</code> определить номер [Int]
 | ||
| клавиши по ее названию<br />
 | ||
| <code>65..90 | % {"{0} = {1}" -f $_, [System.Windows.Forms.Keys]$_}</code>
 | ||
| порядковый номер букв (A..Z)</p>
 | ||
| <div class="sourceCode" id="cb58"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb58-1"><a href="#cb58-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-ControlKey <span class="op">{</span></span>
 | ||
| <span id="cb58-2"><a href="#cb58-2" aria-hidden="true" tabindex="-1"></a><span class="va">$key</span> <span class="op">=</span> <span class="dv">112</span></span>
 | ||
| <span id="cb58-3"><a href="#cb58-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Signature</span> <span class="op">=</span> <span class="vs">@'</span></span>
 | ||
| <span id="cb58-4"><a href="#cb58-4" aria-hidden="true" tabindex="-1"></a><span class="vs">[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)] </span></span>
 | ||
| <span id="cb58-5"><a href="#cb58-5" aria-hidden="true" tabindex="-1"></a><span class="vs">public static extern short GetAsyncKeyState(int virtualKeyCode); </span></span>
 | ||
| <span id="cb58-6"><a href="#cb58-6" aria-hidden="true" tabindex="-1"></a><span class="vs">'@</span></span>
 | ||
| <span id="cb58-7"><a href="#cb58-7" aria-hidden="true" tabindex="-1"></a><span class="fu">Add-Type</span> <span class="op">-</span>MemberDefinition <span class="va">$Signature</span> <span class="op">-</span>Name Keyboard <span class="op">-</span>Namespace PsOneApi</span>
 | ||
| <span id="cb58-8"><a href="#cb58-8" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">bool</span><span class="op">]([</span>PsOneApi<span class="op">.</span><span class="fu">Keyboard</span><span class="op">]::</span>GetAsyncKeyState<span class="op">(</span><span class="va">$key</span><span class="op">)</span> <span class="op">-eq</span> <span class="op">-</span><span class="dv">32767</span><span class="op">)</span></span>
 | ||
| <span id="cb58-9"><a href="#cb58-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb58-10"><a href="#cb58-10" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb58-11"><a href="#cb58-11" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Warning</span> <span class="st">'Press F1 to exit'</span></span>
 | ||
| <span id="cb58-12"><a href="#cb58-12" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(</span><span class="va">$true</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb58-13"><a href="#cb58-13" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Host</span> <span class="st">'.'</span> <span class="op">-</span>NoNewline</span>
 | ||
| <span id="cb58-14"><a href="#cb58-14" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span>Get-ControlKey<span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb58-15"><a href="#cb58-15" aria-hidden="true" tabindex="-1"></a><span class="cf">break</span></span>
 | ||
| <span id="cb58-16"><a href="#cb58-16" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb58-17"><a href="#cb58-17" aria-hidden="true" tabindex="-1"></a><span class="fu">Start-Sleep</span> <span class="op">-</span>Seconds <span class="dv">0.5</span></span>
 | ||
| <span id="cb58-18"><a href="#cb58-18" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <h1 id="console-api">Console API</h1>
 | ||
| <p>Source:
 | ||
| https://powershell.one/tricks/input-devices/detect-key-press</p>
 | ||
| <p><code>[Console] | Get-Member -Static</code><br />
 | ||
| <code>[Console]::BackgroundColor = "Blue"</code><br />
 | ||
| <code>[Console]::OutputEncoding</code> используемая кодировка в текущей
 | ||
| сессии<br />
 | ||
| <code>[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")</code>
 | ||
| изменить кодировку для отображения кириллицы<br />
 | ||
| <code>[Console]::outputEncoding = [System.Text.Encoding]::GetEncoding("cp866")</code>
 | ||
| для ISE<br />
 | ||
| <code>[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("windows-1251")</code>
 | ||
| для ps2exe<br />
 | ||
| <code>Get-Service | Out-File $home\Desktop\Service.txt -Encoding oem</code>
 | ||
| ><br />
 | ||
| <code>Get-Service | Out-File $home\Desktop\Service.txt -Append</code>
 | ||
| >></p>
 | ||
| <div class="sourceCode" id="cb59"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb59-1"><a href="#cb59-1" aria-hidden="true" tabindex="-1"></a><span class="cf">do</span> <span class="op">{</span></span>
 | ||
| <span id="cb59-2"><a href="#cb59-2" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">([</span>Console<span class="op">]::</span>KeyAvailable<span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb59-3"><a href="#cb59-3" aria-hidden="true" tabindex="-1"></a><span class="va">$keyInfo</span> <span class="op">=</span> <span class="op">[</span>Console<span class="op">]::</span>ReadKey<span class="op">(</span><span class="va">$true</span><span class="op">)</span></span>
 | ||
| <span id="cb59-4"><a href="#cb59-4" aria-hidden="true" tabindex="-1"></a><span class="cf">break</span></span>
 | ||
| <span id="cb59-5"><a href="#cb59-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb59-6"><a href="#cb59-6" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Host</span> <span class="st">"."</span> <span class="op">-</span>NoNewline</span>
 | ||
| <span id="cb59-7"><a href="#cb59-7" aria-hidden="true" tabindex="-1"></a><span class="fu">sleep</span> <span class="dv">1</span></span>
 | ||
| <span id="cb59-8"><a href="#cb59-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">while</span> <span class="op">(</span><span class="va">$true</span><span class="op">)</span></span>
 | ||
| <span id="cb59-9"><a href="#cb59-9" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Host</span></span>
 | ||
| <span id="cb59-10"><a href="#cb59-10" aria-hidden="true" tabindex="-1"></a><span class="va">$keyInfo</span></span>
 | ||
| <span id="cb59-11"><a href="#cb59-11" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb59-12"><a href="#cb59-12" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-KeyPress <span class="op">{</span></span>
 | ||
| <span id="cb59-13"><a href="#cb59-13" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span> <span class="op">(</span></span>
 | ||
| <span id="cb59-14"><a href="#cb59-14" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Parameter<span class="op">(</span>Mandatory<span class="op">)][</span>ConsoleKey<span class="op">]</span><span class="va">$Key</span><span class="op">,</span></span>
 | ||
| <span id="cb59-15"><a href="#cb59-15" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>System<span class="op">.</span><span class="fu">ConsoleModifiers</span><span class="op">]</span><span class="va">$ModifierKey</span> <span class="op">=</span> <span class="dv">0</span></span>
 | ||
| <span id="cb59-16"><a href="#cb59-16" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
 | ||
| <span id="cb59-17"><a href="#cb59-17" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">([</span>Console<span class="op">]::</span>KeyAvailable<span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb59-18"><a href="#cb59-18" aria-hidden="true" tabindex="-1"></a><span class="va">$pressedKey</span> <span class="op">=</span> <span class="op">[</span>Console<span class="op">]::</span>ReadKey<span class="op">(</span><span class="va">$true</span><span class="op">)</span></span>
 | ||
| <span id="cb59-19"><a href="#cb59-19" aria-hidden="true" tabindex="-1"></a><span class="va">$isPressedKey</span> <span class="op">=</span> <span class="va">$key</span> <span class="op">-eq</span> <span class="va">$pressedKey</span><span class="op">.</span><span class="fu">Key</span></span>
 | ||
| <span id="cb59-20"><a href="#cb59-20" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$isPressedKey</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb59-21"><a href="#cb59-21" aria-hidden="true" tabindex="-1"></a><span class="va">$pressedKey</span><span class="op">.</span><span class="fu">Modifiers</span> <span class="op">-eq</span> <span class="va">$ModifierKey</span></span>
 | ||
| <span id="cb59-22"><a href="#cb59-22" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">else</span> <span class="op">{</span></span>
 | ||
| <span id="cb59-23"><a href="#cb59-23" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Console<span class="op">]::</span>Beep<span class="op">(</span><span class="dv">1800</span><span class="op">,</span> <span class="dv">200</span><span class="op">)</span></span>
 | ||
| <span id="cb59-24"><a href="#cb59-24" aria-hidden="true" tabindex="-1"></a><span class="va">$false</span></span>
 | ||
| <span id="cb59-25"><a href="#cb59-25" aria-hidden="true" tabindex="-1"></a><span class="op">}}}</span></span>
 | ||
| <span id="cb59-26"><a href="#cb59-26" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb59-27"><a href="#cb59-27" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Warning</span> <span class="st">'Press Ctrl+Shift+Q to exit'</span></span>
 | ||
| <span id="cb59-28"><a href="#cb59-28" aria-hidden="true" tabindex="-1"></a><span class="cf">do</span> <span class="op">{</span></span>
 | ||
| <span id="cb59-29"><a href="#cb59-29" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Host</span> <span class="st">"."</span> <span class="op">-</span>NoNewline</span>
 | ||
| <span id="cb59-30"><a href="#cb59-30" aria-hidden="true" tabindex="-1"></a><span class="va">$pressed</span> <span class="op">=</span> Get-KeyPress <span class="op">-</span>Key Q <span class="op">-</span>ModifierKey <span class="st">'Control,Shift'</span></span>
 | ||
| <span id="cb59-31"><a href="#cb59-31" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$pressed</span><span class="op">)</span> <span class="op">{</span><span class="cf">break</span><span class="op">}</span></span>
 | ||
| <span id="cb59-32"><a href="#cb59-32" aria-hidden="true" tabindex="-1"></a><span class="fu">sleep</span> <span class="dv">1</span></span>
 | ||
| <span id="cb59-33"><a href="#cb59-33" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">while</span> <span class="op">(</span><span class="va">$true</span><span class="op">)</span></span></code></pre></div>
 | ||
| <h1 id="drawing">Drawing</h1>
 | ||
| <p>API:
 | ||
| https://learn.microsoft.com/en-us/dotnet/api/system.drawing?view=net-7.0&redirectedfrom=MSDN</p>
 | ||
| <div class="sourceCode" id="cb60"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb60-1"><a href="#cb60-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Add-Type</span> <span class="op">-</span>AssemblyName System<span class="op">.</span><span class="fu">Drawing</span></span>
 | ||
| <span id="cb60-2"><a href="#cb60-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Width</span> <span class="op">=</span> <span class="dv">800</span></span>
 | ||
| <span id="cb60-3"><a href="#cb60-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Height</span> <span class="op">=</span> <span class="dv">400</span></span>
 | ||
| <span id="cb60-4"><a href="#cb60-4" aria-hidden="true" tabindex="-1"></a><span class="va">$image</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Bitmap</span><span class="op">(</span><span class="va">$Width</span><span class="op">,</span><span class="va">$Height</span><span class="op">)</span></span>
 | ||
| <span id="cb60-5"><a href="#cb60-5" aria-hidden="true" tabindex="-1"></a><span class="va">$graphic</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Graphics</span><span class="op">]::</span>FromImage<span class="op">(</span><span class="va">$image</span><span class="op">)</span></span>
 | ||
| <span id="cb60-6"><a href="#cb60-6" aria-hidden="true" tabindex="-1"></a><span class="va">$background_color</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Brushes</span><span class="op">]::</span>Blue <span class="co"># задать цвет фона (синий)</span></span>
 | ||
| <span id="cb60-7"><a href="#cb60-7" aria-hidden="true" tabindex="-1"></a><span class="va">$graphic</span><span class="op">.</span><span class="fu">FillRectangle</span><span class="op">(</span><span class="va">$background_color</span><span class="op">,</span> <span class="dv">0</span><span class="op">,</span> <span class="dv">0</span><span class="op">,</span> <span class="va">$image</span><span class="op">.</span><span class="fu">Width</span><span class="op">,</span> <span class="va">$image</span><span class="op">.</span><span class="fu">Height</span><span class="op">)</span></span>
 | ||
| <span id="cb60-8"><a href="#cb60-8" aria-hidden="true" tabindex="-1"></a><span class="va">$text_color</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Brushes</span><span class="op">]::</span>White <span class="co"># задать цвет текста (белый)</span></span>
 | ||
| <span id="cb60-9"><a href="#cb60-9" aria-hidden="true" tabindex="-1"></a><span class="va">$font</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Font</span><span class="op">(</span><span class="st">"Arial"</span><span class="op">,</span> <span class="dv">20</span><span class="op">,</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">FontStyle</span><span class="op">]::</span>Bold<span class="op">)</span> <span class="co"># задать шрифт</span></span>
 | ||
| <span id="cb60-10"><a href="#cb60-10" aria-hidden="true" tabindex="-1"></a><span class="va">$text</span> <span class="op">=</span> <span class="st">"PowerShell"</span> <span class="co"># указать текст</span></span>
 | ||
| <span id="cb60-11"><a href="#cb60-11" aria-hidden="true" tabindex="-1"></a><span class="va">$text_position</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">RectangleF</span><span class="op">(</span><span class="dv">320</span><span class="op">,</span> <span class="dv">180</span><span class="op">,</span> <span class="dv">300</span><span class="op">,</span> <span class="dv">100</span><span class="op">)</span>  <span class="co"># задать положение текста (x, y, width, height)</span></span>
 | ||
| <span id="cb60-12"><a href="#cb60-12" aria-hidden="true" tabindex="-1"></a><span class="va">$graphic</span><span class="op">.</span><span class="fu">DrawString</span><span class="op">(</span><span class="va">$text</span><span class="op">,</span> <span class="va">$font</span><span class="op">,</span> <span class="va">$text_color</span><span class="op">,</span> <span class="va">$text_position</span><span class="op">)</span> <span class="co"># нанести текст на изображение</span></span>
 | ||
| <span id="cb60-13"><a href="#cb60-13" aria-hidden="true" tabindex="-1"></a><span class="va">$image</span><span class="op">.</span><span class="fu">Save</span><span class="op">(</span><span class="st">"</span><span class="va">$home</span><span class="st">\desktop\powershell_image.bmp"</span><span class="op">,</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Imaging</span><span class="op">.</span><span class="fu">ImageFormat</span><span class="op">]::</span>Bmp<span class="op">)</span> <span class="co"># сохранить изображение</span></span>
 | ||
| <span id="cb60-14"><a href="#cb60-14" aria-hidden="true" tabindex="-1"></a><span class="va">$image</span><span class="op">.</span><span class="fu">Dispose</span><span class="op">()</span> <span class="co"># освобождение ресурсов</span></span></code></pre></div>
 | ||
| <p><code>$path = "$home\desktop\powershell_image.bmp"</code><br />
 | ||
| <code>Invoke-Item $path</code></p>
 | ||
| <div class="sourceCode" id="cb61"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb61-1"><a href="#cb61-1" aria-hidden="true" tabindex="-1"></a><span class="va">$src_image</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Image</span><span class="op">]::</span>FromFile<span class="op">(</span><span class="va">$path</span><span class="op">)</span></span>
 | ||
| <span id="cb61-2"><a href="#cb61-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Width</span> <span class="op">=</span> <span class="dv">400</span></span>
 | ||
| <span id="cb61-3"><a href="#cb61-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Height</span> <span class="op">=</span> <span class="dv">200</span></span>
 | ||
| <span id="cb61-4"><a href="#cb61-4" aria-hidden="true" tabindex="-1"></a><span class="va">$dst_image</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Bitmap</span> <span class="op">-</span>ArgumentList <span class="va">$src_image</span><span class="op">,</span> <span class="va">$Width</span><span class="op">,</span> <span class="va">$Height</span> <span class="co"># изменить размер изображения</span></span>
 | ||
| <span id="cb61-5"><a href="#cb61-5" aria-hidden="true" tabindex="-1"></a><span class="va">$dst_image</span><span class="op">.</span><span class="fu">Save</span><span class="op">(</span><span class="st">"</span><span class="va">$home</span><span class="st">\desktop\powershell_image_resize.bmp"</span><span class="op">,</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Imaging</span><span class="op">.</span><span class="fu">ImageFormat</span><span class="op">]::</span>Bmp<span class="op">)</span></span>
 | ||
| <span id="cb61-6"><a href="#cb61-6" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb61-7"><a href="#cb61-7" aria-hidden="true" tabindex="-1"></a><span class="va">$rotated_image</span> <span class="op">=</span> <span class="va">$src_image</span><span class="op">.</span><span class="fu">Clone</span><span class="op">()</span> <span class="co"># создать копию исходного изображения</span></span>
 | ||
| <span id="cb61-8"><a href="#cb61-8" aria-hidden="true" tabindex="-1"></a><span class="va">$rotated_image</span><span class="op">.</span><span class="fu">RotateFlip</span><span class="op">([</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">RotateFlipType</span><span class="op">]::</span>Rotate180FlipNone<span class="op">)</span> <span class="co"># перевернуть изображение на 180 градусов</span></span>
 | ||
| <span id="cb61-9"><a href="#cb61-9" aria-hidden="true" tabindex="-1"></a><span class="va">$rotated_image</span><span class="op">.</span><span class="fu">Save</span><span class="op">(</span><span class="st">"</span><span class="va">$home</span><span class="st">\desktop\powershell_image_rotated.bmp"</span><span class="op">,</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Imaging</span><span class="op">.</span><span class="fu">ImageFormat</span><span class="op">]::</span>Bmp<span class="op">)</span></span>
 | ||
| <span id="cb61-10"><a href="#cb61-10" aria-hidden="true" tabindex="-1"></a><span class="va">$src_image</span><span class="op">.</span><span class="fu">Dispose</span><span class="op">()</span> <span class="co"># закрыть (отпустить) исходный файл</span></span></code></pre></div>
 | ||
| <h1 id="objectevent">ObjectEvent</h1>
 | ||
| <div class="sourceCode" id="cb62"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb62-1"><a href="#cb62-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Timer</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Timers</span><span class="op">.</span><span class="fu">Timer</span></span>
 | ||
| <span id="cb62-2"><a href="#cb62-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Timer</span><span class="op">.</span><span class="fu">Interval</span> <span class="op">=</span> <span class="dv">1000</span></span>
 | ||
| <span id="cb62-3"><a href="#cb62-3" aria-hidden="true" tabindex="-1"></a><span class="dt">Register</span><span class="op">-</span>ObjectEvent <span class="op">-</span>InputObject <span class="va">$Timer</span> <span class="op">-</span>EventName Elapsed <span class="op">-</span>SourceIdentifier Timer<span class="op">.</span><span class="fu">Output</span> <span class="op">-</span>Action <span class="op">{</span></span>
 | ||
| <span id="cb62-4"><a href="#cb62-4" aria-hidden="true" tabindex="-1"></a><span class="va">$Random</span> <span class="op">=</span> <span class="fu">Get-Random</span> <span class="op">-</span>Min <span class="dv">0</span> <span class="op">-</span>Max <span class="dv">100</span></span>
 | ||
| <span id="cb62-5"><a href="#cb62-5" aria-hidden="true" tabindex="-1"></a><span class="dt">Write</span><span class="op">-</span>Host <span class="va">$Random</span> </span>
 | ||
| <span id="cb62-6"><a href="#cb62-6" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb62-7"><a href="#cb62-7" aria-hidden="true" tabindex="-1"></a><span class="va">$Timer</span><span class="op">.</span><span class="fu">Enabled</span> <span class="op">=</span> <span class="va">$True</span></span></code></pre></div>
 | ||
| <p><code>$Timer.Enabled = $False</code> остановить<br />
 | ||
| <code>$Timer | Get-Member -MemberType Event</code> отобразить список
 | ||
| всех событий объекта<br />
 | ||
| <code>Get-EventSubscriber</code> список зарегистрированных подписок на
 | ||
| события в текущей сессии<br />
 | ||
| <code>Unregister-Event -SourceIdentifier Timer.Output</code> удаляет
 | ||
| регистрацию подписки на событие по имени события (EventName) или все
 | ||
| *<br />
 | ||
| <code>-Forward</code> перенаправляет события из удаленного сеанса
 | ||
| (New-PSSession) в локальный сеанс<br />
 | ||
| <code>-SupportEvent</code> не выводит результат регистрации события на
 | ||
| экран (и Get-EventSubscriber и Get-Job)</p>
 | ||
| <pre><code>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)
 | ||
| }</code></pre>
 | ||
| <h1 id="sockets">Sockets</h1>
 | ||
| <h3 id="udp-socket">UDP Socket</h3>
 | ||
| <p>Source:
 | ||
| https://cloudbrothers.info/en/test-udp-connection-powershell/</p>
 | ||
| <div class="sourceCode" id="cb64"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb64-1"><a href="#cb64-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Start-UDPServer <span class="op">{</span></span>
 | ||
| <span id="cb64-2"><a href="#cb64-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span><span class="op">(</span></span>
 | ||
| <span id="cb64-3"><a href="#cb64-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Port</span> <span class="op">=</span> <span class="dv">5201</span></span>
 | ||
| <span id="cb64-4"><a href="#cb64-4" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
 | ||
| <span id="cb64-5"><a href="#cb64-5" aria-hidden="true" tabindex="-1"></a><span class="va">$RemoteComputer</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">IPEndPoint</span><span class="op">([</span>System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">IPAddress</span><span class="op">]::</span>Any<span class="op">,</span> <span class="dv">0</span><span class="op">)</span></span>
 | ||
| <span id="cb64-6"><a href="#cb64-6" aria-hidden="true" tabindex="-1"></a><span class="cf">do</span> <span class="op">{</span></span>
 | ||
| <span id="cb64-7"><a href="#cb64-7" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpObject</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">Sockets</span><span class="op">.</span><span class="fu">UdpClient</span><span class="op">(</span><span class="va">$Port</span><span class="op">)</span></span>
 | ||
| <span id="cb64-8"><a href="#cb64-8" aria-hidden="true" tabindex="-1"></a><span class="va">$ReceiveBytes</span> <span class="op">=</span> <span class="va">$UdpObject</span><span class="op">.</span><span class="fu">Receive</span><span class="op">([</span>ref<span class="op">]</span><span class="va">$RemoteComputer</span><span class="op">)</span></span>
 | ||
| <span id="cb64-9"><a href="#cb64-9" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpObject</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span>
 | ||
| <span id="cb64-10"><a href="#cb64-10" aria-hidden="true" tabindex="-1"></a><span class="va">$ASCIIEncoding</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Text</span><span class="op">.</span><span class="fu">ASCIIEncoding</span></span>
 | ||
| <span id="cb64-11"><a href="#cb64-11" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$ReturnString</span> <span class="op">=</span> <span class="va">$ASCIIEncoding</span><span class="op">.</span><span class="fu">GetString</span><span class="op">(</span><span class="va">$ReceiveBytes</span><span class="op">)</span></span>
 | ||
| <span id="cb64-12"><a href="#cb64-12" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span></span>
 | ||
| <span id="cb64-13"><a href="#cb64-13" aria-hidden="true" tabindex="-1"></a>LocalDateTime <span class="op">=</span> <span class="op">$(</span><span class="fu">Get-Date</span> <span class="op">-</span>UFormat <span class="st">"%Y-%m-%d %T"</span><span class="op">)</span></span>
 | ||
| <span id="cb64-14"><a href="#cb64-14" aria-hidden="true" tabindex="-1"></a>ClientIP      <span class="op">=</span> <span class="va">$RemoteComputer</span><span class="op">.</span><span class="fu">address</span><span class="op">.</span><span class="fu">ToString</span><span class="op">()</span></span>
 | ||
| <span id="cb64-15"><a href="#cb64-15" aria-hidden="true" tabindex="-1"></a>ClientPort    <span class="op">=</span> <span class="va">$RemoteComputer</span><span class="op">.</span><span class="fu">Port</span><span class="op">.</span><span class="fu">ToString</span><span class="op">()</span></span>
 | ||
| <span id="cb64-16"><a href="#cb64-16" aria-hidden="true" tabindex="-1"></a>Message       <span class="op">=</span> <span class="va">$ReturnString</span></span>
 | ||
| <span id="cb64-17"><a href="#cb64-17" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb64-18"><a href="#cb64-18" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">while</span> <span class="op">(</span><span class="dv">1</span><span class="op">)</span></span>
 | ||
| <span id="cb64-19"><a href="#cb64-19" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>Start-UDPServer -Port 5201</code></p>
 | ||
| <h3 id="test-netudpconnection">Test-NetUDPConnection</h3>
 | ||
| <div class="sourceCode" id="cb65"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb65-1"><a href="#cb65-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Test-NetUDPConnection <span class="op">{</span></span>
 | ||
| <span id="cb65-2"><a href="#cb65-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span><span class="op">(</span></span>
 | ||
| <span id="cb65-3"><a href="#cb65-3" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$ComputerName</span> <span class="op">=</span> <span class="st">"127.0.0.1"</span><span class="op">,</span></span>
 | ||
| <span id="cb65-4"><a href="#cb65-4" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>int32<span class="op">]</span><span class="va">$PortServer</span>    <span class="op">=</span> <span class="dv">5201</span><span class="op">,</span></span>
 | ||
| <span id="cb65-5"><a href="#cb65-5" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>int32<span class="op">]</span><span class="va">$PortClient</span>    <span class="op">=</span> <span class="dv">5211</span><span class="op">,</span></span>
 | ||
| <span id="cb65-6"><a href="#cb65-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Message</span></span>
 | ||
| <span id="cb65-7"><a href="#cb65-7" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
 | ||
| <span id="cb65-8"><a href="#cb65-8" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span> <span class="op">{</span></span>
 | ||
| <span id="cb65-9"><a href="#cb65-9" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpObject</span> <span class="op">=</span> <span class="fu">New-Object</span> system<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">Sockets</span><span class="op">.</span><span class="fu">Udpclient</span><span class="op">(</span><span class="va">$PortClient</span><span class="op">)</span></span>
 | ||
| <span id="cb65-10"><a href="#cb65-10" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpObject</span><span class="op">.</span><span class="fu">Connect</span><span class="op">(</span><span class="va">$ComputerName</span><span class="op">,</span> <span class="va">$PortServer</span><span class="op">)</span></span>
 | ||
| <span id="cb65-11"><a href="#cb65-11" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb65-12"><a href="#cb65-12" aria-hidden="true" tabindex="-1"></a><span class="cf">process</span> <span class="op">{</span></span>
 | ||
| <span id="cb65-13"><a href="#cb65-13" aria-hidden="true" tabindex="-1"></a><span class="va">$ASCIIEncoding</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Text</span><span class="op">.</span><span class="fu">ASCIIEncoding</span></span>
 | ||
| <span id="cb65-14"><a href="#cb65-14" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(!</span><span class="va">$Message</span><span class="op">)</span> <span class="op">{</span><span class="va">$Message</span> <span class="op">=</span> <span class="fu">Get-Date</span> <span class="op">-</span>UFormat <span class="st">"%Y-%m-%d %T"</span><span class="op">}</span></span>
 | ||
| <span id="cb65-15"><a href="#cb65-15" aria-hidden="true" tabindex="-1"></a><span class="va">$Bytes</span> <span class="op">=</span> <span class="va">$ASCIIEncoding</span><span class="op">.</span><span class="fu">GetBytes</span><span class="op">(</span><span class="va">$Message</span><span class="op">)</span></span>
 | ||
| <span id="cb65-16"><a href="#cb65-16" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>void<span class="op">]</span><span class="va">$UdpObject</span><span class="op">.</span><span class="fu">Send</span><span class="op">(</span><span class="va">$Bytes</span><span class="op">,</span> <span class="va">$Bytes</span><span class="op">.</span><span class="fu">length</span><span class="op">)</span></span>
 | ||
| <span id="cb65-17"><a href="#cb65-17" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb65-18"><a href="#cb65-18" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span> <span class="op">{</span></span>
 | ||
| <span id="cb65-19"><a href="#cb65-19" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpObject</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span>
 | ||
| <span id="cb65-20"><a href="#cb65-20" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb65-21"><a href="#cb65-21" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>Test-NetUDPConnection -ComputerName 127.0.0.1 -PortServer 5201</code><br />
 | ||
| <code>Test-NetUDPConnection -ComputerName 127.0.0.1 -PortServer 514 -Message "<30>May 31 00:00:00 HostName multipathd[784]: Test message"</code></p>
 | ||
| <h3 id="tcp-socket">TCP Socket</h3>
 | ||
| <div class="sourceCode" id="cb66"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb66-1"><a href="#cb66-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Start-TCPServer <span class="op">{</span></span>
 | ||
| <span id="cb66-2"><a href="#cb66-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span><span class="op">(</span></span>
 | ||
| <span id="cb66-3"><a href="#cb66-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Port</span> <span class="op">=</span> <span class="dv">5201</span></span>
 | ||
| <span id="cb66-4"><a href="#cb66-4" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
 | ||
| <span id="cb66-5"><a href="#cb66-5" aria-hidden="true" tabindex="-1"></a><span class="cf">do</span> <span class="op">{</span></span>
 | ||
| <span id="cb66-6"><a href="#cb66-6" aria-hidden="true" tabindex="-1"></a><span class="va">$TcpObject</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">Sockets</span><span class="op">.</span><span class="fu">TcpListener</span><span class="op">(</span><span class="va">$port</span><span class="op">)</span></span>
 | ||
| <span id="cb66-7"><a href="#cb66-7" aria-hidden="true" tabindex="-1"></a><span class="va">$ReceiveBytes</span> <span class="op">=</span> <span class="va">$TcpObject</span><span class="op">.</span><span class="fu">Start</span><span class="op">()</span></span>
 | ||
| <span id="cb66-8"><a href="#cb66-8" aria-hidden="true" tabindex="-1"></a><span class="va">$ReceiveBytes</span> <span class="op">=</span> <span class="va">$TcpObject</span><span class="op">.</span><span class="fu">AcceptTcpClient</span><span class="op">()</span></span>
 | ||
| <span id="cb66-9"><a href="#cb66-9" aria-hidden="true" tabindex="-1"></a><span class="va">$TcpObject</span><span class="op">.</span><span class="fu">Stop</span><span class="op">()</span></span>
 | ||
| <span id="cb66-10"><a href="#cb66-10" aria-hidden="true" tabindex="-1"></a><span class="va">$ReceiveBytes</span><span class="op">.</span><span class="fu">Client</span><span class="op">.</span><span class="fu">RemoteEndPoint</span> <span class="op">|</span> <span class="fu">select</span> Address<span class="op">,</span>Port</span>
 | ||
| <span id="cb66-11"><a href="#cb66-11" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">while</span> <span class="op">(</span><span class="dv">1</span><span class="op">)</span></span>
 | ||
| <span id="cb66-12"><a href="#cb66-12" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>Start-TCPServer -Port 5201</code><br />
 | ||
| <code>Test-NetConnection -ComputerName 127.0.0.1 -Port 5201</code></p>
 | ||
| <h3 id="wakeonlan">WakeOnLan</h3>
 | ||
| <p>Broadcast package consisting of 6 byte filled “0xFF” and then 96 byte
 | ||
| where the mac address is repeated 16 times</p>
 | ||
| <div class="sourceCode" id="cb67"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb67-1"><a href="#cb67-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Send-WOL <span class="op">{</span></span>
 | ||
| <span id="cb67-2"><a href="#cb67-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span> <span class="op">(</span></span>
 | ||
| <span id="cb67-3"><a href="#cb67-3" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Parameter<span class="op">(</span>Mandatory <span class="op">=</span> <span class="va">$True</span><span class="op">)]</span><span class="va">$Mac</span><span class="op">,</span></span>
 | ||
| <span id="cb67-4"><a href="#cb67-4" aria-hidden="true" tabindex="-1"></a><span class="va">$IP</span><span class="op">,</span></span>
 | ||
| <span id="cb67-5"><a href="#cb67-5" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">int</span><span class="op">]</span><span class="va">$Port</span> <span class="op">=</span> <span class="dv">9</span></span>
 | ||
| <span id="cb67-6"><a href="#cb67-6" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
 | ||
| <span id="cb67-7"><a href="#cb67-7" aria-hidden="true" tabindex="-1"></a><span class="va">$Mac</span> <span class="op">=</span> <span class="va">$Mac</span><span class="op">.</span><span class="fu">replace</span><span class="op">(</span><span class="st">":"</span><span class="op">,</span> <span class="st">"-"</span><span class="op">)</span></span>
 | ||
| <span id="cb67-8"><a href="#cb67-8" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(!</span><span class="va">$IP</span><span class="op">)</span> <span class="op">{</span><span class="va">$IP</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">IPAddress</span><span class="op">]::</span>Broadcast<span class="op">}</span></span>
 | ||
| <span id="cb67-9"><a href="#cb67-9" aria-hidden="true" tabindex="-1"></a><span class="va">$SynchronizationChain</span> <span class="op">=</span> <span class="op">[</span><span class="dt">byte</span><span class="op">[]](,</span><span class="dv">0xFF</span> <span class="op">*</span> <span class="dv">6</span><span class="op">)</span></span>
 | ||
| <span id="cb67-10"><a href="#cb67-10" aria-hidden="true" tabindex="-1"></a><span class="va">$ByteMac</span> <span class="op">=</span> <span class="va">$Mac</span><span class="op">.</span><span class="fu">Split</span><span class="op">(</span><span class="st">"-"</span><span class="op">)</span> <span class="op">|</span> <span class="op">%{[</span><span class="dt">byte</span><span class="op">](</span><span class="st">"0x"</span> <span class="op">+</span> <span class="va">$_</span><span class="op">)}</span></span>
 | ||
| <span id="cb67-11"><a href="#cb67-11" aria-hidden="true" tabindex="-1"></a><span class="va">$Package</span> <span class="op">=</span> <span class="va">$SynchronizationChain</span> <span class="op">+</span> <span class="op">(</span><span class="va">$ByteMac</span> <span class="op">*</span> <span class="dv">16</span><span class="op">)</span></span>
 | ||
| <span id="cb67-12"><a href="#cb67-12" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpClient</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">Sockets</span><span class="op">.</span><span class="fu">UdpClient</span></span>
 | ||
| <span id="cb67-13"><a href="#cb67-13" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpClient</span><span class="op">.</span><span class="fu">Connect</span><span class="op">(</span><span class="va">$IP</span><span class="op">,</span> <span class="va">$port</span><span class="op">)</span></span>
 | ||
| <span id="cb67-14"><a href="#cb67-14" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpClient</span><span class="op">.</span><span class="fu">Send</span><span class="op">(</span><span class="va">$Package</span><span class="op">,</span> <span class="va">$Package</span><span class="op">.</span><span class="fu">Length</span><span class="op">)</span></span>
 | ||
| <span id="cb67-15"><a href="#cb67-15" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpClient</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span>
 | ||
| <span id="cb67-16"><a href="#cb67-16" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>Send-WOL -Mac "D8-BB-C1-70-A3-4E"</code><br />
 | ||
| <code>Send-WOL -Mac "D8-BB-C1-70-A3-4E" -IP 192.168.3.100</code></p>
 | ||
| <h3 id="encoding">Encoding</h3>
 | ||
| <p><code>$ByteText = [System.Text.Encoding]::UTF8.GetBytes("password")</code><br />
 | ||
| <code>$Text = [System.Text.Encoding]::UTF8.GetString($ByteText)</code></p>
 | ||
| <h3 id="base64">Base64</h3>
 | ||
| <p><code>$text = "password"</code><br />
 | ||
| <code>$byte = [System.Text.Encoding]::Unicode.GetBytes($text)</code><br />
 | ||
| <code>$base64 = [System.Convert]::ToBase64String($byte)</code><br />
 | ||
| <code>$decode_base64 = [System.Convert]::FromBase64String($base64)</code><br />
 | ||
| <code>$decode_string = [System.Text.Encoding]::Unicode.GetString($decode_base64)</code></p>
 | ||
| <p><code>$path_image = "$home\Documents\1200x800.jpg"</code><br />
 | ||
| <code>$BBase64 = [System.Convert]::ToBase64String((Get-Content $path_image -Encoding Byte))</code><br />
 | ||
| <code>Add-Type -assembly System.Drawing</code><br />
 | ||
| <code>$Image = [System.Drawing.Bitmap]::FromStream([IO.MemoryStream][Convert]::FromBase64String($BBase64))</code><br />
 | ||
| <code>$Image.Save("$home\Desktop\1200x800.jpg")</code></p>
 | ||
| <h3 id="http-listener">HTTP Listener</h3>
 | ||
| <div class="sourceCode" id="cb68"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb68-1"><a href="#cb68-1" aria-hidden="true" tabindex="-1"></a><span class="va">$httpListener</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">HttpListener</span></span>
 | ||
| <span id="cb68-2"><a href="#cb68-2" aria-hidden="true" tabindex="-1"></a><span class="va">$httpListener</span><span class="op">.</span><span class="fu">Prefixes</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="st">"http://+:8888/"</span><span class="op">)</span></span>
 | ||
| <span id="cb68-3"><a href="#cb68-3" aria-hidden="true" tabindex="-1"></a><span class="va">$httpListener</span><span class="op">.</span><span class="fu">Start</span><span class="op">()</span></span>
 | ||
| <span id="cb68-4"><a href="#cb68-4" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(!([</span>console<span class="op">]::</span>KeyAvailable<span class="op">))</span> <span class="op">{</span></span>
 | ||
| <span id="cb68-5"><a href="#cb68-5" aria-hidden="true" tabindex="-1"></a><span class="va">$info</span> <span class="op">=</span> <span class="fu">Get-Service</span> <span class="op">|</span> <span class="fu">select</span> name<span class="op">,</span>status <span class="op">|</span> <span class="fu">ConvertTo-HTML</span></span>
 | ||
| <span id="cb68-6"><a href="#cb68-6" aria-hidden="true" tabindex="-1"></a><span class="va">$context</span> <span class="op">=</span> <span class="va">$httpListener</span><span class="op">.</span><span class="fu">GetContext</span><span class="op">()</span></span>
 | ||
| <span id="cb68-7"><a href="#cb68-7" aria-hidden="true" tabindex="-1"></a><span class="va">$context</span><span class="op">.</span><span class="fu">Response</span><span class="op">.</span><span class="fu">StatusCode</span> <span class="op">=</span> <span class="dv">200</span></span>
 | ||
| <span id="cb68-8"><a href="#cb68-8" aria-hidden="true" tabindex="-1"></a><span class="va">$context</span><span class="op">.</span><span class="fu">Response</span><span class="op">.</span><span class="fu">ContentType</span> <span class="op">=</span> <span class="st">'text/HTML'</span></span>
 | ||
| <span id="cb68-9"><a href="#cb68-9" aria-hidden="true" tabindex="-1"></a><span class="va">$WebContent</span> <span class="op">=</span> <span class="va">$info</span></span>
 | ||
| <span id="cb68-10"><a href="#cb68-10" aria-hidden="true" tabindex="-1"></a><span class="va">$EncodingWebContent</span> <span class="op">=</span> <span class="op">[</span>Text<span class="op">.</span><span class="fu">Encoding</span><span class="op">]::</span>UTF8<span class="op">.</span><span class="fu">GetBytes</span><span class="op">(</span><span class="va">$WebContent</span><span class="op">)</span></span>
 | ||
| <span id="cb68-11"><a href="#cb68-11" aria-hidden="true" tabindex="-1"></a><span class="va">$context</span><span class="op">.</span><span class="fu">Response</span><span class="op">.</span><span class="fu">OutputStream</span><span class="op">.</span><span class="fu">Write</span><span class="op">(</span><span class="va">$EncodingWebContent</span> <span class="op">,</span> <span class="dv">0</span><span class="op">,</span> <span class="va">$EncodingWebContent</span><span class="op">.</span><span class="fu">Length</span><span class="op">)</span></span>
 | ||
| <span id="cb68-12"><a href="#cb68-12" aria-hidden="true" tabindex="-1"></a><span class="va">$context</span><span class="op">.</span><span class="fu">Response</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span>
 | ||
| <span id="cb68-13"><a href="#cb68-13" aria-hidden="true" tabindex="-1"></a>Get-NetTcpConnection <span class="op">-</span>LocalPort <span class="dv">8888</span></span>
 | ||
| <span id="cb68-14"><a href="#cb68-14" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="fu">Get-Date</span><span class="op">).</span><span class="fu">datetime</span></span>
 | ||
| <span id="cb68-15"><a href="#cb68-15" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb68-16"><a href="#cb68-16" aria-hidden="true" tabindex="-1"></a><span class="va">$httpListener</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span></code></pre></div>
 | ||
| <h3 id="webclient">WebClient</h3>
 | ||
| <p><code>[System.Net.WebClient] | Get-Member</code><br />
 | ||
| <code>(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/Lifailon/PowerShell-Commands/rsa/README.md")</code></p>
 | ||
| <h3 id="certificate">Certificate</h3>
 | ||
| <div class="sourceCode" id="cb69"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb69-1"><a href="#cb69-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-WebCertificate <span class="op">(</span><span class="va">$srv</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb69-2"><a href="#cb69-2" aria-hidden="true" tabindex="-1"></a><span class="va">$iwr</span> <span class="op">=</span> <span class="fu">iwr</span> <span class="va">$srv</span></span>
 | ||
| <span id="cb69-3"><a href="#cb69-3" aria-hidden="true" tabindex="-1"></a><span class="va">$status_code</span> <span class="op">=</span> <span class="va">$iwr</span><span class="op">.</span><span class="fu">StatusCode</span></span>
 | ||
| <span id="cb69-4"><a href="#cb69-4" aria-hidden="true" tabindex="-1"></a><span class="va">$status</span> <span class="op">=</span> <span class="va">$iwr</span><span class="op">.</span><span class="fu">BaseResponse</span><span class="op">.</span><span class="fu">StatusCode</span></span>
 | ||
| <span id="cb69-5"><a href="#cb69-5" aria-hidden="true" tabindex="-1"></a><span class="va">$info</span> <span class="op">=</span> <span class="va">$iwr</span><span class="op">.</span><span class="fu">BaseResponse</span><span class="op">.</span><span class="fu">Server</span></span>
 | ||
| <span id="cb69-6"><a href="#cb69-6" aria-hidden="true" tabindex="-1"></a><span class="va">$spm</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">ServicePointManager</span><span class="op">]::</span>FindServicePoint<span class="op">(</span><span class="va">$srv</span><span class="op">)</span></span>
 | ||
| <span id="cb69-7"><a href="#cb69-7" aria-hidden="true" tabindex="-1"></a><span class="va">$date_end</span> <span class="op">=</span> <span class="va">$spm</span><span class="op">.</span><span class="fu">Certificate</span><span class="op">.</span><span class="fu">GetExpirationDateString</span><span class="op">()</span></span>
 | ||
| <span id="cb69-8"><a href="#cb69-8" aria-hidden="true" tabindex="-1"></a><span class="va">$cert_name</span> <span class="op">=</span> <span class="op">(</span><span class="va">$spm</span><span class="op">.</span><span class="fu">Certificate</span><span class="op">.</span><span class="fu">Subject</span><span class="op">)</span> <span class="op">-replace</span> <span class="st">"CN="</span></span>
 | ||
| <span id="cb69-9"><a href="#cb69-9" aria-hidden="true" tabindex="-1"></a><span class="va">$cert_owner</span> <span class="op">=</span> <span class="op">(((</span><span class="va">$spm</span><span class="op">.</span><span class="fu">Certificate</span><span class="op">.</span><span class="fu">Issuer</span><span class="op">)</span> <span class="op">-split</span> <span class="st">", "</span><span class="op">)</span> <span class="op">|</span> <span class="fu">where</span> <span class="op">{</span><span class="va">$_</span> <span class="op">-match</span> <span class="st">"O="</span><span class="op">})</span> <span class="op">-replace</span> <span class="st">"O="</span></span>
 | ||
| <span id="cb69-10"><a href="#cb69-10" aria-hidden="true" tabindex="-1"></a><span class="va">$Collections</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Collections</span><span class="op">.</span><span class="fu">Generic</span><span class="op">.</span><span class="fu">List</span><span class="op">[</span>System<span class="op">.</span><span class="fu">Object</span><span class="op">]</span></span>
 | ||
| <span id="cb69-11"><a href="#cb69-11" aria-hidden="true" tabindex="-1"></a><span class="va">$Collections</span><span class="op">.</span><span class="fu">Add</span><span class="op">([</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span></span>
 | ||
| <span id="cb69-12"><a href="#cb69-12" aria-hidden="true" tabindex="-1"></a>Host <span class="op">=</span> <span class="va">$srv</span><span class="op">;</span></span>
 | ||
| <span id="cb69-13"><a href="#cb69-13" aria-hidden="true" tabindex="-1"></a>Server <span class="op">=</span> <span class="va">$info</span><span class="op">;</span></span>
 | ||
| <span id="cb69-14"><a href="#cb69-14" aria-hidden="true" tabindex="-1"></a>Status <span class="op">=</span>  <span class="va">$status</span><span class="op">;</span></span>
 | ||
| <span id="cb69-15"><a href="#cb69-15" aria-hidden="true" tabindex="-1"></a>StatusCode <span class="op">=</span> <span class="va">$status_code</span><span class="op">;</span></span>
 | ||
| <span id="cb69-16"><a href="#cb69-16" aria-hidden="true" tabindex="-1"></a>Certificate <span class="op">=</span> <span class="va">$cert_name</span><span class="op">;</span></span>
 | ||
| <span id="cb69-17"><a href="#cb69-17" aria-hidden="true" tabindex="-1"></a>Issued <span class="op">=</span> <span class="va">$cert_owner</span><span class="op">;</span></span>
 | ||
| <span id="cb69-18"><a href="#cb69-18" aria-hidden="true" tabindex="-1"></a><span class="kw">End</span> <span class="op">=</span> <span class="va">$date_end</span></span>
 | ||
| <span id="cb69-19"><a href="#cb69-19" aria-hidden="true" tabindex="-1"></a><span class="op">})</span></span>
 | ||
| <span id="cb69-20"><a href="#cb69-20" aria-hidden="true" tabindex="-1"></a><span class="va">$Collections</span></span>
 | ||
| <span id="cb69-21"><a href="#cb69-21" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>Get-WebCertificate https://google.com</code></p>
 | ||
| <h1 id="excel">Excel</h1>
 | ||
| <div class="sourceCode" id="cb70"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb70-1"><a href="#cb70-1" aria-hidden="true" tabindex="-1"></a><span class="va">$path</span> <span class="op">=</span> <span class="st">"</span><span class="va">$home</span><span class="st">\Desktop\Services-to-Excel.xlsx"</span></span>
 | ||
| <span id="cb70-2"><a href="#cb70-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Excel</span> <span class="op">=</span> <span class="fu">New-Object</span> <span class="op">-</span>ComObject Excel<span class="op">.</span><span class="fu">Application</span></span>
 | ||
| <span id="cb70-3"><a href="#cb70-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Excel</span><span class="op">.</span><span class="fu">Visible</span> <span class="op">=</span> <span class="va">$false</span><span class="ch">` </span>отключить открытие GUI</span>
 | ||
| <span id="cb70-4"><a href="#cb70-4" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkBook</span> <span class="op">=</span> <span class="va">$Excel</span><span class="op">.</span><span class="fu">Workbooks</span><span class="op">.</span><span class="fu">Add</span><span class="op">()</span><span class="ch">` </span>Создать книгу</span>
 | ||
| <span id="cb70-5"><a href="#cb70-5" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span> <span class="op">=</span> <span class="va">$ExcelWorkBook</span><span class="op">.</span><span class="fu">Worksheets</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">)</span><span class="ch">` </span>Создать лист</span>
 | ||
| <span id="cb70-6"><a href="#cb70-6" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Name</span> <span class="op">=</span> <span class="st">"Services"</span><span class="ch">` </span>задать имя листа</span>
 | ||
| <span id="cb70-7"><a href="#cb70-7" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Cells</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">,</span><span class="dv">1</span><span class="op">)</span> <span class="op">=</span> <span class="st">"Name service"</span></span>
 | ||
| <span id="cb70-8"><a href="#cb70-8" aria-hidden="true" tabindex="-1"></a><span class="co"># Задать имена столбцов:</span></span>
 | ||
| <span id="cb70-9"><a href="#cb70-9" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Cells</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">,</span><span class="dv">2</span><span class="op">)</span> <span class="op">=</span> <span class="st">"Description"</span></span>
 | ||
| <span id="cb70-10"><a href="#cb70-10" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Cells</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">,</span><span class="dv">3</span><span class="op">)</span> <span class="op">=</span> <span class="st">"Status"</span></span>
 | ||
| <span id="cb70-11"><a href="#cb70-11" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Cells</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">,</span><span class="dv">4</span><span class="op">)</span> <span class="op">=</span> <span class="st">"Startup type"</span></span>
 | ||
| <span id="cb70-12"><a href="#cb70-12" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Rows</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">).</span><span class="fu">Font</span><span class="op">.</span><span class="fu">Bold</span> <span class="op">=</span> <span class="va">$true</span><span class="ch">` </span>выделить жирным шрифтом</span>
 | ||
| <span id="cb70-13"><a href="#cb70-13" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Rows</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">).</span><span class="fu">Font</span><span class="op">.</span><span class="fu">size</span><span class="op">=</span><span class="dv">14</span></span>
 | ||
| <span id="cb70-14"><a href="#cb70-14" aria-hidden="true" tabindex="-1"></a><span class="co"># Задать ширину колонок:</span></span>
 | ||
| <span id="cb70-15"><a href="#cb70-15" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">).</span><span class="fu">ColumnWidth</span><span class="op">=</span><span class="dv">30</span></span>
 | ||
| <span id="cb70-16"><a href="#cb70-16" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">2</span><span class="op">).</span><span class="fu">ColumnWidth</span><span class="op">=</span><span class="dv">80</span></span>
 | ||
| <span id="cb70-17"><a href="#cb70-17" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">3</span><span class="op">).</span><span class="fu">ColumnWidth</span><span class="op">=</span><span class="dv">15</span></span>
 | ||
| <span id="cb70-18"><a href="#cb70-18" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">4</span><span class="op">).</span><span class="fu">ColumnWidth</span><span class="op">=</span><span class="dv">25</span></span>
 | ||
| <span id="cb70-19"><a href="#cb70-19" aria-hidden="true" tabindex="-1"></a><span class="va">$services</span> <span class="op">=</span>  <span class="fu">Get-Service</span></span>
 | ||
| <span id="cb70-20"><a href="#cb70-20" aria-hidden="true" tabindex="-1"></a><span class="va">$counter</span> <span class="op">=</span> <span class="dv">2</span><span class="ch">` </span>задать начальный номер строки для записи</span>
 | ||
| <span id="cb70-21"><a href="#cb70-21" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$service</span> <span class="kw">in</span> <span class="va">$services</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb70-22"><a href="#cb70-22" aria-hidden="true" tabindex="-1"></a><span class="va">$status</span> <span class="op">=</span> <span class="va">$service</span><span class="op">.</span><span class="fu">Status</span></span>
 | ||
| <span id="cb70-23"><a href="#cb70-23" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$status</span> <span class="op">-eq</span> <span class="dv">1</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb70-24"><a href="#cb70-24" aria-hidden="true" tabindex="-1"></a><span class="va">$status_type</span> <span class="op">=</span> <span class="st">"Stopped"</span></span>
 | ||
| <span id="cb70-25"><a href="#cb70-25" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">elseif</span> <span class="op">(</span><span class="va">$status</span> <span class="op">-eq</span> <span class="dv">4</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb70-26"><a href="#cb70-26" aria-hidden="true" tabindex="-1"></a><span class="va">$status_type</span> <span class="op">=</span> <span class="st">"Running"</span></span>
 | ||
| <span id="cb70-27"><a href="#cb70-27" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb70-28"><a href="#cb70-28" aria-hidden="true" tabindex="-1"></a><span class="va">$Start</span> <span class="op">=</span> <span class="va">$service</span><span class="op">.</span><span class="fu">StartType</span></span>
 | ||
| <span id="cb70-29"><a href="#cb70-29" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$Start</span> <span class="op">-eq</span> <span class="dv">1</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb70-30"><a href="#cb70-30" aria-hidden="true" tabindex="-1"></a><span class="va">$start_type</span> <span class="op">=</span> <span class="st">"Delayed start"</span></span>
 | ||
| <span id="cb70-31"><a href="#cb70-31" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">elseif</span> <span class="op">(</span><span class="va">$Start</span> <span class="op">-eq</span> <span class="dv">2</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb70-32"><a href="#cb70-32" aria-hidden="true" tabindex="-1"></a><span class="va">$start_type</span> <span class="op">=</span> <span class="st">"Automatic"</span></span>
 | ||
| <span id="cb70-33"><a href="#cb70-33" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">elseif</span> <span class="op">(</span><span class="va">$Start</span> <span class="op">-eq</span> <span class="dv">3</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb70-34"><a href="#cb70-34" aria-hidden="true" tabindex="-1"></a><span class="va">$start_type</span> <span class="op">=</span> <span class="st">"Manually"</span></span>
 | ||
| <span id="cb70-35"><a href="#cb70-35" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">elseif</span> <span class="op">(</span><span class="va">$Start</span> <span class="op">-eq</span> <span class="dv">4</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb70-36"><a href="#cb70-36" aria-hidden="true" tabindex="-1"></a><span class="va">$start_type</span> <span class="op">=</span> <span class="st">"Disabled"</span></span>
 | ||
| <span id="cb70-37"><a href="#cb70-37" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb70-38"><a href="#cb70-38" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">).</span><span class="fu">Rows</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="va">$counter</span><span class="op">)</span> <span class="op">=</span> <span class="va">$service</span><span class="op">.</span><span class="fu">Name</span></span>
 | ||
| <span id="cb70-39"><a href="#cb70-39" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">2</span><span class="op">).</span><span class="fu">Rows</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="va">$counter</span><span class="op">)</span> <span class="op">=</span> <span class="va">$service</span><span class="op">.</span><span class="fu">DisplayName</span></span>
 | ||
| <span id="cb70-40"><a href="#cb70-40" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">3</span><span class="op">).</span><span class="fu">Rows</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="va">$counter</span><span class="op">)</span> <span class="op">=</span> <span class="va">$status_type</span></span>
 | ||
| <span id="cb70-41"><a href="#cb70-41" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">4</span><span class="op">).</span><span class="fu">Rows</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="va">$counter</span><span class="op">)</span> <span class="op">=</span> <span class="va">$start_type</span></span>
 | ||
| <span id="cb70-42"><a href="#cb70-42" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$status_type</span> <span class="op">-eq</span> <span class="st">"Running"</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb70-43"><a href="#cb70-43" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">3</span><span class="op">).</span><span class="fu">Rows</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="va">$counter</span><span class="op">).</span><span class="fu">Font</span><span class="op">.</span><span class="fu">Bold</span> <span class="op">=</span> <span class="va">$true</span></span>
 | ||
| <span id="cb70-44"><a href="#cb70-44" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb70-45"><a href="#cb70-45" aria-hidden="true" tabindex="-1"></a><span class="va">$counter</span><span class="op">++</span><span class="ch">` </span><span class="op">+</span><span class="dv">1</span> увеличить для счетчика строки Rows</span>
 | ||
| <span id="cb70-46"><a href="#cb70-46" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb70-47"><a href="#cb70-47" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkBook</span><span class="op">.</span><span class="fu">SaveAs</span><span class="op">(</span><span class="va">$path</span><span class="op">)</span></span>
 | ||
| <span id="cb70-48"><a href="#cb70-48" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkBook</span><span class="op">.</span><span class="fu">close</span><span class="op">(</span><span class="va">$true</span><span class="op">)</span></span>
 | ||
| <span id="cb70-49"><a href="#cb70-49" aria-hidden="true" tabindex="-1"></a><span class="va">$Excel</span><span class="op">.</span><span class="fu">Quit</span><span class="op">()</span></span></code></pre></div>
 | ||
| <h3 id="excel.application.open">Excel.Application.Open</h3>
 | ||
| <div class="sourceCode" id="cb71"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb71-1"><a href="#cb71-1" aria-hidden="true" tabindex="-1"></a><span class="va">$path</span> <span class="op">=</span> <span class="st">"</span><span class="va">$home</span><span class="st">\Desktop\Services-to-Excel.xlsx"</span></span>
 | ||
| <span id="cb71-2"><a href="#cb71-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Excel</span> <span class="op">=</span> <span class="fu">New-Object</span> <span class="op">-</span>ComObject Excel<span class="op">.</span><span class="fu">Application</span></span>
 | ||
| <span id="cb71-3"><a href="#cb71-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Excel</span><span class="op">.</span><span class="fu">Visible</span> <span class="op">=</span> <span class="va">$false</span></span>
 | ||
| <span id="cb71-4"><a href="#cb71-4" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkBook</span> <span class="op">=</span> <span class="va">$excel</span><span class="op">.</span><span class="fu">Workbooks</span><span class="op">.</span><span class="fu">Open</span><span class="op">(</span><span class="va">$path</span><span class="op">)</span><span class="ch">` </span>открыть xlsx-файл</span>
 | ||
| <span id="cb71-5"><a href="#cb71-5" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkBook</span><span class="op">.</span><span class="fu">Sheets</span> <span class="op">|</span> <span class="fu">select</span> Name<span class="op">,</span>Index<span class="ch">` </span>отобразить листы</span>
 | ||
| <span id="cb71-6"><a href="#cb71-6" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span> <span class="op">=</span> <span class="va">$ExcelWorkBook</span><span class="op">.</span><span class="fu">Sheets</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">)</span><span class="ch">` </span>открыть лист по номеру Index</span>
 | ||
| <span id="cb71-7"><a href="#cb71-7" aria-hidden="true" tabindex="-1"></a><span class="dv">1</span><span class="op">..</span><span class="dv">100</span> <span class="op">|</span> <span class="op">%{</span><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Range</span><span class="op">(</span><span class="st">"A</span><span class="va">$_</span><span class="st">"</span><span class="op">).</span><span class="fu">Text</span><span class="op">}</span><span class="ch">` </span>прочитать значение из столбца А строки c <span class="dv">1</span> по <span class="dv">100</span></span>
 | ||
| <span id="cb71-8"><a href="#cb71-8" aria-hidden="true" tabindex="-1"></a><span class="va">$Excel</span><span class="op">.</span><span class="fu">Quit</span><span class="op">()</span></span></code></pre></div>
 | ||
| <h3 id="importexcel">ImportExcel</h3>
 | ||
| <p><code>Install-Module -Name ImportExcel</code><br />
 | ||
| <code>$data | Export-Excel .\Data.xlsx</code><br />
 | ||
| <code>$data = Import-Excel .\Data.xlsx</code></p>
 | ||
| <p><code>$data = ps</code><br />
 | ||
| <code>$Chart = New-ExcelChartDefinition -XRange CPU -YRange WS -Title "Process" -NoLegend</code><br />
 | ||
| <code>$data | Export-Excel .\ps.xlsx -AutoNameRange -ExcelChartDefinition $Chart -Show</code></p>
 | ||
| <h1 id="csv">CSV</h1>
 | ||
| <p><code>Get-Service | Select Name,DisplayName,Status,StartType | Export-Csv -path "$home\Desktop\Get-Service.csv" -Append -Encoding Default</code>
 | ||
| экспортировать в csv (-Encoding UTF8)<br />
 | ||
| <code>Import-Csv "$home\Desktop\Get-Service.csv" -Delimiter ","</code>
 | ||
| импортировать массив</p>
 | ||
| <div class="sourceCode" id="cb72"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb72-1"><a href="#cb72-1" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> <span class="fu">ConvertFrom-Csv</span> <span class="vs">@"</span></span>
 | ||
| <span id="cb72-2"><a href="#cb72-2" aria-hidden="true" tabindex="-1"></a><span class="vs">Region,State,Units,Price</span></span>
 | ||
| <span id="cb72-3"><a href="#cb72-3" aria-hidden="true" tabindex="-1"></a><span class="vs">West,Texas,927,923.71</span></span>
 | ||
| <span id="cb72-4"><a href="#cb72-4" aria-hidden="true" tabindex="-1"></a><span class="va">$null</span><span class="vs">,Tennessee,466,770.67</span></span>
 | ||
| <span id="cb72-5"><a href="#cb72-5" aria-hidden="true" tabindex="-1"></a><span class="vs">"@</span></span></code></pre></div>
 | ||
| <p><code>$systeminfo = systeminfo /FO csv | ConvertFrom-Csv</code> вывод
 | ||
| работы программы в CSV и конвертация в объект<br />
 | ||
| <code>$systeminfo."Полный объем физической памяти"</code><br />
 | ||
| <code>$systeminfo."Доступная физическая память"</code></p>
 | ||
| <h3 id="convertfrom-string">ConvertFrom-String</h3>
 | ||
| <div class="sourceCode" id="cb73"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb73-1"><a href="#cb73-1" aria-hidden="true" tabindex="-1"></a><span class="st">'</span></span>
 | ||
| <span id="cb73-2"><a href="#cb73-2" aria-hidden="true" tabindex="-1"></a><span class="st">log = </span></span>
 | ||
| <span id="cb73-3"><a href="#cb73-3" aria-hidden="true" tabindex="-1"></a><span class="st">{</span></span>
 | ||
| <span id="cb73-4"><a href="#cb73-4" aria-hidden="true" tabindex="-1"></a><span class="st">   level = 4;</span></span>
 | ||
| <span id="cb73-5"><a href="#cb73-5" aria-hidden="true" tabindex="-1"></a><span class="st">};</span></span>
 | ||
| <span id="cb73-6"><a href="#cb73-6" aria-hidden="true" tabindex="-1"></a><span class="st">'</span> <span class="op">|</span> ConvertFrom-String<span class="ch">` </span>создает PSCustomObject <span class="op">(</span>разбивает по пробелам<span class="op">,</span> удаляет все пробелы и пустые строки<span class="op">)</span></span></code></pre></div>
 | ||
| <h3 id="convertfrom-stringdata">ConvertFrom-StringData</h3>
 | ||
| <div class="sourceCode" id="cb74"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb74-1"><a href="#cb74-1" aria-hidden="true" tabindex="-1"></a><span class="st">"</span></span>
 | ||
| <span id="cb74-2"><a href="#cb74-2" aria-hidden="true" tabindex="-1"></a><span class="st">key1 = value1</span></span>
 | ||
| <span id="cb74-3"><a href="#cb74-3" aria-hidden="true" tabindex="-1"></a><span class="st">key2 = value2</span></span>
 | ||
| <span id="cb74-4"><a href="#cb74-4" aria-hidden="true" tabindex="-1"></a><span class="st">"</span> <span class="op">|</span> <span class="fu">ConvertFrom-StringData</span> <span class="co"># создает Hashtable</span></span></code></pre></div>
 | ||
| <h1 id="xml">XML</h1>
 | ||
| <div class="sourceCode" id="cb75"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb75-1"><a href="#cb75-1" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span> <span class="op">=</span> <span class="op">[</span>xml<span class="op">](</span><span class="fu">Get-Content</span> <span class="va">$home</span>\desktop\test<span class="op">.</span><span class="fu">rdg</span><span class="op">)</span><span class="ch">` </span>прочитать содержимое XML-файла</span>
 | ||
| <span id="cb75-2"><a href="#cb75-2" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">load</span><span class="op">(</span><span class="st">"</span><span class="va">$home</span><span class="st">\desktop\test.rdg"</span><span class="op">)</span><span class="ch">` </span>открыть файл</span>
 | ||
| <span id="cb75-3"><a href="#cb75-3" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">RDCMan</span><span class="op">.</span><span class="fu">file</span><span class="op">.</span><span class="fu">group</span><span class="op">.</span><span class="fu">properties</span><span class="op">.</span><span class="fu">name</span><span class="ch">` </span>имена групп</span>
 | ||
| <span id="cb75-4"><a href="#cb75-4" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">RDCMan</span><span class="op">.</span><span class="fu">file</span><span class="op">.</span><span class="fu">group</span><span class="op">.</span><span class="fu">server</span><span class="op">.</span><span class="fu">properties</span><span class="ch">` </span>имена всех серверов</span>
 | ||
| <span id="cb75-5"><a href="#cb75-5" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">RDCMan</span><span class="op">.</span><span class="fu">file</span><span class="op">.</span><span class="fu">group</span><span class="op">[</span><span class="dv">3</span><span class="op">].</span><span class="fu">server</span><span class="op">.</span><span class="fu">properties</span><span class="ch">` </span>список серверов в <span class="dv">4</span><span class="op">-</span>й группе</span>
 | ||
| <span id="cb75-6"><a href="#cb75-6" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="va">$xml</span><span class="op">.</span><span class="fu">RDCMan</span><span class="op">.</span><span class="fu">file</span><span class="op">.</span><span class="fu">group</span><span class="op">[</span><span class="dv">3</span><span class="op">].</span><span class="fu">server</span><span class="op">.</span><span class="fu">properties</span> <span class="op">|</span> <span class="op">?</span> name <span class="op">-like</span> ADIRK<span class="op">).</span><span class="fu">Name</span> <span class="op">=</span> <span class="st">"New-Name"</span><span class="ch">` </span>изменить значение</span>
 | ||
| <span id="cb75-7"><a href="#cb75-7" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">RDCMan</span><span class="op">.</span><span class="fu">file</span><span class="op">.</span><span class="fu">group</span><span class="op">[</span><span class="dv">3</span><span class="op">].</span><span class="fu">server</span><span class="op">[</span><span class="dv">0</span><span class="op">].</span><span class="fu">properties</span><span class="op">.</span><span class="fu">displayName</span> <span class="op">=</span> <span class="st">"New-displayName"</span> </span>
 | ||
| <span id="cb75-8"><a href="#cb75-8" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">RDCMan</span><span class="op">.</span><span class="fu">file</span><span class="op">.</span><span class="fu">group</span><span class="op">[</span><span class="dv">3</span><span class="op">].</span><span class="fu">server</span><span class="op">[</span><span class="dv">1</span><span class="op">].</span><span class="fu">RemoveAll</span><span class="op">()</span><span class="ch">` </span>удалить объект <span class="op">(</span><span class="dv">2</span><span class="op">-</span>й сервер в списке<span class="op">)</span></span>
 | ||
| <span id="cb75-9"><a href="#cb75-9" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">Save</span><span class="op">(</span><span class="va">$file</span><span class="op">)</span><span class="ch">` </span>сохранить содержимое объекта в файла</span></code></pre></div>
 | ||
| <p><code>Get-Service | Export-Clixml -path $home\desktop\test.xml</code>
 | ||
| экспортировать объект PowerShell в XML<br />
 | ||
| <code>Import-Clixml -Path $home\desktop\test.xml</code> импортировать
 | ||
| объект XML в PowerShell<br />
 | ||
| <code>ConvertTo-Xml (Get-Service)</code></p>
 | ||
| <h3 id="get-credtoxml">Get-CredToXML</h3>
 | ||
| <div class="sourceCode" id="cb76"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb76-1"><a href="#cb76-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-CredToXML <span class="op">{</span></span>
 | ||
| <span id="cb76-2"><a href="#cb76-2" aria-hidden="true" tabindex="-1"></a>    <span class="kw">param</span> <span class="op">(</span></span>
 | ||
| <span id="cb76-3"><a href="#cb76-3" aria-hidden="true" tabindex="-1"></a>        <span class="va">$CredFile</span> <span class="op">=</span> <span class="st">"</span><span class="va">$home</span><span class="st">\Documents\cred.xml"</span></span>
 | ||
| <span id="cb76-4"><a href="#cb76-4" aria-hidden="true" tabindex="-1"></a>    <span class="op">)</span></span>
 | ||
| <span id="cb76-5"><a href="#cb76-5" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span><span class="fu">Test-Path</span> <span class="va">$CredFile</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb76-6"><a href="#cb76-6" aria-hidden="true" tabindex="-1"></a>        <span class="fu">Import-Clixml</span> <span class="op">-</span>path <span class="va">$CredFile</span></span>
 | ||
| <span id="cb76-7"><a href="#cb76-7" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb76-8"><a href="#cb76-8" aria-hidden="true" tabindex="-1"></a>    <span class="cf">elseif</span> <span class="op">(!(</span><span class="fu">Test-Path</span> <span class="va">$CredFile</span><span class="op">))</span> <span class="op">{</span></span>
 | ||
| <span id="cb76-9"><a href="#cb76-9" aria-hidden="true" tabindex="-1"></a>        <span class="va">$Cred</span> <span class="op">=</span> <span class="fu">Get-Credential</span> <span class="op">-</span>Message <span class="st">"Enter credential"</span></span>
 | ||
| <span id="cb76-10"><a href="#cb76-10" aria-hidden="true" tabindex="-1"></a>        <span class="cf">if</span> <span class="op">(</span><span class="va">$Cred</span> <span class="op">-ne</span> <span class="va">$null</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb76-11"><a href="#cb76-11" aria-hidden="true" tabindex="-1"></a>        <span class="va">$Cred</span> <span class="op">|</span> <span class="fu">Export-CliXml</span> <span class="op">-</span>Path <span class="va">$CredFile</span></span>
 | ||
| <span id="cb76-12"><a href="#cb76-12" aria-hidden="true" tabindex="-1"></a>        <span class="va">$Cred</span></span>
 | ||
| <span id="cb76-13"><a href="#cb76-13" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb76-14"><a href="#cb76-14" aria-hidden="true" tabindex="-1"></a>    <span class="cf">else</span> <span class="op">{</span></span>
 | ||
| <span id="cb76-15"><a href="#cb76-15" aria-hidden="true" tabindex="-1"></a>        <span class="cf">return</span></span>
 | ||
| <span id="cb76-16"><a href="#cb76-16" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb76-17"><a href="#cb76-17" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb76-18"><a href="#cb76-18" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>$Cred = Get-CredToXML</code><br />
 | ||
| <code>$Login = $Cred.UserName</code><br />
 | ||
| <code>$PasswordText = $Cred.GetNetworkCredential().password</code>
 | ||
| получить пароль в текстовом виде</p>
 | ||
| <h3 id="xmlwriter-extensible-markup-language">XmlWriter (Extensible
 | ||
| Markup Language)</h3>
 | ||
| <div class="sourceCode" id="cb77"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb77-1"><a href="#cb77-1" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlWriterSettings</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Xml</span><span class="op">.</span><span class="fu">XmlWriterSettings</span></span>
 | ||
| <span id="cb77-2"><a href="#cb77-2" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlWriterSettings</span><span class="op">.</span><span class="fu">Indent</span> <span class="op">=</span> <span class="va">$true</span><span class="ch">` </span>включить отступы</span>
 | ||
| <span id="cb77-3"><a href="#cb77-3" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlWriterSettings</span><span class="op">.</span><span class="fu">IndentChars</span> <span class="op">=</span> <span class="st">"    "</span><span class="ch">` </span>задать отступ</span>
 | ||
| <span id="cb77-4"><a href="#cb77-4" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb77-5"><a href="#cb77-5" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlFilePath</span> <span class="op">=</span> <span class="st">"</span><span class="va">$home</span><span class="st">\desktop\test.xml"</span></span>
 | ||
| <span id="cb77-6"><a href="#cb77-6" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlObjectWriter</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">XML</span><span class="op">.</span><span class="fu">XmlWriter</span><span class="op">]::</span>Create<span class="op">(</span><span class="va">$XmlFilePath</span><span class="op">,</span> <span class="va">$XmlWriterSettings</span><span class="op">)</span><span class="ch">` </span>создать документ</span>
 | ||
| <span id="cb77-7"><a href="#cb77-7" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteStartDocument</span><span class="op">()</span><span class="ch">` </span>начать запись в документ</span>
 | ||
| <span id="cb77-8"><a href="#cb77-8" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb77-9"><a href="#cb77-9" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteComment</span><span class="op">(</span><span class="st">"Comment"</span><span class="op">)</span></span>
 | ||
| <span id="cb77-10"><a href="#cb77-10" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteStartElement</span><span class="op">(</span><span class="st">"Root"</span><span class="op">)</span><span class="ch">` </span>создать стартовый элемент<span class="op">,</span> который содержит дочерние объекты</span>
 | ||
| <span id="cb77-11"><a href="#cb77-11" aria-hidden="true" tabindex="-1"></a>    <span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteStartElement</span><span class="op">(</span><span class="st">"Configuration"</span><span class="op">)</span><span class="ch">` </span>создать первый дочерний элемент для BaseSettings</span>
 | ||
| <span id="cb77-12"><a href="#cb77-12" aria-hidden="true" tabindex="-1"></a>        <span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteElementString</span><span class="op">(</span><span class="st">"Language"</span><span class="op">,</span><span class="st">"RU"</span><span class="op">)</span></span>
 | ||
| <span id="cb77-13"><a href="#cb77-13" aria-hidden="true" tabindex="-1"></a>        <span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteStartElement</span><span class="op">(</span><span class="st">"Fonts"</span><span class="op">)</span>         <span class="co"># <Fonts></span></span>
 | ||
| <span id="cb77-14"><a href="#cb77-14" aria-hidden="true" tabindex="-1"></a>            <span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteElementString</span><span class="op">(</span><span class="st">"Name"</span><span class="op">,</span><span class="st">"Arial"</span><span class="op">)</span></span>
 | ||
| <span id="cb77-15"><a href="#cb77-15" aria-hidden="true" tabindex="-1"></a>            <span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteElementString</span><span class="op">(</span><span class="st">"Size"</span><span class="op">,</span><span class="st">"12"</span><span class="op">)</span></span>
 | ||
| <span id="cb77-16"><a href="#cb77-16" aria-hidden="true" tabindex="-1"></a>        <span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteEndElement</span><span class="op">()</span>                  <span class="co"># </Fonts></span></span>
 | ||
| <span id="cb77-17"><a href="#cb77-17" aria-hidden="true" tabindex="-1"></a>    <span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteEndElement</span><span class="op">()</span><span class="ch">` </span>конечный элемент <span class="op"></</span>Configuration<span class="op">></span></span>
 | ||
| <span id="cb77-18"><a href="#cb77-18" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteEndElement</span><span class="op">()</span><span class="ch">` </span>конечный элемент <span class="op"></</span>Root<span class="op">></span></span>
 | ||
| <span id="cb77-19"><a href="#cb77-19" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb77-20"><a href="#cb77-20" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteEndDocument</span><span class="op">()</span><span class="ch">` </span>завершить запись в документ</span>
 | ||
| <span id="cb77-21"><a href="#cb77-21" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">Flush</span><span class="op">()</span></span>
 | ||
| <span id="cb77-22"><a href="#cb77-22" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span></code></pre></div>
 | ||
| <h3 id="createelement">CreateElement</h3>
 | ||
| <div class="sourceCode" id="cb78"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb78-1"><a href="#cb78-1" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span> <span class="op">=</span> <span class="op">[</span>xml<span class="op">](</span><span class="fu">gc</span> <span class="va">$home</span>\desktop\test<span class="op">.</span><span class="fu">xml</span><span class="op">)</span></span>
 | ||
| <span id="cb78-2"><a href="#cb78-2" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">Root</span><span class="op">.</span><span class="fu">Configuration</span><span class="op">.</span><span class="fu">Fonts</span></span>
 | ||
| <span id="cb78-3"><a href="#cb78-3" aria-hidden="true" tabindex="-1"></a><span class="va">$NewElement</span> <span class="op">=</span> <span class="va">$xml</span><span class="op">.</span><span class="fu">CreateElement</span><span class="op">(</span><span class="st">"Fonts"</span><span class="op">)</span><span class="ch">` </span>выбрать элемент куда добавить</span>
 | ||
| <span id="cb78-4"><a href="#cb78-4" aria-hidden="true" tabindex="-1"></a><span class="va">$NewElement</span><span class="op">.</span><span class="fu">set_InnerXML</span><span class="op">(</span><span class="st">"<Name>Times New Roman</Name><Size>14</Size>"</span><span class="op">)</span><span class="ch">` </span>Заполнить значениями дочерние элементы Fonts</span>
 | ||
| <span id="cb78-5"><a href="#cb78-5" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">Root</span><span class="op">.</span><span class="fu">Configuration</span><span class="op">.</span><span class="fu">AppendChild</span><span class="op">(</span><span class="va">$NewElement</span><span class="op">)</span><span class="ch">` </span>добавить элемент новой строкой в Configuration <span class="op">(</span>родитель Fonts<span class="op">)</span></span>
 | ||
| <span id="cb78-6"><a href="#cb78-6" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">Save</span><span class="op">(</span><span class="st">"</span><span class="va">$home</span><span class="st">\desktop\test.xml"</span><span class="op">)</span></span></code></pre></div>
 | ||
| <h1 id="json">JSON</h1>
 | ||
| <div class="sourceCode" id="cb79"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb79-1"><a href="#cb79-1" aria-hidden="true" tabindex="-1"></a><span class="va">$log</span> <span class="op">=</span> <span class="st">'</span></span>
 | ||
| <span id="cb79-2"><a href="#cb79-2" aria-hidden="true" tabindex="-1"></a><span class="st">{</span></span>
 | ||
| <span id="cb79-3"><a href="#cb79-3" aria-hidden="true" tabindex="-1"></a><span class="st">  "log": {</span></span>
 | ||
| <span id="cb79-4"><a href="#cb79-4" aria-hidden="true" tabindex="-1"></a><span class="st">    "level": 7</span></span>
 | ||
| <span id="cb79-5"><a href="#cb79-5" aria-hidden="true" tabindex="-1"></a><span class="st">  }</span></span>
 | ||
| <span id="cb79-6"><a href="#cb79-6" aria-hidden="true" tabindex="-1"></a><span class="st">}</span></span>
 | ||
| <span id="cb79-7"><a href="#cb79-7" aria-hidden="true" tabindex="-1"></a><span class="st">'</span> <span class="op">|</span> <span class="fu">ConvertFrom-Json</span></span>
 | ||
| <span id="cb79-8"><a href="#cb79-8" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb79-9"><a href="#cb79-9" aria-hidden="true" tabindex="-1"></a><span class="fu">Get-Service</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span></span>
 | ||
| <span id="cb79-10"><a href="#cb79-10" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb79-11"><a href="#cb79-11" aria-hidden="true" tabindex="-1"></a><span class="va">$OOKLA</span>  <span class="op">=</span> <span class="st">'</span></span>
 | ||
| <span id="cb79-12"><a href="#cb79-12" aria-hidden="true" tabindex="-1"></a><span class="st">{</span></span>
 | ||
| <span id="cb79-13"><a href="#cb79-13" aria-hidden="true" tabindex="-1"></a><span class="st">"result" : </span></span>
 | ||
| <span id="cb79-14"><a href="#cb79-14" aria-hidden="true" tabindex="-1"></a><span class="st">{"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":</span></span>
 | ||
| <span id="cb79-15"><a href="#cb79-15" aria-hidden="true" tabindex="-1"></a><span class="st">[{"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."}],</span></span>
 | ||
| <span id="cb79-16"><a href="#cb79-16" aria-hidden="true" tabindex="-1"></a><span class="st">"path":"result\u002F14708271987","hasSecondary":true</span></span>
 | ||
| <span id="cb79-17"><a href="#cb79-17" aria-hidden="true" tabindex="-1"></a><span class="st">}</span></span>
 | ||
| <span id="cb79-18"><a href="#cb79-18" aria-hidden="true" tabindex="-1"></a><span class="st">}</span></span>
 | ||
| <span id="cb79-19"><a href="#cb79-19" aria-hidden="true" tabindex="-1"></a><span class="st">'</span> <span class="op">|</span> <span class="fu">ConvertFrom-Json</span></span>
 | ||
| <span id="cb79-20"><a href="#cb79-20" aria-hidden="true" tabindex="-1"></a><span class="va">$ookla</span><span class="op">.</span><span class="fu">result</span></span></code></pre></div>
 | ||
| <h1 id="yaml">YAML</h1>
 | ||
| <div class="sourceCode" id="cb80"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb80-1"><a href="#cb80-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Import-Module</span> PSYaml<span class="ch">` </span>используется в Docker<span class="op">/</span>Ansible</span>
 | ||
| <span id="cb80-2"><a href="#cb80-2" aria-hidden="true" tabindex="-1"></a><span class="va">$netplan</span> <span class="op">=</span> <span class="st">"</span></span>
 | ||
| <span id="cb80-3"><a href="#cb80-3" aria-hidden="true" tabindex="-1"></a><span class="st">network:</span><span class="ch">` </span><span class="st">словарь по типу - ключ : значение с вложенными словарями</span></span>
 | ||
| <span id="cb80-4"><a href="#cb80-4" aria-hidden="true" tabindex="-1"></a><span class="st">  ethernets:</span></span>
 | ||
| <span id="cb80-5"><a href="#cb80-5" aria-hidden="true" tabindex="-1"></a><span class="st">    ens160:</span></span>
 | ||
| <span id="cb80-6"><a href="#cb80-6" aria-hidden="true" tabindex="-1"></a><span class="st">      dhcp4: yes</span></span>
 | ||
| <span id="cb80-7"><a href="#cb80-7" aria-hidden="true" tabindex="-1"></a><span class="st">      dhcp6: no</span></span>
 | ||
| <span id="cb80-8"><a href="#cb80-8" aria-hidden="true" tabindex="-1"></a><span class="st">      nameservers:</span></span>
 | ||
| <span id="cb80-9"><a href="#cb80-9" aria-hidden="true" tabindex="-1"></a><span class="st">        addresses:</span><span class="ch">` </span><span class="st">[8.8.8.8, 1.1.1.1]</span><span class="ch">` </span><span class="st">список данных (строк)</span></span>
 | ||
| <span id="cb80-10"><a href="#cb80-10" aria-hidden="true" tabindex="-1"></a><span class="st">          - 8.8.8.8</span></span>
 | ||
| <span id="cb80-11"><a href="#cb80-11" aria-hidden="true" tabindex="-1"></a><span class="st">          - 1.1.1.1</span></span>
 | ||
| <span id="cb80-12"><a href="#cb80-12" aria-hidden="true" tabindex="-1"></a><span class="st">  version: 2</span></span>
 | ||
| <span id="cb80-13"><a href="#cb80-13" aria-hidden="true" tabindex="-1"></a><span class="st">"</span></span>
 | ||
| <span id="cb80-14"><a href="#cb80-14" aria-hidden="true" tabindex="-1"></a><span class="va">$network</span> <span class="op">=</span> ConvertFrom-Yaml <span class="va">$netplan</span></span>
 | ||
| <span id="cb80-15"><a href="#cb80-15" aria-hidden="true" tabindex="-1"></a><span class="va">$network</span><span class="op">.</span><span class="fu">Values</span><span class="op">.</span><span class="fu">ethernets</span><span class="op">.</span><span class="fu">ens160</span><span class="op">.</span><span class="fu">nameservers</span></span>
 | ||
| <span id="cb80-16"><a href="#cb80-16" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb80-17"><a href="#cb80-17" aria-hidden="true" tabindex="-1"></a><span class="va">$DataType</span> <span class="op">=</span> <span class="st">"</span></span>
 | ||
| <span id="cb80-18"><a href="#cb80-18" aria-hidden="true" tabindex="-1"></a><span class="st">int: !!int 10.1</span></span>
 | ||
| <span id="cb80-19"><a href="#cb80-19" aria-hidden="true" tabindex="-1"></a><span class="st">flo: !!float 10.1</span></span>
 | ||
| <span id="cb80-20"><a href="#cb80-20" aria-hidden="true" tabindex="-1"></a><span class="st">str: !!str string</span></span>
 | ||
| <span id="cb80-21"><a href="#cb80-21" aria-hidden="true" tabindex="-1"></a><span class="st">bool: !!bool</span><span class="ch">` </span><span class="st">boolean</span></span>
 | ||
| <span id="cb80-22"><a href="#cb80-22" aria-hidden="true" tabindex="-1"></a><span class="st">"</span></span></code></pre></div>
 | ||
| <h1 id="html">HTML</h1>
 | ||
| <h3 id="convertfrom-html">ConvertFrom-Html</h3>
 | ||
| <div class="sourceCode" id="cb81"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb81-1"><a href="#cb81-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> ConvertFrom-Html <span class="op">{</span></span>
 | ||
| <span id="cb81-2"><a href="#cb81-2" aria-hidden="true" tabindex="-1"></a>    <span class="kw">param</span> <span class="op">(</span></span>
 | ||
| <span id="cb81-3"><a href="#cb81-3" aria-hidden="true" tabindex="-1"></a>        <span class="op">[</span>Parameter<span class="op">(</span>ValueFromPipeline<span class="op">)]</span><span class="va">$url</span></span>
 | ||
| <span id="cb81-4"><a href="#cb81-4" aria-hidden="true" tabindex="-1"></a>    <span class="op">)</span></span>
 | ||
| <span id="cb81-5"><a href="#cb81-5" aria-hidden="true" tabindex="-1"></a>    <span class="va">$irm</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="va">$url</span></span>
 | ||
| <span id="cb81-6"><a href="#cb81-6" aria-hidden="true" tabindex="-1"></a>    <span class="va">$HTMLFile</span> <span class="op">=</span> <span class="fu">New-Object</span> <span class="op">-</span>ComObject HTMLFile</span>
 | ||
| <span id="cb81-7"><a href="#cb81-7" aria-hidden="true" tabindex="-1"></a>    <span class="va">$Bytes</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Text</span><span class="op">.</span><span class="fu">Encoding</span><span class="op">]::</span>Unicode<span class="op">.</span><span class="fu">GetBytes</span><span class="op">(</span><span class="va">$irm</span><span class="op">)</span></span>
 | ||
| <span id="cb81-8"><a href="#cb81-8" aria-hidden="true" tabindex="-1"></a>    <span class="va">$HTMLFile</span><span class="op">.</span><span class="fu">write</span><span class="op">(</span><span class="va">$Bytes</span><span class="op">)</span></span>
 | ||
| <span id="cb81-9"><a href="#cb81-9" aria-hidden="true" tabindex="-1"></a>    <span class="op">(</span><span class="va">$HTMLFile</span><span class="op">.</span><span class="fu">all</span> <span class="op">|</span> <span class="fu">where</span> <span class="op">{</span><span class="va">$_</span><span class="op">.</span><span class="fu">tagname</span> <span class="op">-eq</span> <span class="st">"body"</span><span class="op">}).</span><span class="fu">innerText</span></span>
 | ||
| <span id="cb81-10"><a href="#cb81-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb81-11"><a href="#cb81-11" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb81-12"><a href="#cb81-12" aria-hidden="true" tabindex="-1"></a><span class="va">$apache_status</span> <span class="op">=</span> <span class="st">"http://192.168.3.102/server-status"</span></span>
 | ||
| <span id="cb81-13"><a href="#cb81-13" aria-hidden="true" tabindex="-1"></a><span class="va">$apache_status</span> <span class="op">|</span> ConvertFrom-Html</span></code></pre></div>
 | ||
| <h3 id="convertto-html">ConvertTo-Html</h3>
 | ||
| <p><code>Get-Process | select Name, CPU | ConvertTo-Html -As Table > "$home\desktop\proc-table.html"</code>
 | ||
| вывод в формате List (Format-List) или Table (Format-Table)</p>
 | ||
| <div class="sourceCode" id="cb82"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb82-1"><a href="#cb82-1" aria-hidden="true" tabindex="-1"></a><span class="va">$servers</span> <span class="op">=</span> <span class="st">"ya.ru"</span><span class="op">,</span><span class="st">"ya.com"</span><span class="op">,</span><span class="st">"google.com"</span></span>
 | ||
| <span id="cb82-2"><a href="#cb82-2" aria-hidden="true" tabindex="-1"></a><span class="va">$path</span> <span class="op">=</span> <span class="st">"</span><span class="va">$home</span><span class="st">\Desktop\Ping.html"</span> </span>
 | ||
| <span id="cb82-3"><a href="#cb82-3" aria-hidden="true" tabindex="-1"></a><span class="va">$header</span> <span class="op">=</span> <span class="vs">@"</span></span>
 | ||
| <span id="cb82-4"><a href="#cb82-4" aria-hidden="true" tabindex="-1"></a><span class="vs"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"></span></span>
 | ||
| <span id="cb82-5"><a href="#cb82-5" aria-hidden="true" tabindex="-1"></a><span class="vs"><html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"></span></span>
 | ||
| <span id="cb82-6"><a href="#cb82-6" aria-hidden="true" tabindex="-1"></a><span class="vs"><head></span></span>
 | ||
| <span id="cb82-7"><a href="#cb82-7" aria-hidden="true" tabindex="-1"></a><span class="vs"><title>Отчет о статусе серверов</title></span></span>
 | ||
| <span id="cb82-8"><a href="#cb82-8" aria-hidden="true" tabindex="-1"></a><span class="vs"><style type="text/css"></span></span>
 | ||
| <span id="cb82-9"><a href="#cb82-9" aria-hidden="true" tabindex="-1"></a><span class="vs"><!--</span></span>
 | ||
| <span id="cb82-10"><a href="#cb82-10" aria-hidden="true" tabindex="-1"></a><span class="vs">body {</span></span>
 | ||
| <span id="cb82-11"><a href="#cb82-11" aria-hidden="true" tabindex="-1"></a><span class="vs">background-color: #E0E0E0;</span></span>
 | ||
| <span id="cb82-12"><a href="#cb82-12" aria-hidden="true" tabindex="-1"></a><span class="vs">font-family: sans-serif</span></span>
 | ||
| <span id="cb82-13"><a href="#cb82-13" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
 | ||
| <span id="cb82-14"><a href="#cb82-14" aria-hidden="true" tabindex="-1"></a><span class="vs">table, th, td {</span></span>
 | ||
| <span id="cb82-15"><a href="#cb82-15" aria-hidden="true" tabindex="-1"></a><span class="vs">background-color: white;</span></span>
 | ||
| <span id="cb82-16"><a href="#cb82-16" aria-hidden="true" tabindex="-1"></a><span class="vs">border-collapse:collapse;</span></span>
 | ||
| <span id="cb82-17"><a href="#cb82-17" aria-hidden="true" tabindex="-1"></a><span class="vs">border: 1px solid black;</span></span>
 | ||
| <span id="cb82-18"><a href="#cb82-18" aria-hidden="true" tabindex="-1"></a><span class="vs">padding: 5px</span></span>
 | ||
| <span id="cb82-19"><a href="#cb82-19" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
 | ||
| <span id="cb82-20"><a href="#cb82-20" aria-hidden="true" tabindex="-1"></a><span class="vs">--></span></span>
 | ||
| <span id="cb82-21"><a href="#cb82-21" aria-hidden="true" tabindex="-1"></a><span class="vs"></style></span></span>
 | ||
| <span id="cb82-22"><a href="#cb82-22" aria-hidden="true" tabindex="-1"></a><span class="vs">"@</span></span>
 | ||
| <span id="cb82-23"><a href="#cb82-23" aria-hidden="true" tabindex="-1"></a><span class="va">$body</span> <span class="op">=</span> <span class="vs">@"</span></span>
 | ||
| <span id="cb82-24"><a href="#cb82-24" aria-hidden="true" tabindex="-1"></a><span class="vs"><h1>Ping status</h1></span></span>
 | ||
| <span id="cb82-25"><a href="#cb82-25" aria-hidden="true" tabindex="-1"></a><span class="vs"><p></span><span class="op">$(</span><span class="fu">get-date</span> <span class="op">-</span>Format <span class="st">"dd.MM.yyyy hh:mm"</span><span class="op">)</span><span class="vs">.</p></span></span>
 | ||
| <span id="cb82-26"><a href="#cb82-26" aria-hidden="true" tabindex="-1"></a><span class="vs">"@</span></span>
 | ||
| <span id="cb82-27"><a href="#cb82-27" aria-hidden="true" tabindex="-1"></a><span class="va">$results</span> <span class="op">=</span> <span class="cf">foreach</span> <span class="op">(</span><span class="va">$server</span> <span class="kw">in</span> <span class="va">$servers</span><span class="op">)</span> <span class="op">{</span> </span>
 | ||
| <span id="cb82-28"><a href="#cb82-28" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span><span class="fu">Test-Connection</span> <span class="va">$server</span> <span class="op">-</span>Count <span class="dv">1</span> <span class="op">-</span>ea <span class="dv">0</span> <span class="op">-</span>Quiet<span class="op">)</span> <span class="op">{</span> </span>
 | ||
| <span id="cb82-29"><a href="#cb82-29" aria-hidden="true" tabindex="-1"></a>        <span class="va">$status</span> <span class="op">=</span> <span class="st">"Up"</span> </span>
 | ||
| <span id="cb82-30"><a href="#cb82-30" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb82-31"><a href="#cb82-31" aria-hidden="true" tabindex="-1"></a>    <span class="cf">else</span> <span class="op">{</span> </span>
 | ||
| <span id="cb82-32"><a href="#cb82-32" aria-hidden="true" tabindex="-1"></a>        <span class="va">$status</span> <span class="op">=</span> <span class="st">"Down"</span></span>
 | ||
| <span id="cb82-33"><a href="#cb82-33" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb82-34"><a href="#cb82-34" aria-hidden="true" tabindex="-1"></a>    <span class="op">[</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span></span>
 | ||
| <span id="cb82-35"><a href="#cb82-35" aria-hidden="true" tabindex="-1"></a>        Name <span class="op">=</span> <span class="va">$server</span></span>
 | ||
| <span id="cb82-36"><a href="#cb82-36" aria-hidden="true" tabindex="-1"></a>        Status <span class="op">=</span> <span class="va">$status</span></span>
 | ||
| <span id="cb82-37"><a href="#cb82-37" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb82-38"><a href="#cb82-38" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb82-39"><a href="#cb82-39" aria-hidden="true" tabindex="-1"></a><span class="va">$results</span> <span class="op">|</span> <span class="fu">ConvertTo-Html</span> <span class="op">-</span>head <span class="va">$header</span> <span class="op">-</span>body <span class="va">$body</span> <span class="op">|</span> <span class="cf">foreach</span> <span class="op">{</span></span>
 | ||
| <span id="cb82-40"><a href="#cb82-40" aria-hidden="true" tabindex="-1"></a>    <span class="va">$_</span> <span class="op">-replace</span> <span class="st">"<td>Down</td>"</span><span class="op">,</span><span class="st">"<td style='background-color:#FF8080'>Down</td>"</span> <span class="op">-replace</span> <span class="st">"<td>Up</td>"</span><span class="op">,</span><span class="st">"<td style='background-color:#5BCCF3'>Up</td>"</span></span>
 | ||
| <span id="cb82-41"><a href="#cb82-41" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">|</span> <span class="fu">Out-File</span> <span class="va">$path</span></span>
 | ||
| <span id="cb82-42"><a href="#cb82-42" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-Item</span> <span class="va">$path</span></span></code></pre></div>
 | ||
| <h3 id="pswritehtml">PSWriteHTML</h3>
 | ||
| <div class="sourceCode" id="cb83"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb83-1"><a href="#cb83-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Import-Module</span> PSWriteHTML</span>
 | ||
| <span id="cb83-2"><a href="#cb83-2" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="fu">Get-Module</span> PSWriteHTML<span class="op">).</span><span class="fu">ExportedCommands</span></span>
 | ||
| <span id="cb83-3"><a href="#cb83-3" aria-hidden="true" tabindex="-1"></a><span class="fu">Get-Service</span> <span class="op">|</span> Out-GridHtml <span class="op">-</span>FilePath <span class="op">~</span>\Desktop\Get-Service-Out-GridHtml<span class="op">.</span><span class="fu">html</span></span></code></pre></div>
 | ||
| <h3 id="htmlreport">HtmlReport</h3>
 | ||
| <div class="sourceCode" id="cb84"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb84-1"><a href="#cb84-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Import-Module</span> HtmlReport</span>
 | ||
| <span id="cb84-2"><a href="#cb84-2" aria-hidden="true" tabindex="-1"></a><span class="va">$topVM</span> <span class="op">=</span> <span class="fu">ps</span> <span class="op">|</span> <span class="fu">Sort</span> PrivateMemorySize <span class="op">-</span>Descending <span class="op">|</span> <span class="fu">Select</span> <span class="op">-</span>First <span class="dv">10</span> <span class="op">|</span> <span class="op">%{,@((</span><span class="va">$_</span><span class="op">.</span><span class="fu">ProcessName</span> <span class="op">+</span> <span class="st">" "</span> <span class="op">+</span> <span class="va">$_</span><span class="op">.</span><span class="fu">Id</span><span class="op">),</span> <span class="va">$_</span><span class="op">.</span><span class="fu">PrivateMemorySize</span><span class="op">)}</span></span>
 | ||
| <span id="cb84-3"><a href="#cb84-3" aria-hidden="true" tabindex="-1"></a><span class="va">$topCPU</span> <span class="op">=</span> <span class="fu">ps</span> <span class="op">|</span> <span class="fu">Sort</span> CPU <span class="op">-</span>Descending <span class="op">|</span> <span class="fu">Select</span> <span class="op">-</span>First <span class="dv">10</span> <span class="op">|</span> <span class="op">%{,@((</span><span class="va">$_</span><span class="op">.</span><span class="fu">ProcessName</span> <span class="op">+</span> <span class="st">" "</span> <span class="op">+</span> <span class="va">$_</span><span class="op">.</span><span class="fu">Id</span><span class="op">),</span> <span class="va">$_</span><span class="op">.</span><span class="fu">CPU</span><span class="op">)}</span></span>
 | ||
| <span id="cb84-4"><a href="#cb84-4" aria-hidden="true" tabindex="-1"></a>New-Report <span class="op">-</span>Title <span class="st">"Piggy Processes"</span> <span class="op">-</span>Input <span class="op">{</span></span>
 | ||
| <span id="cb84-5"><a href="#cb84-5" aria-hidden="true" tabindex="-1"></a>New-Chart Bar <span class="st">"Top VM Users"</span> <span class="op">-</span>input <span class="va">$topVm</span></span>
 | ||
| <span id="cb84-6"><a href="#cb84-6" aria-hidden="true" tabindex="-1"></a>New-Chart Column <span class="st">"Top CPU Overall"</span> <span class="op">-</span>input <span class="va">$topCPU</span></span>
 | ||
| <span id="cb84-7"><a href="#cb84-7" aria-hidden="true" tabindex="-1"></a><span class="fu">ps</span> <span class="op">|</span> <span class="fu">Select</span> ProcessName<span class="op">,</span> Id<span class="op">,</span> CPU<span class="op">,</span> WorkingSet<span class="op">,</span> <span class="op">*</span>MemorySize <span class="op">|</span> New-Table <span class="st">"All Processes"</span></span>
 | ||
| <span id="cb84-8"><a href="#cb84-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">></span> <span class="op">~</span>\Desktop\Get-Process-HtmlReport<span class="op">.</span><span class="fu">html</span></span></code></pre></div>
 | ||
| <h1 id="sqlite">SQLite</h1>
 | ||
| <div class="sourceCode" id="cb85"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb85-1"><a href="#cb85-1" aria-hidden="true" tabindex="-1"></a><span class="va">$path</span> <span class="op">=</span> <span class="st">"</span><span class="va">$home</span><span class="st">\Documents\Get-Service.db"</span></span>
 | ||
| <span id="cb85-2"><a href="#cb85-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Module</span> <span class="op">=</span> <span class="fu">Get-Module</span> MySQLite</span>
 | ||
| <span id="cb85-3"><a href="#cb85-3" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$Module</span> <span class="op">-eq</span> <span class="va">$null</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb85-4"><a href="#cb85-4" aria-hidden="true" tabindex="-1"></a>Install-Module MySQLite <span class="op">-</span>Repository PSGallery <span class="op">-</span>Scope CurrentUser</span>
 | ||
| <span id="cb85-5"><a href="#cb85-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb85-6"><a href="#cb85-6" aria-hidden="true" tabindex="-1"></a><span class="fu">Import-Module</span> MySQLite</span>
 | ||
| <span id="cb85-7"><a href="#cb85-7" aria-hidden="true" tabindex="-1"></a>New-MySQLiteDB <span class="op">-</span>Path <span class="va">$path</span> <span class="co"># создать БД</span></span>
 | ||
| <span id="cb85-8"><a href="#cb85-8" aria-hidden="true" tabindex="-1"></a>Invoke-MySQLiteQuery <span class="op">-</span>Path <span class="va">$path</span> <span class="op">-</span>Query <span class="st">"CREATE TABLE Service (Name TEXT NOT NULL, DisplayName TEXT NOT NULL, Status TEXT NOT NULL);"</span> <span class="co"># создать таблицу</span></span>
 | ||
| <span id="cb85-9"><a href="#cb85-9" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb85-10"><a href="#cb85-10" aria-hidden="true" tabindex="-1"></a><span class="va">$Service</span> <span class="op">=</span> <span class="fu">Get-Service</span> <span class="op">|</span> <span class="fu">select</span> Name<span class="op">,</span>DisplayName<span class="op">,</span>Status</span>
 | ||
| <span id="cb85-11"><a href="#cb85-11" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$S</span> <span class="kw">in</span> <span class="va">$Service</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb85-12"><a href="#cb85-12" aria-hidden="true" tabindex="-1"></a><span class="va">$Name</span> <span class="op">=</span> <span class="va">$S</span><span class="op">.</span><span class="fu">Name</span></span>
 | ||
| <span id="cb85-13"><a href="#cb85-13" aria-hidden="true" tabindex="-1"></a><span class="va">$DName</span> <span class="op">=</span> <span class="va">$S</span><span class="op">.</span><span class="fu">DisplayName</span></span>
 | ||
| <span id="cb85-14"><a href="#cb85-14" aria-hidden="true" tabindex="-1"></a><span class="va">$Status</span> <span class="op">=</span> <span class="va">$S</span><span class="op">.</span><span class="fu">Status</span></span>
 | ||
| <span id="cb85-15"><a href="#cb85-15" aria-hidden="true" tabindex="-1"></a>Invoke-MySQLiteQuery <span class="op">-</span>Path <span class="va">$path</span> <span class="op">-</span>Query <span class="st">"INSERT INTO Service (Name, DisplayName, Status) VALUES ('</span><span class="va">$Name</span><span class="st">', '</span><span class="va">$DName</span><span class="st">', '</span><span class="va">$Status</span><span class="st">');"</span></span>
 | ||
| <span id="cb85-16"><a href="#cb85-16" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>(Get-MySQLiteDB $path).Tables</code> список таблиц в базе<br />
 | ||
| <code>Invoke-MySQLiteQuery -Path $path -Query "SELECT name FROM sqlite_master WHERE type='table';"</code>
 | ||
| список таблиц в базе<br />
 | ||
| <code>Invoke-MySQLiteQuery -Path $path -Query "DROP TABLE Service;"</code>
 | ||
| удалить таблицу</p>
 | ||
| <div class="sourceCode" id="cb86"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb86-1"><a href="#cb86-1" aria-hidden="true" tabindex="-1"></a><span class="va">$TableName</span> <span class="op">=</span> <span class="st">"Service"</span></span>
 | ||
| <span id="cb86-2"><a href="#cb86-2" aria-hidden="true" tabindex="-1"></a>Invoke-MySQLiteQuery <span class="op">-</span>Path <span class="va">$path</span> <span class="op">-</span>Query <span class="st">"SELECT * FROM </span><span class="va">$TableName</span><span class="st">"</span> <span class="co"># прочитать содержимое таблицы (в формате объекта)</span></span></code></pre></div>
 | ||
| <p><code>Get-Service | select  Name,DisplayName,Status | ConvertTo-MySQLiteDB -Path $path -TableName Service -force</code>
 | ||
| конвертировать объект в таблицу</p>
 | ||
| <h3 id="database-password">Database password</h3>
 | ||
| <div class="sourceCode" id="cb87"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb87-1"><a href="#cb87-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span> <span class="op">=</span> New-SQLiteConnection <span class="op">-</span>DataSource <span class="va">$path</span></span>
 | ||
| <span id="cb87-2"><a href="#cb87-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span><span class="op">.</span><span class="fu">ChangePassword</span><span class="op">(</span><span class="st">"password"</span><span class="op">)</span></span>
 | ||
| <span id="cb87-3"><a href="#cb87-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span>
 | ||
| <span id="cb87-4"><a href="#cb87-4" aria-hidden="true" tabindex="-1"></a>Invoke-SqliteQuery <span class="op">-</span>Query <span class="st">"SELECT * FROM Service"</span> <span class="op">-</span>DataSource <span class="st">"</span><span class="va">$path</span><span class="st">;Password=password"</span></span></code></pre></div>
 | ||
| <h1 id="mysql">MySQL</h1>
 | ||
| <p><code>apt -y install mysql-server mysql-client</code><br />
 | ||
| <code>mysql -V</code><br />
 | ||
| <code>systemctl status mysql</code><br />
 | ||
| <code>mysqladmin -u root password</code> задать пароль root</p>
 | ||
| <p><code>nano /etc/mysql/mysql.conf.d/mysqld.cnf</code></p>
 | ||
| <pre><code>[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</code></pre>
 | ||
| <p><code>systemctl restart mysql</code><br />
 | ||
| <code>ss -tulnp | grep 3306</code><br />
 | ||
| <code>ufw allow 3306/tcp</code><br />
 | ||
| <code>nc -zv 192.168.1.253 3306</code><br />
 | ||
| <code>tnc 192.168.1.253 -p 3306</code></p>
 | ||
| <p><code>mysql -u root -p</code><br />
 | ||
| <code>SELECT user(), now(), version();</code><br />
 | ||
| <code>quit;</code></p>
 | ||
| <p><code>mysql -u root -p -e 'SHOW TABLES FROM db_aduser;'</code>
 | ||
| отобразить список таблиц без подключения к консоли MySQL</p>
 | ||
| <p><code>CREATE</code> создать БД, пользователя, таблицу<br />
 | ||
| <code>ALTER</code> управление столбцами таблице<br />
 | ||
| <code>DROP</code> удалить БД, пользователя, таблицу<br />
 | ||
| <code>USE</code> выбрать БД<br />
 | ||
| <code>SHOW</code> вывесли список БД, прав доступа пользователя (GRANTS),
 | ||
| названия столбцов и их свойства<br />
 | ||
| <code>GRANT</code> дать доступ пользователю к БД<br />
 | ||
| <code>REVOKE</code> удалить доступ пользователя к БД<br />
 | ||
| <code>UPDATE</code> изменить права доступа, значения с таблице<br />
 | ||
| <code>FLUSH</code> обновить права доступа<br />
 | ||
| <code>SELECT</code> отобразить выбранную БД, вывести список
 | ||
| пользователей, выборка данных в таблице<br />
 | ||
| <code>INSERT</code> внести данные<br />
 | ||
| <code>DELETE</code> удалить данные в (FROM) таблице</p>
 | ||
| <h3 id="data-type">DATA TYPE</h3>
 | ||
| <p><code>VARCHAR(N)</code> строка переменной длины, в формате ASCII, где
 | ||
| один символ занимает 1 байт, числом N указывается максимальная возможная
 | ||
| длина строки<br />
 | ||
| <code>NVARCHAR(N)</code> строка переменной длины, в формате Unicode, где
 | ||
| один символ занимает 2 байта<br />
 | ||
| <code>CHAR(N)/nchar(N)</code> строка фиксированной длины, которая всегда
 | ||
| дополняется справа пробелами до длины N и в базе данных она занимает
 | ||
| ровно N символов<br />
 | ||
| <code>INT</code> целое число, от -2147483648 до 2147483647, занимает 4
 | ||
| байта<br />
 | ||
| <code>FLOAT</code> число, в котором может присутствовать десятичная
 | ||
| точка (запятая)<br />
 | ||
| <code>BIT</code> флаг, Да - 1 или Нет - 0<br />
 | ||
| <code>DATE</code> формат даты, например 25.05.2023<br />
 | ||
| <code>TIME</code> 23:30:55.1234567<br />
 | ||
| <code>DATETIME</code> 25.05.2023 23:30:55.1234567</p>
 | ||
| <h3 id="database-1">DATABASE</h3>
 | ||
| <pre><code>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();                                                                  # отобразить выбранную БД</code></pre>
 | ||
| <h3 id="user">USER</h3>
 | ||
| <pre><code>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;                                                     # обновить права доступа</code></pre>
 | ||
| <h3 id="table">TABLE</h3>
 | ||
| <pre><code>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;   # удалить таблицу</code></pre>
 | ||
| <h3 id="column">COLUMN</h3>
 | ||
| <pre><code>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</code></pre>
 | ||
| <h3 id="insert">INSERT</h3>
 | ||
| <pre><code>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');</code></pre>
 | ||
| <h3 id="select">SELECT</h3>
 | ||
| <pre><code>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;       # количество строк в столбце</code></pre>
 | ||
| <h3 id="where">WHERE</h3>
 | ||
| <pre><code>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";       # начинаются только с этого словосочетания</code></pre>
 | ||
| <h3 id="delete">DELETE</h3>
 | ||
| <pre><code>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;                             # удалить ВСЕ значения</code></pre>
 | ||
| <h3 id="update">UPDATE</h3>
 | ||
| <pre><code>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</code></pre>
 | ||
| <h3 id="check">CHECK</h3>
 | ||
| <pre><code>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;  # очистить</code></pre>
 | ||
| <h3 id="dump">DUMP</h3>
 | ||
| <pre><code>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</code></pre>
 | ||
| <h3 id="innodb_force_recovery">innodb_force_recovery</h3>
 | ||
| <pre><code>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</code></pre>
 | ||
| <h3 id="mysql-connector-net">MySQL Connector NET</h3>
 | ||
| <h3 id="add-aduser">Add-ADUser</h3>
 | ||
| <div class="sourceCode" id="cb101"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb101-1"><a href="#cb101-1" aria-hidden="true" tabindex="-1"></a><span class="va">$ip</span> <span class="op">=</span> <span class="st">"192.168.1.253"</span></span>
 | ||
| <span id="cb101-2"><a href="#cb101-2" aria-hidden="true" tabindex="-1"></a><span class="va">$user</span> <span class="op">=</span> <span class="st">"posh"</span></span>
 | ||
| <span id="cb101-3"><a href="#cb101-3" aria-hidden="true" tabindex="-1"></a><span class="va">$pass</span> <span class="op">=</span> <span class="st">"1qaz!QAZ"</span></span>
 | ||
| <span id="cb101-4"><a href="#cb101-4" aria-hidden="true" tabindex="-1"></a><span class="va">$db</span> <span class="op">=</span> <span class="st">"db_aduser"</span></span>
 | ||
| <span id="cb101-5"><a href="#cb101-5" aria-hidden="true" tabindex="-1"></a><span class="fu">Add-Type</span> –Path <span class="st">"</span><span class="va">$home</span><span class="st">\Documents\MySQL-Connector-NET\8.0.31-4.8\MySql.Data.dll"</span></span>
 | ||
| <span id="cb101-6"><a href="#cb101-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span> <span class="op">=</span> <span class="op">[</span>MySql<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">MySqlClient</span><span class="op">.</span><span class="fu">MySqlConnection</span><span class="op">]</span>@<span class="op">{</span></span>
 | ||
| <span id="cb101-7"><a href="#cb101-7" aria-hidden="true" tabindex="-1"></a>ConnectionString<span class="op">=</span><span class="st">"server=</span><span class="va">$ip</span><span class="st">;uid=</span><span class="va">$user</span><span class="st">;pwd=</span><span class="va">$pass</span><span class="st">;database=</span><span class="va">$db</span><span class="st">"</span></span>
 | ||
| <span id="cb101-8"><a href="#cb101-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb101-9"><a href="#cb101-9" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span><span class="op">.</span><span class="fu">Open</span><span class="op">()</span></span>
 | ||
| <span id="cb101-10"><a href="#cb101-10" aria-hidden="true" tabindex="-1"></a><span class="va">$Command</span> <span class="op">=</span> <span class="fu">New-Object</span> MySql<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">MySqlClient</span><span class="op">.</span><span class="fu">MySqlCommand</span></span>
 | ||
| <span id="cb101-11"><a href="#cb101-11" aria-hidden="true" tabindex="-1"></a><span class="va">$Command</span><span class="op">.</span><span class="fu">Connection</span> <span class="op">=</span> <span class="va">$Connection</span></span>
 | ||
| <span id="cb101-12"><a href="#cb101-12" aria-hidden="true" tabindex="-1"></a><span class="va">$UserList</span> <span class="op">=</span> <span class="fu">Get-ADUser</span> <span class="op">-</span>filter <span class="op">*</span> <span class="op">-</span>properties name<span class="op">,</span>EmailAddress</span>
 | ||
| <span id="cb101-13"><a href="#cb101-13" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$user</span> <span class="kw">in</span> <span class="va">$UserList</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb101-14"><a href="#cb101-14" aria-hidden="true" tabindex="-1"></a><span class="va">$uname</span><span class="op">=</span><span class="va">$user</span><span class="op">.</span><span class="fu">Name</span></span>
 | ||
| <span id="cb101-15"><a href="#cb101-15" aria-hidden="true" tabindex="-1"></a><span class="va">$uemail</span><span class="op">=</span><span class="va">$user</span><span class="op">.</span><span class="fu">EmailAddress</span></span>
 | ||
| <span id="cb101-16"><a href="#cb101-16" aria-hidden="true" tabindex="-1"></a><span class="va">$Command</span><span class="op">.</span><span class="fu">CommandText</span> <span class="op">=</span> <span class="st">"INSERT INTO table_aduser (Name,Email) VALUES ('</span><span class="va">$uname</span><span class="st">','</span><span class="va">$uemail</span><span class="st">')"</span></span>
 | ||
| <span id="cb101-17"><a href="#cb101-17" aria-hidden="true" tabindex="-1"></a><span class="va">$Command</span><span class="op">.</span><span class="fu">ExecuteNonQuery</span><span class="op">()</span></span>
 | ||
| <span id="cb101-18"><a href="#cb101-18" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb101-19"><a href="#cb101-19" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span></code></pre></div>
 | ||
| <h3 id="get-aduser">Get-ADUser</h3>
 | ||
| <div class="sourceCode" id="cb102"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb102-1"><a href="#cb102-1" aria-hidden="true" tabindex="-1"></a><span class="va">$ip</span> <span class="op">=</span> <span class="st">"192.168.1.253"</span></span>
 | ||
| <span id="cb102-2"><a href="#cb102-2" aria-hidden="true" tabindex="-1"></a><span class="va">$user</span> <span class="op">=</span> <span class="st">"posh"</span></span>
 | ||
| <span id="cb102-3"><a href="#cb102-3" aria-hidden="true" tabindex="-1"></a><span class="va">$pass</span> <span class="op">=</span> <span class="st">"1qaz!QAZ"</span></span>
 | ||
| <span id="cb102-4"><a href="#cb102-4" aria-hidden="true" tabindex="-1"></a><span class="va">$db</span> <span class="op">=</span> <span class="st">"db_aduser"</span></span>
 | ||
| <span id="cb102-5"><a href="#cb102-5" aria-hidden="true" tabindex="-1"></a><span class="fu">Add-Type</span> –Path <span class="st">"</span><span class="va">$home</span><span class="st">\Documents\MySQL-Connector-NET\8.0.31-4.8\MySql.Data.dll"</span></span>
 | ||
| <span id="cb102-6"><a href="#cb102-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span> <span class="op">=</span> <span class="op">[</span>MySql<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">MySqlClient</span><span class="op">.</span><span class="fu">MySqlConnection</span><span class="op">]</span>@<span class="op">{</span></span>
 | ||
| <span id="cb102-7"><a href="#cb102-7" aria-hidden="true" tabindex="-1"></a>ConnectionString <span class="op">=</span> <span class="st">"server=</span><span class="va">$ip</span><span class="st">;uid=</span><span class="va">$user</span><span class="st">;pwd=</span><span class="va">$pass</span><span class="st">;database=</span><span class="va">$db</span><span class="st">"</span></span>
 | ||
| <span id="cb102-8"><a href="#cb102-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb102-9"><a href="#cb102-9" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span><span class="op">.</span><span class="fu">Open</span><span class="op">()</span></span>
 | ||
| <span id="cb102-10"><a href="#cb102-10" aria-hidden="true" tabindex="-1"></a><span class="va">$Command</span> <span class="op">=</span> <span class="fu">New-Object</span> MySql<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">MySqlClient</span><span class="op">.</span><span class="fu">MySqlCommand</span></span>
 | ||
| <span id="cb102-11"><a href="#cb102-11" aria-hidden="true" tabindex="-1"></a><span class="va">$Command</span><span class="op">.</span><span class="fu">Connection</span> <span class="op">=</span> <span class="va">$Connection</span></span>
 | ||
| <span id="cb102-12"><a href="#cb102-12" aria-hidden="true" tabindex="-1"></a><span class="va">$MYSQLDataAdapter</span> <span class="op">=</span> <span class="fu">New-Object</span> MySql<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">MySqlClient</span><span class="op">.</span><span class="fu">MySqlDataAdapter</span></span>
 | ||
| <span id="cb102-13"><a href="#cb102-13" aria-hidden="true" tabindex="-1"></a><span class="va">$MYSQLDataSet</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">DataSet</span></span>
 | ||
| <span id="cb102-14"><a href="#cb102-14" aria-hidden="true" tabindex="-1"></a><span class="va">$Command</span><span class="op">.</span><span class="fu">CommandText</span> <span class="op">=</span> <span class="st">"SELECT * FROM table_aduser"</span></span>
 | ||
| <span id="cb102-15"><a href="#cb102-15" aria-hidden="true" tabindex="-1"></a><span class="va">$MYSQLDataAdapter</span><span class="op">.</span><span class="fu">SelectCommand</span> <span class="op">=</span> <span class="va">$Command</span></span>
 | ||
| <span id="cb102-16"><a href="#cb102-16" aria-hidden="true" tabindex="-1"></a><span class="va">$NumberOfDataSets</span> <span class="op">=</span> <span class="va">$MYSQLDataAdapter</span><span class="op">.</span><span class="fu">Fill</span><span class="op">(</span><span class="va">$MYSQLDataSet</span><span class="op">,</span> <span class="st">"data"</span><span class="op">)</span></span>
 | ||
| <span id="cb102-17"><a href="#cb102-17" aria-hidden="true" tabindex="-1"></a><span class="va">$Collections</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Collections</span><span class="op">.</span><span class="fu">Generic</span><span class="op">.</span><span class="fu">List</span><span class="op">[</span>System<span class="op">.</span><span class="fu">Object</span><span class="op">]</span></span>
 | ||
| <span id="cb102-18"><a href="#cb102-18" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span><span class="op">(</span><span class="va">$DataSet</span> <span class="kw">in</span> <span class="va">$MYSQLDataSet</span><span class="op">.</span><span class="fu">tables</span><span class="op">[</span><span class="dv">0</span><span class="op">])</span> <span class="op">{</span></span>
 | ||
| <span id="cb102-19"><a href="#cb102-19" aria-hidden="true" tabindex="-1"></a><span class="va">$Collections</span><span class="op">.</span><span class="fu">Add</span><span class="op">([</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span></span>
 | ||
| <span id="cb102-20"><a href="#cb102-20" aria-hidden="true" tabindex="-1"></a>Name <span class="op">=</span> <span class="va">$DataSet</span><span class="op">.</span><span class="fu">name</span><span class="op">;</span></span>
 | ||
| <span id="cb102-21"><a href="#cb102-21" aria-hidden="true" tabindex="-1"></a>Mail <span class="op">=</span> <span class="va">$DataSet</span><span class="op">.</span><span class="fu">email</span></span>
 | ||
| <span id="cb102-22"><a href="#cb102-22" aria-hidden="true" tabindex="-1"></a><span class="op">})</span></span>
 | ||
| <span id="cb102-23"><a href="#cb102-23" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb102-24"><a href="#cb102-24" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span>
 | ||
| <span id="cb102-25"><a href="#cb102-25" aria-hidden="true" tabindex="-1"></a><span class="va">$Collections</span></span></code></pre></div>
 | ||
| <h1 id="mssql">MSSQL</h1>
 | ||
| <p><code>wget -qO- https://packages.microsoft.com/keys/microsoft.asc | apt-key add -</code>
 | ||
| импортировать GPG-ключ для репозитория<br />
 | ||
| <code>https://packages.microsoft.com/config/ubuntu/</code> выбрать
 | ||
| репозиторий и скопировать URL<br />
 | ||
| <code>add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2019.list)"</code><br />
 | ||
| <code>apt-get update</code> обновить список пакетов<br />
 | ||
| <code>apt-get install mssql-server</code><br />
 | ||
| <code>/opt/mssql/bin/mssql-conf setup</code> скрипт начальной
 | ||
| конфигурации (выбрать редакцию, 3 - express и русский язык 9 из
 | ||
| 11)<br />
 | ||
| <code>systemctl status mssql-server</code><br />
 | ||
| <code>curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -</code>
 | ||
| установить клиент<br />
 | ||
| <code>curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | tee /etc/apt/sources.list.d/msprod.list</code><br />
 | ||
| <code>apt-get update</code><br />
 | ||
| <code>apt-get install mssql-tools</code><br />
 | ||
| <code>echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc</code>
 | ||
| добавить в домашний каталог файла bashrc, что бы не писать путь к
 | ||
| исполняемому файлу<br />
 | ||
| <code>export PATH="$PATH:/opt/mssql-tools/bin"</code><br />
 | ||
| <code>iptables -I INPUT 1 -p tcp --dport 1433 -j ACCEPT</code></p>
 | ||
| <pre><code>sqlcmd -S localhost -U SA
 | ||
| CREATE DATABASE itinvent
 | ||
| go
 | ||
| SELECT name FROM master.dbo.sysdatabases
 | ||
| go</code></pre>
 | ||
| <h3 id="system.data.sqlclient">System.Data.SqlClient</h3>
 | ||
| <div class="sourceCode" id="cb104"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb104-1"><a href="#cb104-1" aria-hidden="true" tabindex="-1"></a><span class="va">$user</span> <span class="op">=</span> <span class="st">"itinvent"</span></span>
 | ||
| <span id="cb104-2"><a href="#cb104-2" aria-hidden="true" tabindex="-1"></a><span class="va">$pass</span> <span class="op">=</span> <span class="st">"itinvent"</span></span>
 | ||
| <span id="cb104-3"><a href="#cb104-3" aria-hidden="true" tabindex="-1"></a><span class="va">$db</span>   <span class="op">=</span> <span class="st">"itinvent"</span></span>
 | ||
| <span id="cb104-4"><a href="#cb104-4" aria-hidden="true" tabindex="-1"></a><span class="va">$srv</span>  <span class="op">=</span> <span class="st">"192.168.3.103"</span></span>
 | ||
| <span id="cb104-5"><a href="#cb104-5" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlConnection</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">SqlClient</span><span class="op">.</span><span class="fu">SqlConnection</span></span>
 | ||
| <span id="cb104-6"><a href="#cb104-6" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlConnection</span><span class="op">.</span><span class="fu">ConnectionString</span> <span class="op">=</span> <span class="st">"server=</span><span class="va">$srv</span><span class="st">;database=</span><span class="va">$db</span><span class="st">;user id=</span><span class="va">$user</span><span class="st">;password=</span><span class="va">$pass</span><span class="st">;Integrated Security=false"</span></span>
 | ||
| <span id="cb104-7"><a href="#cb104-7" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb104-8"><a href="#cb104-8" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlCommand</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">SqlClient</span><span class="op">.</span><span class="fu">SqlCommand</span><span class="ch">` </span>класс формата команды</span>
 | ||
| <span id="cb104-9"><a href="#cb104-9" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlCommand</span><span class="op">.</span><span class="fu">CommandText</span> <span class="op">=</span> <span class="st">"SELECT * FROM ITINVENT.dbo.USERS"</span><span class="ch">` </span>отобразить содержимое таблицы</span>
 | ||
| <span id="cb104-10"><a href="#cb104-10" aria-hidden="true" tabindex="-1"></a><span class="co">#$SqlCommand.CommandText = "SELECT LICENCE_DATE,DESCR,MODEL_NO,TYPE_NO FROM ITINVENT.dbo.ITEMS where LICENCE_DATE IS NOT NULL"</span></span>
 | ||
| <span id="cb104-11"><a href="#cb104-11" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlCommand</span><span class="op">.</span><span class="fu">Connection</span> <span class="op">=</span> <span class="va">$SqlConnection</span><span class="ch">` </span>передать формат подключения</span>
 | ||
| <span id="cb104-12"><a href="#cb104-12" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlAdapter</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">SqlClient</span><span class="op">.</span><span class="fu">SqlDataAdapter</span><span class="ch">` </span>создать адаптер подключения для выполнения <span class="fu">SELECT</span> запросов к БД</span>
 | ||
| <span id="cb104-13"><a href="#cb104-13" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlAdapter</span><span class="op">.</span><span class="fu">SelectCommand</span> <span class="op">=</span> <span class="va">$SqlCommand</span><span class="ch">` </span>передать команду</span>
 | ||
| <span id="cb104-14"><a href="#cb104-14" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb104-15"><a href="#cb104-15" aria-hidden="true" tabindex="-1"></a><span class="va">$DataSet</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">DataSet</span><span class="ch">` </span>создать объект приема данных формата XML</span>
 | ||
| <span id="cb104-16"><a href="#cb104-16" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlAdapter</span><span class="op">.</span><span class="fu">Fill</span><span class="op">(</span><span class="va">$DataSet</span><span class="op">)</span><span class="ch">` </span>заполнить данными полученные от адаптера <span class="op">(</span>возвращает кол-во объектов<span class="op">)</span></span>
 | ||
| <span id="cb104-17"><a href="#cb104-17" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlConnection</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span>
 | ||
| <span id="cb104-18"><a href="#cb104-18" aria-hidden="true" tabindex="-1"></a><span class="va">$Data</span> <span class="op">=</span> <span class="va">$DataSet</span><span class="op">.</span><span class="fu">Tables</span></span>
 | ||
| <span id="cb104-19"><a href="#cb104-19" aria-hidden="true" tabindex="-1"></a><span class="va">$Data</span><span class="op">[</span><span class="dv">0</span><span class="op">]</span> <span class="op">|</span> <span class="fu">ft</span></span></code></pre></div>
 | ||
| <h3 id="sqlclient-insert">SqlClient INSERT</h3>
 | ||
| <div class="sourceCode" id="cb105"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb105-1"><a href="#cb105-1" aria-hidden="true" tabindex="-1"></a><span class="va">$user</span> <span class="op">=</span> <span class="st">"itinvent"</span></span>
 | ||
| <span id="cb105-2"><a href="#cb105-2" aria-hidden="true" tabindex="-1"></a><span class="va">$pass</span> <span class="op">=</span> <span class="st">"itinvent"</span></span>
 | ||
| <span id="cb105-3"><a href="#cb105-3" aria-hidden="true" tabindex="-1"></a><span class="va">$db</span>   <span class="op">=</span> <span class="st">"db_test"</span></span>
 | ||
| <span id="cb105-4"><a href="#cb105-4" aria-hidden="true" tabindex="-1"></a><span class="va">$srv</span>  <span class="op">=</span> <span class="st">"192.168.3.103"</span></span>
 | ||
| <span id="cb105-5"><a href="#cb105-5" aria-hidden="true" tabindex="-1"></a><span class="va">$sql</span> <span class="op">=</span> <span class="st">"INSERT INTO table_test (column_user) VALUES ('lifailon')"</span><span class="ch">` </span>добавить данные в таблицу table_test в колонку column_user</span>
 | ||
| <span id="cb105-6"><a href="#cb105-6" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlConnection</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">SqlClient</span><span class="op">.</span><span class="fu">SqlConnection</span></span>
 | ||
| <span id="cb105-7"><a href="#cb105-7" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlConnection</span><span class="op">.</span><span class="fu">ConnectionString</span> <span class="op">=</span> <span class="st">"server=</span><span class="va">$srv</span><span class="st">;database=</span><span class="va">$db</span><span class="st">;user id=</span><span class="va">$user</span><span class="st">;password=</span><span class="va">$pass</span><span class="st">;Integrated Security=false"</span></span>
 | ||
| <span id="cb105-8"><a href="#cb105-8" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlCommand</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">SqlClient</span><span class="op">.</span><span class="fu">SqlCommand</span></span>
 | ||
| <span id="cb105-9"><a href="#cb105-9" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlCommand</span><span class="op">.</span><span class="fu">CommandText</span> <span class="op">=</span> <span class="va">$sql</span></span>
 | ||
| <span id="cb105-10"><a href="#cb105-10" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlCommand</span><span class="op">.</span><span class="fu">Connection</span> <span class="op">=</span> <span class="va">$SqlConnection</span></span>
 | ||
| <span id="cb105-11"><a href="#cb105-11" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlConnection</span><span class="op">.</span><span class="fu">Open</span><span class="op">()</span></span>
 | ||
| <span id="cb105-12"><a href="#cb105-12" aria-hidden="true" tabindex="-1"></a><span class="va">$rowsAffected</span> <span class="op">=</span> <span class="va">$SqlCommand</span><span class="op">.</span><span class="fu">ExecuteNonQuery</span><span class="op">();</span><span class="ch">` </span>для запросов INSERT<span class="op">/</span>UPDATE<span class="op">/</span>DELETE не используется SqlDataAdapter</span>
 | ||
| <span id="cb105-13"><a href="#cb105-13" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlConnection</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span></code></pre></div>
 | ||
| <h3 id="ssms-insert">SSMS INSERT</h3>
 | ||
| <pre><code>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]</code></pre>
 | ||
| <h3 id="t-sql">T-SQL</h3>
 | ||
| <ul>
 | ||
| <li><p>DDL (Data Definition Language / Язык определения данных). К этому
 | ||
| типу относятся команды, которые создают базу данных, таблицы, индексы,
 | ||
| хранимые процедуры.<br />
 | ||
| <code>CREATE</code> создает объекты базы данных (саму базу даных,
 | ||
| таблицы, индексы и т.д.)<br />
 | ||
| <code>ALTER</code> изменяет объекты базы данных<br />
 | ||
| <code>DROP</code> удаляет объекты базы данных<br />
 | ||
| <code>TRUNCATE</code> удаляет все данные из таблиц</p></li>
 | ||
| <li><p>DML (Data Manipulation Language / Язык манипуляции данными). К
 | ||
| этому типу относят команды по выбору, обновлению, добавлению и удалению
 | ||
| данных.<br />
 | ||
| <code>SELECT</code> извлекает данные из БД<br />
 | ||
| <code>UPDATE</code> обновляет данные<br />
 | ||
| <code>INSERT</code> добавляет новые данные<br />
 | ||
| <code>DELETE</code> удаляет данные</p></li>
 | ||
| <li><p>DCL (Data Control Language / Язык управления доступа к данным). К
 | ||
| этому типу относят команды, которые управляют правами по доступу к
 | ||
| данным.<br />
 | ||
| <code>GRANT</code> предоставляет права для доступа к данным<br />
 | ||
| <code>REVOKE</code> отзывает права на доступ к данным</p></li>
 | ||
| </ul>
 | ||
| <pre><code>-- Переменные
 | ||
| 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);</code></pre>
 | ||
| <h3 id="тип-резервной-копии">Тип резервной копии</h3>
 | ||
| <ul>
 | ||
| <li>Full (Полная копия). Когда стартует полное резервирование,
 | ||
| записывается Log Sequence Number (LSN - последовательный номер журнала),
 | ||
| а так же LSN записывается и при завершении полного резервирования. Этот
 | ||
| LSN является механизмом, используемым SQL Server, чтобы знать, в каком
 | ||
| порядке выполнялись операторы INSERT, UPDATE или DELETE. При этом
 | ||
| наличие записанных LSN начала и окончания, как части полного бэкапа,
 | ||
| обеспечивает согласованное с точки зрения транзакций резервное
 | ||
| копирование, поскольку при полном резервном копировании учитываются
 | ||
| изменения, произошедшие во время резервного копирования. Это
 | ||
| обеспечивает обработку таких транзакций в процессе восстановления
 | ||
| бэкапа.</li>
 | ||
| <li>Differential (дифференциальная/разностная копия). Хранит данных,
 | ||
| изменившиеся с момента последней Полной резервной копии. При
 | ||
| восстановлении нужно сначала восстановить Полную резервную копию в
 | ||
| режиме NORECOVERY, потом можно применить любую из последующих Разностных
 | ||
| копий, без предыдущей Полной резервной копии Разностная копия
 | ||
| бесполезна. Каждая последующая Разностная копия будет хранить все
 | ||
| данные, входящие в предыдущую Разностную резервную копию, сделанную
 | ||
| после предыдущей Полной копии.</li>
 | ||
| <li>Incremental (инкрементальная/копия журналов транзакций). Резервное
 | ||
| копирования журнала транзакций копирует все транзакции, которые
 | ||
| произошли с момента последнего резервного копирования, а затем урезает
 | ||
| журнал транзакций для освобождения дискового пространства. Транзакции
 | ||
| происходят в определенном порядке (LSN), бэкап журнала поддерживает этот
 | ||
| порядок транзакций. Бэкапы журналов транзакций должны восстанавливаться
 | ||
| по порядку. Для восстановления базы данных потребуется вся цепочка
 | ||
| резервных копий: полная и все последующие инкрементальные журнала
 | ||
| транзакций.</li>
 | ||
| </ul>
 | ||
| <h3 id="модели-восстановления">Модели восстановления</h3>
 | ||
| <ul>
 | ||
| <li>Simple (Простая). Хранится только необходимый для жизни остаток
 | ||
| журнала транзакций. Журнал транзакций (лог) автоматически очищается.
 | ||
| Создание резервных копий журнала транзакций невозможна, поэтому остается
 | ||
| самое ограниченное число опций по восстановлению. Недоступен функционал:
 | ||
| Always On, Point-In-Time восстановление, Резервные копии журнала
 | ||
| транзакций.</li>
 | ||
| <li>Full (Полная). Хранится журнал транзакций всех изменений в БД с
 | ||
| момента последнего резервного копирования журнала транзакций. Журнал
 | ||
| транзакций не будет очищаться до тех пор, пока не будет сделана
 | ||
| резервная копия журнала транзакций.</li>
 | ||
| <li>Bulk logged (С неполным протоколированием). Идентична Full, за
 | ||
| исключение: SELECT INTO, BULK INSERT и BCP, INSERT INTO SELECT, операции
 | ||
| с индексами (CREATE INDEX, ALTER INDEX REBUILD, DROP INDEX)</li>
 | ||
| </ul>
 | ||
| <h3 id="системные-бд">Системные БД</h3>
 | ||
| <ul>
 | ||
| <li>master. Хранятся все данные системного уровня (конфигурация системы,
 | ||
| сведенья об учетных записях входа, информация обо всех других базах
 | ||
| данных) для экземпляра SQL Server.</li>
 | ||
| <li>tempdb. Рабочее пространство для временных объектов, таких как
 | ||
| глобальные или локальные временные таблицы, временные хранимые
 | ||
| процедуры, табличные переменные и курсоры. Пересоздаётся при каждом
 | ||
| запуске SQL Server.</li>
 | ||
| <li>model. Используется в качестве шаблона для всех баз данных,
 | ||
| создаваемых в экземпляре SQL Server, все содержимое базы данных model,
 | ||
| включая параметры базы данных, копируется в создаваемую базу данных. Так
 | ||
| как база данных tempdb создается каждый раз при запуске SQL Server, база
 | ||
| данных model всегда должна существовать в системе SQL Server.</li>
 | ||
| <li>msdb. Используется агентом SQL Server для создания расписания
 | ||
| предупреждений (оператор) и выполнение заданий, а также другими
 | ||
| компонентами. SQL Server хранит полный журнал резервного копирования и
 | ||
| восстановления в базе данных msdb. Для отправки почты оператору
 | ||
| используется: USE [msdb].</li>
 | ||
| <li>resource. Доступная только для чтения база данных, которая содержит
 | ||
| все системные объекты, например sys.objects, физически хранятся в базе
 | ||
| данных resource, но логически присутствуют в схеме sys каждой базы
 | ||
| данных.</li>
 | ||
| </ul>
 | ||
| <h3 id="регламентные-операции">Регламентные операции</h3>
 | ||
| <ul>
 | ||
| <li>Проверка целостности базы данных</li>
 | ||
| </ul>
 | ||
| <p><code>DBCC CHECKDB</code></p>
 | ||
| <ul>
 | ||
| <li><p>Индексы. Индексы используются для быстрого поиска данных без
 | ||
| необходимости поиска/просмотра всех строк в таблице базы данных при
 | ||
| каждом обращении к таблице базы данных. Индекс ускоряет процесс запроса,
 | ||
| предоставляя быстрый доступ к строкам данных в таблице, аналогично тому,
 | ||
| как указатель в книге помогает вам быстро найти необходимую информацию.
 | ||
| Индексы предоставляют путь для быстрого поиска данных на основе значений
 | ||
| в этих столбцах. Для каждого индекса обязательно хранится его
 | ||
| статистика. MS SQL Server самостоятельно создает и изменяет индексы при
 | ||
| работе с базой. С течением времени данные в индексе становятся
 | ||
| фрагментированными, т.е. разбросанными по базе данных, что серьезно
 | ||
| снижает производительность запросов. Если фрагментация составляет от 5
 | ||
| до 30% (стандартно в задании 15%), то рекомендуется ее устранить с
 | ||
| помощью реорганизации, при фрагментации выше 30% (по умолчанию в задаче
 | ||
| > 30% фрагментации и число страниц > 1000) необходимо полное
 | ||
| перестроение индексов. После перестроения планово используется только
 | ||
| реорганизация.</p></li>
 | ||
| <li><p>Реорганизация (Reorganize) или дефрагментация индекса — это серия
 | ||
| небольших локальных перемещений страниц так, чтобы индекс не был
 | ||
| фрагментирован. После реорганизации статистика не обновляется. Во время
 | ||
| выполнения почти все данные доступны, пользователи смогут
 | ||
| работать.</p></li>
 | ||
| </ul>
 | ||
| <p><code>sp_msforeachtable N'DBCC INDEXDEFRAG (<имя базы данных>, ''?'')'</code></p>
 | ||
| <ul>
 | ||
| <li>Перестроение (Rebuild) индексов (или задача в мастере планов
 | ||
| обслуживания: Восстановить индекс) запускает процесс полного построения
 | ||
| индексов. В версии MS SQL Server Standard происходит отключение всех
 | ||
| клиентов от базы на время выполнения операции. После перестроения
 | ||
| обязательно обновляется статистика.</li>
 | ||
| </ul>
 | ||
| <p><code>sp_msforeachtable N'DBCC DBREINDEX (''?'')'</code></p>
 | ||
| <ul>
 | ||
| <li>Обновление статистики. Статистика — небольшая таблица (обычно до 200
 | ||
| строк), в которой хранится обобщенная информация о том, какие значения и
 | ||
| как часто встречаются в таблице. На основании статистики сервер
 | ||
| принимает решение, как лучше построить запрос. Когда происходят запросы
 | ||
| к БД (например, SELECT) вы получаете данные, но не описываете то, как
 | ||
| эти данные должны быть извлечены. В получении и обработке данных
 | ||
| помогает статистика. Во время выполнения процедуры обновления статистики
 | ||
| данные не блокируются.</li>
 | ||
| </ul>
 | ||
| <p><code>exec sp_msforeachtable N'UPDATE STATISTICS ? WITH FULLSCAN'</code></p>
 | ||
| <ul>
 | ||
| <li>Очистка процедурного кэша, выполняется после обновления статистики.
 | ||
| Оптимизатор MS SQL Server кэширует планы запросов для их повторного
 | ||
| выполнения. Это делается для того, чтобы экономить время, затрачиваемое
 | ||
| на компиляцию запроса в том случае, если такой же запрос уже выполнялся
 | ||
| и его план известен. После обновия статистики, не будет очищен
 | ||
| процедурный кэш, то SQL Server может выбрать старый (неоптимальный) план
 | ||
| запроса из кэша вместо того, чтобы построить новый (более оптимальный)
 | ||
| план.</li>
 | ||
| </ul>
 | ||
| <p><code>DBCC FREEPROCCACHE</code></p>
 | ||
| <h1 id="influxdb">InfluxDB</h1>
 | ||
| <p><a href="https://www.influxdata.com/downloads">Download InfluxDB 1.x
 | ||
| Open Source</a> <a
 | ||
| href="https://github.com/CymaticLabs/InfluxDBStudio">InfluxDB-Studio</a></p>
 | ||
| <h3 id="install-windows">Install Windows</h3>
 | ||
| <div class="sourceCode" id="cb108"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb108-1"><a href="#cb108-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-RestMethod</span> <span class="st">"https://dl.influxdata.com/influxdb/releases/influxdb-1.8.10_windows_amd64.zip"</span> <span class="op">-</span>OutFile <span class="st">"</span><span class="va">$home</span><span class="st">\Downloads\influxdb-1.8.10_windows_amd64.zip"</span></span>
 | ||
| <span id="cb108-2"><a href="#cb108-2" aria-hidden="true" tabindex="-1"></a>Expand-Archive <span class="st">"</span><span class="va">$home</span><span class="st">\Downloads\influxdb-1.8.10_windows_amd64.zip"</span> <span class="op">-</span>DestinationPath <span class="st">"</span><span class="va">$home</span><span class="st">\Documents\"</span></span>
 | ||
| <span id="cb108-3"><a href="#cb108-3" aria-hidden="true" tabindex="-1"></a><span class="fu">Remove-Item</span> <span class="st">"</span><span class="va">$home</span><span class="st">\Downloads\influxdb-1.8.10_windows_amd64.zip"</span></span>
 | ||
| <span id="cb108-4"><a href="#cb108-4" aria-hidden="true" tabindex="-1"></a><span class="op">&</span> <span class="st">"</span><span class="va">$home</span><span class="st">\Downloads\influxdb-1.8.10-1\influxd.exe"</span></span></code></pre></div>
 | ||
| <h3 id="install-ubuntu">Install Ubuntu</h3>
 | ||
| <div class="sourceCode" id="cb109"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb109-1"><a href="#cb109-1" aria-hidden="true" tabindex="-1"></a><span class="fu">wget</span> https://dl.influxdata.com/influxdb/releases/influxdb_1.8.10_amd64.deb</span>
 | ||
| <span id="cb109-2"><a href="#cb109-2" aria-hidden="true" tabindex="-1"></a><span class="fu">sudo</span> dpkg <span class="at">-i</span> influxdb_1.8.10_amd64.deb</span>
 | ||
| <span id="cb109-3"><a href="#cb109-3" aria-hidden="true" tabindex="-1"></a><span class="ex">systemctl</span> start influxdb</span>
 | ||
| <span id="cb109-4"><a href="#cb109-4" aria-hidden="true" tabindex="-1"></a><span class="ex">systemctl</span> status influxdb</span>
 | ||
| <span id="cb109-5"><a href="#cb109-5" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb109-6"><a href="#cb109-6" aria-hidden="true" tabindex="-1"></a><span class="fu">ps</span> aux <span class="kw">|</span> <span class="fu">grep</span> influxdb <span class="kw">|</span> <span class="fu">grep</span> <span class="at">-Ev</span> <span class="st">"grep"</span></span>
 | ||
| <span id="cb109-7"><a href="#cb109-7" aria-hidden="true" tabindex="-1"></a><span class="fu">netstat</span> <span class="at">-natpl</span> <span class="kw">|</span> <span class="fu">grep</span> 80<span class="pp">[</span><span class="ss">8</span><span class="pp">-</span><span class="ss">9</span><span class="pp">][</span><span class="ss">3</span><span class="pp">-</span><span class="ss">9</span><span class="pp">]</span></span></code></pre></div>
 | ||
| <h3 id="api">API</h3>
 | ||
| <div class="sourceCode" id="cb110"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb110-1"><a href="#cb110-1" aria-hidden="true" tabindex="-1"></a><span class="fu">nano</span> /etc/influxdb/influxdb.conf</span>
 | ||
| <span id="cb110-2"><a href="#cb110-2" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb110-3"><a href="#cb110-3" aria-hidden="true" tabindex="-1"></a><span class="ex">[http]</span></span>
 | ||
| <span id="cb110-4"><a href="#cb110-4" aria-hidden="true" tabindex="-1"></a>  <span class="ex">enabled</span> = true</span>
 | ||
| <span id="cb110-5"><a href="#cb110-5" aria-hidden="true" tabindex="-1"></a>  <span class="ex">bind-address</span> = <span class="st">":8086"</span></span>
 | ||
| <span id="cb110-6"><a href="#cb110-6" aria-hidden="true" tabindex="-1"></a>  <span class="ex">auth-enabled</span> = false</span>
 | ||
| <span id="cb110-7"><a href="#cb110-7" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb110-8"><a href="#cb110-8" aria-hidden="true" tabindex="-1"></a><span class="ex">systemctl</span> restart influxdb</span></code></pre></div>
 | ||
| <h3 id="chronograf">Chronograf</h3>
 | ||
| <pre><code>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</code></pre>
 | ||
| <h3 id="grafana">Grafana</h3>
 | ||
| <p><a href="https://grafana.com/grafana/download">Download</a></p>
 | ||
| <p><code>invoke-RestMethod https://dl.grafana.com/enterprise/release/grafana-enterprise-10.3.1.windows-amd64.msi -OutFile "$home\Download\grafana.msi"</code></p>
 | ||
| <div class="sourceCode" id="cb112"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb112-1"><a href="#cb112-1" aria-hidden="true" tabindex="-1"></a><span class="ex">apt-get</span> install <span class="at">-y</span> adduser libfontconfig1 musl</span>
 | ||
| <span id="cb112-2"><a href="#cb112-2" aria-hidden="true" tabindex="-1"></a><span class="fu">wget</span> https://dl.grafana.com/enterprise/release/grafana-enterprise_10.3.1_amd64.deb</span>
 | ||
| <span id="cb112-3"><a href="#cb112-3" aria-hidden="true" tabindex="-1"></a><span class="ex">dpkg</span> <span class="at">-i</span> grafana-enterprise_10.3.1_amd64.deb</span>
 | ||
| <span id="cb112-4"><a href="#cb112-4" aria-hidden="true" tabindex="-1"></a><span class="ex">systemctl</span> start grafana-server</span>
 | ||
| <span id="cb112-5"><a href="#cb112-5" aria-hidden="true" tabindex="-1"></a><span class="ex">systemctl</span> status grafana-server</span></code></pre></div>
 | ||
| <h3 id="cli-client">CLI Client</h3>
 | ||
| <p><code>apt install influxdb-client</code><br />
 | ||
| <code>influx</code><br />
 | ||
| <code>influx --host 192.168.3.102 --username admin --password password</code></p>
 | ||
| <div class="sourceCode" id="cb113"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb113-1"><a href="#cb113-1" aria-hidden="true" tabindex="-1"></a><span class="va">$influx_client_exec</span> <span class="op">=</span> <span class="st">"</span><span class="va">$home</span><span class="st">\Documents\influxdb-1.8.10-1\influx.exe"</span></span>
 | ||
| <span id="cb113-2"><a href="#cb113-2" aria-hidden="true" tabindex="-1"></a><span class="op">&</span> <span class="va">$influx_client_exec</span> <span class="op">-</span>host <span class="dv">192.168</span><span class="op">.</span><span class="dv">3.102</span> <span class="op">-</span>port <span class="dv">8086</span></span>
 | ||
| <span id="cb113-3"><a href="#cb113-3" aria-hidden="true" tabindex="-1"></a><span class="dt">help</span></span>
 | ||
| <span id="cb113-4"><a href="#cb113-4" aria-hidden="true" tabindex="-1"></a>show databases</span>
 | ||
| <span id="cb113-5"><a href="#cb113-5" aria-hidden="true" tabindex="-1"></a>use PowerShell</span>
 | ||
| <span id="cb113-6"><a href="#cb113-6" aria-hidden="true" tabindex="-1"></a><span class="fu">SELECT</span> <span class="op">*</span> <span class="kw">FROM</span> <span class="st">"HardwareMonitor"</span> <span class="fu">WHERE</span> time <span class="op">></span> now<span class="op">()</span> <span class="op">-</span> 5m</span></code></pre></div>
 | ||
| <h3 id="users">USERS</h3>
 | ||
| <p><code>SHOW USERS</code> отобразить пользователей и их права
 | ||
| доступа<br />
 | ||
| <code>CREATE USER admin WITH PASSWORD 'password' WITH ALL PRIVILEGES</code>
 | ||
| создать пользователя<br />
 | ||
| <code>GRANT ALL PRIVILEGES TO "admin"</code> предоставить права
 | ||
| доступа<br />
 | ||
| <code>GRANT READ ON "database" TO "admin"</code> доступ на чтение для БД
 | ||
| или запись (WRITE)<br />
 | ||
| <code>REVOKE ALL PRIVILEGES FROM "admin"</code> отозвать права
 | ||
| доступа<br />
 | ||
| <code>SHOW GRANTS FOR "admin"</code> БД и привелегии доступа для
 | ||
| указанного пользователя<br />
 | ||
| <code>SET PASSWORD FOR "admin" = 'new_password'</code> изменить
 | ||
| пароль<br />
 | ||
| <code>DROP USER "admin"</code> удалить пользователя</p>
 | ||
| <h3 id="database-2">DATABASE</h3>
 | ||
| <p><code>CREATE DATABASE powershell</code> создать БД<br />
 | ||
| <code>SHOW DATABASES</code> отобразить список БД<br />
 | ||
| <code>DROP DATABASE powershell</code> удалить БД<br />
 | ||
| <code>USE powershell</code><br />
 | ||
| <code>SHOW measurements</code> отобразить все таблицы<br />
 | ||
| <code>INSERT performance,host=console,counter=CPU value=0.88</code>
 | ||
| записать данные в таблицу performance</p>
 | ||
| <h3 id="measurement">MEASUREMENT</h3>
 | ||
| <p><code>SHOW TAG KEYS FROM "HardwareMonitor"</code> отобразить все тэги
 | ||
| в таблице<br />
 | ||
| <code>SHOW TAG VALUES FROM "HardwareMonitor" WITH KEY = "HardwareName"</code>
 | ||
| отобразить все значения указанного тэга<br />
 | ||
| <code>SHOW FIELD KEYS FROM "HardwareMonitor"</code> отобразить все Field
 | ||
| Tags и их тип данных<br />
 | ||
| <code>SHOW SERIES FROM "HardwareMonitor"</code> отобразить список всех
 | ||
| уникальных серий в указанной таблице. Серия - это набор точек данных,
 | ||
| которые имеют одинаковые значения для всех тегов, за исключением
 | ||
| времени.<br />
 | ||
| <code>DROP SERIES FROM "HardwareMonitor"</code> очистить все данные в
 | ||
| таблице<br />
 | ||
| <code>DROP MEASUREMENT "HardwareMonitor"</code> удалить таблицу</p>
 | ||
| <h3 id="selectwhere">SELECT/WHERE</h3>
 | ||
| <p><code>SELECT * FROM performance</code> отобразить все данные в
 | ||
| таблице<br />
 | ||
| <code>SELECT value FROM performance</code> отфильтровать по столбцу
 | ||
| value (только Field Keys)<br />
 | ||
| <code>SELECT * FROM performance limit 10</code> отобразить 10 единиц
 | ||
| данных<br />
 | ||
| <code>SELECT * FROM performance WHERE time > now() -2d</code>
 | ||
| отобразить данные за последние 2 дня<br />
 | ||
| <code>SELECT * FROM performance WHERE time > now() +3h -5m</code>
 | ||
| данные за последние 5 минут (+3 часа от текущего времени по UTC 0 -5
 | ||
| минут)<br />
 | ||
| <code>SELECT * FROM performance WHERE counter = 'CPU'</code> выборка по
 | ||
| тэгу<br />
 | ||
| <code>SELECT upload/1000 FROM speedtest WHERE upload/1000 <= 250</code>
 | ||
| выборка по столбцу upload и разделить вывод на 1000, вывести upload
 | ||
| меньше 250<br />
 | ||
| <code>DELETE FROM performance WHERE time > now() -1h</code> удалить
 | ||
| данные за последние 1/4 часа<br />
 | ||
| <code>DELETE FROM performance WHERE time < now() -24h</code> удалить
 | ||
| данные старше 24 часов</p>
 | ||
| <h3 id="regex-1">REGEX</h3>
 | ||
| <p><code>SELECT * FROM "win_pdisk" WHERE instance =~/.*C:/ and time > now() - 5m</code>
 | ||
| и<br />
 | ||
| <code>SELECT * FROM "win_pdisk" WHERE instance =~/.*E:/ or instance =~ /.*F:/</code>
 | ||
| или<br />
 | ||
| <code>SELECT * FROM "win_pdisk" WHERE instance !~ /.*Total/</code> не
 | ||
| равно (исключить)<br />
 | ||
| <code>SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and HardwareName =~ /Intel/</code>
 | ||
| приблизительно равно<br />
 | ||
| <code>SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and HardwareName =~ /Intel.+i7/</code>
 | ||
| эквивалент 12th_Gen_Intel_Core_i7-1260P<br />
 | ||
| <code>SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and HardwareName =~ /^Intel/</code>
 | ||
| начинается на Intel<br />
 | ||
| <code>SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and HardwareName =~ /00$/</code>
 | ||
| заканчивается на 00</p>
 | ||
| <h3 id="group-by-tag_key">GROUP BY tag_key</h3>
 | ||
| <p><code>SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and SensorName = 'Temperature' GROUP BY HardwareName</code>
 | ||
| создать уникальные группы по тэгу HardwareName<br />
 | ||
| <code>SELECT * FROM "HardwareMonitor" WHERE time > now() - 5m and SensorName = 'Temperature' GROUP BY Host,HardwareName</code>
 | ||
| больше групп по двум тэгаам</p>
 | ||
| <h3 id="functionsfield_key">Functions(field_key)</h3>
 | ||
| <p><a
 | ||
| href="https://docs.influxdata.com/influxdb/v1.8/query_language/functions">Functions</a></p>
 | ||
| <p><code>SELECT instance,LAST(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance</code>
 | ||
| отфильтровать вывод по последнему/текущему значению<br />
 | ||
| <code>SELECT instance,FIRST(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance</code>
 | ||
| отфильтровать вывод по первому значению за весь или указанный отрезок
 | ||
| времени<br />
 | ||
| <code>SELECT instance,MIN(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance</code>
 | ||
| отфильтровать вывод с отображением минимального значения<br />
 | ||
| <code>SELECT instance,MAX(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance</code>
 | ||
| отфильтровать вывод с отображением максимального значения<br />
 | ||
| <code>SELECT SUM(Bytes_Received_persec) FROM "win_net" GROUP BY instance</code>
 | ||
| суммах всех значений<br />
 | ||
| <code>SELECT COUNT(Bytes_Received_persec) FROM "win_net" WHERE Bytes_Received_persec >= 0 GROUP BY instance</code>
 | ||
| кол-во данных, где значение выше или равно 0<br />
 | ||
| <code>SELECT MEAN(Bytes_Received_persec) FROM "win_net" WHERE Bytes_Received_persec < 1000 GROUP BY instance</code>
 | ||
| среднее значение данных с показателем от 0 до 1000 (509)</p>
 | ||
| <p><code>SELECT *,MAX(Value) FROM "HardwareMonitor" WHERE time > now() -1h GROUP BY SensorName,Host</code>
 | ||
| создать группы для выявления максимального значения значения стобца
 | ||
| Value каждого тэга SensorName и хоста за последний час<br />
 | ||
| <code>SELECT *,MAX(Value) FROM "HardwareMonitor" WHERE time > now() -1h and SensorName = 'CPU_Package' GROUP BY Host</code>
 | ||
| масимальное значение CPU_Package за последний час для каждого
 | ||
| хоста<br />
 | ||
| <code>SELECT MEAN(Value) FROM "HardwareMonitor" WHERE time > now() -1h and SensorName = 'CPU_Package' GROUP BY Host</code>
 | ||
| среднее значение CPU_Package за последний час</p>
 | ||
| <h3 id="policy">POLICY</h3>
 | ||
| <p><code>CREATE DATABASE powershell WITH DURATION 48h REPLICATION 1 NAME "del2d"</code>
 | ||
| создать БД с политикой хранения 2 дня<br />
 | ||
| <code>CREATE RETENTION POLICY del2h ON powershell DURATION 2h REPLICATION 1</code>
 | ||
| создать новую политику хранения для БД<br />
 | ||
| <code>CREATE RETENTION POLICY del6h ON powershell DURATION 6h REPLICATION 1 SHARD DURATION 2h</code>
 | ||
| указать период хранения 6 часов + 2 часа до очистки (по умолчанию 1ч или
 | ||
| больше)<br />
 | ||
| <code>ALTER RETENTION POLICY del6h ON powershell DEFAULT</code> изменить
 | ||
| (ALTER) политику хранения для БД на del6h (DEFAULT)<br />
 | ||
| <code>DROP RETENTION POLICY del2d ON powershell</code> удаление политики
 | ||
| хранения приводит к безвозвратному удалению всех измерений (таблиц) и
 | ||
| данных, хранящихся в политике хранения<br />
 | ||
| <code>SHOW RETENTION POLICIES ON PowerShell</code> отобразить
 | ||
| действующие политики базы данных PowerShell</p>
 | ||
| <div class="sourceCode" id="cb114"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb114-1"><a href="#cb114-1" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> http<span class="op">://</span><span class="dv">192.168</span><span class="op">.</span><span class="dv">3.102</span><span class="op">:</span><span class="dv">8086</span><span class="op">/</span>query<span class="op">?</span>q<span class="op">=</span><span class="st">"SHOW RETENTION POLICIES ON PowerShell"</span></span>
 | ||
| <span id="cb114-2"><a href="#cb114-2" aria-hidden="true" tabindex="-1"></a><span class="va">$col</span> <span class="op">=</span> <span class="va">$data</span><span class="op">.</span><span class="fu">results</span><span class="op">.</span><span class="fu">series</span><span class="op">.</span><span class="fu">columns</span></span>
 | ||
| <span id="cb114-3"><a href="#cb114-3" aria-hidden="true" tabindex="-1"></a><span class="va">$val</span> <span class="op">=</span> <span class="va">$data</span><span class="op">.</span><span class="fu">results</span><span class="op">.</span><span class="fu">series</span><span class="op">.</span><span class="fu">values</span></span>
 | ||
| <span id="cb114-4"><a href="#cb114-4" aria-hidden="true" tabindex="-1"></a><span class="va">$mass</span>    <span class="op">=</span> <span class="op">@()</span></span>
 | ||
| <span id="cb114-5"><a href="#cb114-5" aria-hidden="true" tabindex="-1"></a><span class="va">$mass</span>   <span class="op">+=</span> <span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$col</span></span>
 | ||
| <span id="cb114-6"><a href="#cb114-6" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$v</span> <span class="kw">in</span> <span class="va">$val</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb114-7"><a href="#cb114-7" aria-hidden="true" tabindex="-1"></a>    <span class="va">$mass</span> <span class="op">+=</span> <span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$v</span></span>
 | ||
| <span id="cb114-8"><a href="#cb114-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb114-9"><a href="#cb114-9" aria-hidden="true" tabindex="-1"></a><span class="va">$mass</span> <span class="op">=</span> <span class="va">$mass</span> <span class="op">-replace</span> <span class="st">'^'</span><span class="op">,</span><span class="st">'"'</span></span>
 | ||
| <span id="cb114-10"><a href="#cb114-10" aria-hidden="true" tabindex="-1"></a><span class="va">$mass</span> <span class="op">=</span> <span class="va">$mass</span> <span class="op">-replace</span> <span class="st">'$'</span><span class="op">,</span><span class="st">'"'</span></span>
 | ||
| <span id="cb114-11"><a href="#cb114-11" aria-hidden="true" tabindex="-1"></a><span class="va">$mass</span> <span class="op">=</span> <span class="va">$mass</span> <span class="op">-replace</span> <span class="st">'\s'</span><span class="op">,</span><span class="st">'","'</span></span>
 | ||
| <span id="cb114-12"><a href="#cb114-12" aria-hidden="true" tabindex="-1"></a><span class="va">$mass</span> <span class="op">|</span> <span class="fu">ConvertFrom-Csv</span></span></code></pre></div>
 | ||
| <h3 id="api-post">API POST</h3>
 | ||
| <p>Вместо таблиц в InfluxDB имеются измерения. Вместо столбцов в ней
 | ||
| есть теги и поля.</p>
 | ||
| <pre><code>   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"</code></pre>
 | ||
| <h3 id="api-get">API GET</h3>
 | ||
| <p><code>curl http://192.168.3.104:8086/query --data-urlencode "q=SHOW DATABASES"</code>
 | ||
| pwsh7 (ConvertFrom-Json) and bash</p>
 | ||
| <p><code>$dbs = irm "http://192.168.3.104:8086/query?q=SHOW DATABASES"</code><br />
 | ||
| <code>$dbs = irm "http://192.168.3.104:8086/query?epoch=ms&u=admin&p=password&q=SHOW DATABASES"</code><br />
 | ||
| <code>$dbs.results.series.values</code></p>
 | ||
| <div class="sourceCode" id="cb116"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb116-1"><a href="#cb116-1" aria-hidden="true" tabindex="-1"></a><span class="va">$ip</span>    <span class="op">=</span> <span class="st">"192.168.3.104"</span></span>
 | ||
| <span id="cb116-2"><a href="#cb116-2" aria-hidden="true" tabindex="-1"></a><span class="va">$port</span>  <span class="op">=</span> <span class="st">"8086"</span></span>
 | ||
| <span id="cb116-3"><a href="#cb116-3" aria-hidden="true" tabindex="-1"></a><span class="va">$db</span>    <span class="op">=</span> <span class="st">"powershell"</span></span>
 | ||
| <span id="cb116-4"><a href="#cb116-4" aria-hidden="true" tabindex="-1"></a><span class="va">$table</span> <span class="op">=</span> <span class="st">"speedtest"</span></span>
 | ||
| <span id="cb116-5"><a href="#cb116-5" aria-hidden="true" tabindex="-1"></a><span class="va">$query</span> <span class="op">=</span> <span class="st">"SELECT * FROM </span><span class="va">$table</span><span class="st">"</span></span>
 | ||
| <span id="cb116-6"><a href="#cb116-6" aria-hidden="true" tabindex="-1"></a><span class="va">$ipp</span>   <span class="op">=</span> <span class="va">$ip</span><span class="op">+</span><span class="st">":"</span><span class="op">+</span><span class="va">$port</span></span>
 | ||
| <span id="cb116-7"><a href="#cb116-7" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span>   <span class="op">=</span> <span class="st">"http://</span><span class="va">$ipp</span><span class="st">/query?db=</span><span class="va">$db</span><span class="st">&q=</span><span class="va">$query</span><span class="st">"</span></span>
 | ||
| <span id="cb116-8"><a href="#cb116-8" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span>  <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method GET <span class="op">-</span>Uri <span class="va">$url</span><span class="ch">` </span><span class="op">-</span>Credential <span class="va">$cred</span> </span>
 | ||
| <span id="cb116-9"><a href="#cb116-9" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span><span class="op">.</span><span class="fu">results</span><span class="op">.</span><span class="fu">series</span><span class="op">.</span><span class="fu">name</span>   <span class="ch">` </span>имя таблицы</span>
 | ||
| <span id="cb116-10"><a href="#cb116-10" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span><span class="op">.</span><span class="fu">results</span><span class="op">.</span><span class="fu">series</span><span class="op">.</span><span class="fu">columns</span><span class="ch">` </span>столбцы<span class="op">/</span>ключи</span>
 | ||
| <span id="cb116-11"><a href="#cb116-11" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span><span class="op">.</span><span class="fu">results</span><span class="op">.</span><span class="fu">series</span><span class="op">.</span><span class="fu">values</span> <span class="ch">` </span>данные построчно</span></code></pre></div>
 | ||
| <h3 id="endpoints">Endpoints</h3>
 | ||
| <p>https://docs.influxdata.com/influxdb/v1.7/tools/api/</p>
 | ||
| <div class="sourceCode" id="cb117"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb117-1"><a href="#cb117-1" aria-hidden="true" tabindex="-1"></a><span class="va">$stats</span> <span class="op">=</span> <span class="fu">irm</span> http<span class="op">://</span><span class="dv">192.168</span><span class="op">.</span><span class="dv">3.104</span><span class="op">:</span><span class="dv">8086</span><span class="op">/</span>debug<span class="op">/</span>vars<span class="ch">` </span>статистика сервера</span>
 | ||
| <span id="cb117-2"><a href="#cb117-2" aria-hidden="true" tabindex="-1"></a><span class="va">$stats</span><span class="op">.</span><span class="st">"database:powershell"</span><span class="op">.</span><span class="fu">values</span><span class="ch">` </span>кол-во таблиц к БД</span>
 | ||
| <span id="cb117-3"><a href="#cb117-3" aria-hidden="true" tabindex="-1"></a><span class="va">$stats</span><span class="op">.</span><span class="fu">queryExecutor</span><span class="op">.</span><span class="fu">values</span><span class="ch">` </span>количество query-запросов <span class="op">(</span>обращений к endpoint <span class="op">/</span>query<span class="op">)</span></span>
 | ||
| <span id="cb117-4"><a href="#cb117-4" aria-hidden="true" tabindex="-1"></a><span class="va">$stats</span><span class="op">.</span><span class="fu">write</span><span class="op">.</span><span class="fu">values</span><span class="ch">` </span>количество write-запросов</span>
 | ||
| <span id="cb117-5"><a href="#cb117-5" aria-hidden="true" tabindex="-1"></a><span class="va">$stats</span><span class="op">.</span><span class="fu">system</span><span class="op">.</span><span class="fu">uptime</span></span></code></pre></div>
 | ||
| <p><code>http://192.168.3.104:8086/debug/requests</code> кол-во
 | ||
| клиентских HTTP-запросов к конечным точкам /writeи /query<br />
 | ||
| <code>http://192.168.3.104:8086/debug/pprof</code><br />
 | ||
| <code>http://192.168.3.104:8086/ping</code><br />
 | ||
| <code>http://192.168.3.104:8086/query</code><br />
 | ||
| <code>http://192.168.3.104:8086/write</code></p>
 | ||
| <p><code>http://192.168.3.99:8086/api/v2/setup</code><br />
 | ||
| <code>http://192.168.3.99:8086/api/v2/config</code><br />
 | ||
| <code>http://192.168.3.99:8086/api/v2/write</code></p>
 | ||
| <h3 id="pingto-influxdb">PingTo-InfluxDB</h3>
 | ||
| <div class="sourceCode" id="cb118"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb118-1"><a href="#cb118-1" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(</span><span class="va">$true</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb118-2"><a href="#cb118-2" aria-hidden="true" tabindex="-1"></a>    <span class="va">$tz</span> <span class="op">=</span> <span class="op">(</span>Get-TimeZone<span class="op">).</span><span class="fu">BaseUtcOffset</span><span class="op">.</span><span class="fu">TotalMinutes</span></span>
 | ||
| <span id="cb118-3"><a href="#cb118-3" aria-hidden="true" tabindex="-1"></a>    <span class="va">$unixtime</span>  <span class="op">=</span> <span class="op">(</span><span class="fu">New-TimeSpan</span> <span class="op">-</span>Start <span class="op">(</span><span class="fu">Get-Date</span> <span class="st">"01/01/1970"</span><span class="op">)</span> <span class="op">-</span>End <span class="op">((</span><span class="fu">Get-Date</span><span class="op">).</span><span class="fu">AddMinutes</span><span class="op">(-</span><span class="va">$tz</span><span class="op">))).</span><span class="fu">TotalSeconds</span><span class="ch">` </span><span class="op">-</span>3h UTC</span>
 | ||
| <span id="cb118-4"><a href="#cb118-4" aria-hidden="true" tabindex="-1"></a>    <span class="va">$timestamp</span> <span class="op">=</span> <span class="op">([</span><span class="dt">string</span><span class="op">]</span><span class="va">$unixtime</span> <span class="op">-replace</span> <span class="st">"\..+"</span><span class="op">)</span> <span class="op">+</span> <span class="st">"000000000"</span></span>
 | ||
| <span id="cb118-5"><a href="#cb118-5" aria-hidden="true" tabindex="-1"></a>    <span class="va">$tnc</span> <span class="op">=</span> tnc <span class="dv">8.8</span><span class="op">.</span><span class="dv">8.8</span></span>
 | ||
| <span id="cb118-6"><a href="#cb118-6" aria-hidden="true" tabindex="-1"></a>    <span class="va">$Status</span> <span class="op">=</span> <span class="va">$tnc</span><span class="op">.</span><span class="fu">PingSucceeded</span></span>
 | ||
| <span id="cb118-7"><a href="#cb118-7" aria-hidden="true" tabindex="-1"></a>    <span class="va">$RTime</span> <span class="op">=</span> <span class="va">$tnc</span><span class="op">.</span><span class="fu">PingReplyDetails</span><span class="op">.</span><span class="fu">RoundtripTime</span></span>
 | ||
| <span id="cb118-8"><a href="#cb118-8" aria-hidden="true" tabindex="-1"></a>    <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="st">"http://192.168.3.104:8086/write?db=powershell"</span> <span class="op">-</span>Body <span class="st">"ping,host=</span><span class="op">$(</span>hostname<span class="op">)</span><span class="st"> status=</span><span class="va">$status</span><span class="st">,rtime=</span><span class="va">$RTime</span><span class="st"> </span><span class="va">$timestamp</span><span class="st">"</span></span>
 | ||
| <span id="cb118-9"><a href="#cb118-9" aria-hidden="true" tabindex="-1"></a>    <span class="fu">sleep</span> <span class="dv">1</span></span>
 | ||
| <span id="cb118-10"><a href="#cb118-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>SELECT * FROM ping WHERE status = false</code></p>
 | ||
| <h3 id="performanceto-influxdb">PerformanceTo-InfluxDB</h3>
 | ||
| <div class="sourceCode" id="cb119"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb119-1"><a href="#cb119-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> ConvertTo-Encoding <span class="op">([</span><span class="dt">string</span><span class="op">]</span><span class="va">$From</span><span class="op">,</span> <span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$To</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb119-2"><a href="#cb119-2" aria-hidden="true" tabindex="-1"></a>    <span class="kw">Begin</span> <span class="op">{</span></span>
 | ||
| <span id="cb119-3"><a href="#cb119-3" aria-hidden="true" tabindex="-1"></a>        <span class="va">$encFrom</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Text</span><span class="op">.</span><span class="fu">Encoding</span><span class="op">]::</span>GetEncoding<span class="op">(</span><span class="va">$from</span><span class="op">)</span></span>
 | ||
| <span id="cb119-4"><a href="#cb119-4" aria-hidden="true" tabindex="-1"></a>        <span class="va">$encTo</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Text</span><span class="op">.</span><span class="fu">Encoding</span><span class="op">]::</span>GetEncoding<span class="op">(</span><span class="va">$to</span><span class="op">)</span></span>
 | ||
| <span id="cb119-5"><a href="#cb119-5" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb119-6"><a href="#cb119-6" aria-hidden="true" tabindex="-1"></a>    <span class="cf">Process</span> <span class="op">{</span></span>
 | ||
| <span id="cb119-7"><a href="#cb119-7" aria-hidden="true" tabindex="-1"></a>        <span class="va">$bytes</span> <span class="op">=</span> <span class="va">$encTo</span><span class="op">.</span><span class="fu">GetBytes</span><span class="op">(</span><span class="va">$_</span><span class="op">)</span></span>
 | ||
| <span id="cb119-8"><a href="#cb119-8" aria-hidden="true" tabindex="-1"></a>        <span class="va">$bytes</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Text</span><span class="op">.</span><span class="fu">Encoding</span><span class="op">]::</span>Convert<span class="op">(</span><span class="va">$encFrom</span><span class="op">,</span> <span class="va">$encTo</span><span class="op">,</span> <span class="va">$bytes</span><span class="op">)</span></span>
 | ||
| <span id="cb119-9"><a href="#cb119-9" aria-hidden="true" tabindex="-1"></a>        <span class="va">$encTo</span><span class="op">.</span><span class="fu">GetString</span><span class="op">(</span><span class="va">$bytes</span><span class="op">)</span></span>
 | ||
| <span id="cb119-10"><a href="#cb119-10" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb119-11"><a href="#cb119-11" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb119-12"><a href="#cb119-12" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb119-13"><a href="#cb119-13" aria-hidden="true" tabindex="-1"></a><span class="va">$localization</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Culture</span><span class="op">).</span><span class="fu">LCID</span><span class="ch">` </span>текущая локализация</span>
 | ||
| <span id="cb119-14"><a href="#cb119-14" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$localization</span> <span class="op">-eq</span> <span class="dv">1049</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb119-15"><a href="#cb119-15" aria-hidden="true" tabindex="-1"></a>    <span class="va">$performance</span> <span class="op">=</span> <span class="st">"\\</span><span class="op">$(</span>hostname<span class="op">)</span><span class="st">\Процессор(_Total)\% загруженности процессора"</span> <span class="op">|</span> ConvertTo-Encoding UTF-8 windows-1251<span class="ch">` </span>декодировать кириллицу</span>
 | ||
| <span id="cb119-16"><a href="#cb119-16" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">else</span> <span class="op">{</span></span>
 | ||
| <span id="cb119-17"><a href="#cb119-17" aria-hidden="true" tabindex="-1"></a>    <span class="va">$performance</span> <span class="op">=</span> <span class="st">"\Processor(_Total)\% Processor Time"</span></span>
 | ||
| <span id="cb119-18"><a href="#cb119-18" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb119-19"><a href="#cb119-19" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb119-20"><a href="#cb119-20" aria-hidden="true" tabindex="-1"></a><span class="va">$tz</span> <span class="op">=</span> <span class="op">(</span>Get-TimeZone<span class="op">).</span><span class="fu">BaseUtcOffset</span><span class="op">.</span><span class="fu">TotalMinutes</span></span>
 | ||
| <span id="cb119-21"><a href="#cb119-21" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(</span><span class="va">$true</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb119-22"><a href="#cb119-22" aria-hidden="true" tabindex="-1"></a>    <span class="va">$unixtime</span>  <span class="op">=</span> <span class="op">(</span><span class="fu">New-TimeSpan</span> <span class="op">-</span>Start <span class="op">(</span><span class="fu">Get-Date</span> <span class="st">"01/01/1970"</span><span class="op">)</span> <span class="op">-</span>End <span class="op">((</span><span class="fu">Get-Date</span><span class="op">).</span><span class="fu">AddMinutes</span><span class="op">(-</span><span class="va">$tz</span><span class="op">))).</span><span class="fu">TotalSeconds</span><span class="ch">` </span><span class="op">-</span>3h UTC</span>
 | ||
| <span id="cb119-23"><a href="#cb119-23" aria-hidden="true" tabindex="-1"></a>    <span class="va">$timestamp</span> <span class="op">=</span> <span class="op">([</span><span class="dt">string</span><span class="op">]</span><span class="va">$unixtime</span> <span class="op">-replace</span> <span class="st">"\..+"</span><span class="op">)</span> <span class="op">+</span> <span class="st">"000000000"</span></span>
 | ||
| <span id="cb119-24"><a href="#cb119-24" aria-hidden="true" tabindex="-1"></a>    <span class="op">[</span><span class="dt">double</span><span class="op">]</span><span class="va">$value</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Counter</span> <span class="va">$performance</span><span class="op">).</span><span class="fu">CounterSamples</span><span class="op">.</span><span class="fu">CookedValue</span><span class="op">.</span><span class="fu">ToString</span><span class="op">(</span><span class="st">"0.00"</span><span class="op">).</span><span class="fu">replace</span><span class="op">(</span><span class="st">","</span><span class="op">,</span><span class="st">"."</span><span class="op">)</span><span class="ch">` </span>округлить в тип данных Double</span>
 | ||
| <span id="cb119-25"><a href="#cb119-25" aria-hidden="true" tabindex="-1"></a>    <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="st">"http://192.168.3.104:8086/write?db=powershell"</span> <span class="op">-</span>Body <span class="st">"performance,host=</span><span class="op">$(</span>hostname<span class="op">)</span><span class="st">,counter=CPU value=</span><span class="va">$value</span><span class="st"> </span><span class="va">$timestamp</span><span class="st">"</span></span>
 | ||
| <span id="cb119-26"><a href="#cb119-26" aria-hidden="true" tabindex="-1"></a>    <span class="fu">sleep</span> <span class="dv">5</span></span>
 | ||
| <span id="cb119-27"><a href="#cb119-27" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <h3 id="service">Service</h3>
 | ||
| <div class="sourceCode" id="cb120"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb120-1"><a href="#cb120-1" aria-hidden="true" tabindex="-1"></a><span class="va">$powershell_Path</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Command</span> powershell<span class="op">).</span><span class="fu">Source</span></span>
 | ||
| <span id="cb120-2"><a href="#cb120-2" aria-hidden="true" tabindex="-1"></a><span class="va">$NSSM_Path</span> <span class="op">=</span> <span class="st">"C:\NSSM\NSSM-2.24.exe"</span></span>
 | ||
| <span id="cb120-3"><a href="#cb120-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Script_Path</span> <span class="op">=</span> <span class="st">"C:\NSSM\PerformanceTo-InfluxDB.ps1"</span></span>
 | ||
| <span id="cb120-4"><a href="#cb120-4" aria-hidden="true" tabindex="-1"></a><span class="va">$Service_Name</span> <span class="op">=</span> <span class="st">"PerformanceTo-InfluxDB"</span></span>
 | ||
| <span id="cb120-5"><a href="#cb120-5" aria-hidden="true" tabindex="-1"></a><span class="op">&</span> <span class="va">$NSSM_Path</span> install <span class="va">$Service_Name</span> <span class="va">$powershell_Path</span> <span class="op">-</span>ExecutionPolicy Bypass <span class="op">-</span>NoProfile <span class="op">-</span>f <span class="va">$Script_Path</span></span>
 | ||
| <span id="cb120-6"><a href="#cb120-6" aria-hidden="true" tabindex="-1"></a><span class="fu">Get-Service</span> <span class="va">$Service_Name</span> <span class="op">|</span> <span class="fu">Start-Service</span></span>
 | ||
| <span id="cb120-7"><a href="#cb120-7" aria-hidden="true" tabindex="-1"></a><span class="fu">Get-Service</span> <span class="va">$Service_Name</span> <span class="op">|</span> <span class="fu">Set-Service</span> <span class="op">-</span>StartupType Automatic</span></code></pre></div>
 | ||
| <h1 id="telegraf">Telegraf</h1>
 | ||
| <p>Plugins:
 | ||
| https://docs.influxdata.com/telegraf/v1.27/plugins/#input-plugins</p>
 | ||
| <p><code>iwr https://dl.influxdata.com/telegraf/releases/telegraf-1.27.1_windows_amd64.zip -UseBasicParsing -OutFile telegraf-1.27.1_windows_amd64.zip</code><br />
 | ||
| <code>Expand-Archive .\telegraf-1.27.1_windows_amd64.zip -DestinationPath "C:\Telegraf"</code><br />
 | ||
| <code>rm telegraf-1.27.1_windows_amd64.zip</code><br />
 | ||
| <code>cd C:\Telegraf</code><br />
 | ||
| <code>.\telegraf.exe -sample-config --input-filter cpu:mem:dns_query --output-filter influxdb > telegraf_nt.conf</code>
 | ||
| создать конфигурацию с выбарнными плагинами для сбора метрик<br />
 | ||
| <code>Start-Process notepad++ C:\Telegraf\telegraf_nt.conf</code></p>
 | ||
| <pre><code>[[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"</code></pre>
 | ||
| <p><code>.\telegraf.exe --test -config C:\Telegraf\telegraf_nt.conf</code>
 | ||
| тест конфигурации (получения метрик с выводом в консоль)<br />
 | ||
| <code>C:\Telegraf\telegraf.exe -config C:\Telegraf\telegraf_nt.conf</code>
 | ||
| запустить telegraf (тест отправки данных)<br />
 | ||
| <code>.\telegraf.exe --config "C:\Telegraf\telegraf_nt.conf" --service install</code>
 | ||
| создать службу<br />
 | ||
| <code>Get-Service telegraf | Start-Service</code><br />
 | ||
| <code>.\telegraf.exe --service uninstall</code></p>
 | ||
| <p><code>USE telegraf</code><br />
 | ||
| <code>SELECT usage_idle,usage_system,usage_user FROM cpu</code></p>
 | ||
| <h1 id="elasticsearch">Elasticsearch</h1>
 | ||
| <p><code>Install-Module -Name Elastic.Console -AllowPrerelease</code>
 | ||
| https://github.com/elastic/powershell/blob/master/Elastic.Console/README.md<br />
 | ||
| <code>Get-Command -Module Elastic.Console</code><br />
 | ||
| <code>Get-ElasticsearchVersion</code><br />
 | ||
| <code>Set-ElasticsearchVersion 7.3.0</code><br />
 | ||
| <code>Invoke-Elasticsearch</code> REST API запросы</p>
 | ||
| <h1 id="cdata">CData</h1>
 | ||
| <p>https://www.powershellgallery.com/profiles/CData<br />
 | ||
| https://www.cdata.com/kb/tech/elasticsearch-ado-powershell.rst</p>
 | ||
| <p><code>Install-Module ElasticsearchCmdlets</code>
 | ||
| https://www.powershellgallery.com/packages/ElasticsearchCmdlets/23.0.8565.1<br />
 | ||
| <code>Import-Module ElasticsearchCmdlets</code><br />
 | ||
| <code>Get-Command -Module ElasticsearchCmdlets</code></p>
 | ||
| <div class="sourceCode" id="cb122"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb122-1"><a href="#cb122-1" aria-hidden="true" tabindex="-1"></a><span class="va">$elasticsearch</span> <span class="op">=</span> Connect-Elasticsearch  <span class="op">-</span>Server <span class="st">"</span><span class="va">$Server</span><span class="st">"</span> <span class="op">-</span>Port <span class="st">"</span><span class="va">$Port</span><span class="st">"</span> <span class="op">-</span>User <span class="st">"</span><span class="va">$User</span><span class="st">"</span> <span class="op">-</span>Password <span class="st">"</span><span class="va">$Password</span><span class="st">"</span></span>
 | ||
| <span id="cb122-2"><a href="#cb122-2" aria-hidden="true" tabindex="-1"></a><span class="va">$shipcity</span> <span class="op">=</span> <span class="st">"New York"</span></span>
 | ||
| <span id="cb122-3"><a href="#cb122-3" aria-hidden="true" tabindex="-1"></a><span class="va">$orders</span> <span class="op">=</span> Select-Elasticsearch <span class="op">-</span>Connection <span class="va">$elasticsearch</span> <span class="op">-</span>Table <span class="st">"Orders"</span> <span class="op">-</span>Where <span class="st">"ShipCity = </span><span class="ch">`'</span><span class="va">$ShipCity</span><span class="ch">`'</span><span class="st">"</span><span class="ch">` </span>поиск и получение данных</span>
 | ||
| <span id="cb122-4"><a href="#cb122-4" aria-hidden="true" tabindex="-1"></a><span class="va">$orders</span> <span class="op">=</span> Invoke-Elasticsearch <span class="op">-</span>Connection <span class="va">$elasticsearch</span> <span class="op">-</span>Query <span class="st">'SELECT * FROM Orders WHERE ShipCity = @ShipCity'</span> <span class="op">-</span>Params @<span class="op">{</span><span class="st">'@ShipCity'</span><span class="op">=</span><span class="st">'New York'</span><span class="op">}</span><span class="ch">` </span>SQL запросы</span></code></pre></div>
 | ||
| <h3 id="ado.net-assembly">ADO.NET Assembly</h3>
 | ||
| <p><code>Install-Package CData.Elasticsearch</code>
 | ||
| https://www.nuget.org/packages/CData.Elasticsearch<br />
 | ||
| <code>[Reflection.Assembly]::LoadFile("C:\Program Files\PackageManagement\NuGet\Packages\CData.Elasticsearch.23.0.8565\lib\net40\System.Data.CData.Elasticsearch.dll")</code></p>
 | ||
| <div class="sourceCode" id="cb123"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb123-1"><a href="#cb123-1" aria-hidden="true" tabindex="-1"></a><span class="va">$connect</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">CData</span><span class="op">.</span><span class="fu">Elasticsearch</span><span class="op">.</span><span class="fu">ElasticsearchConnection</span><span class="op">(</span><span class="st">"Server=127.0.0.1;Port=9200;User=admin;Password=123456;"</span><span class="op">)</span></span>
 | ||
| <span id="cb123-2"><a href="#cb123-2" aria-hidden="true" tabindex="-1"></a><span class="va">$connect</span><span class="op">.</span><span class="fu">Open</span><span class="op">()</span></span>
 | ||
| <span id="cb123-3"><a href="#cb123-3" aria-hidden="true" tabindex="-1"></a><span class="va">$sql</span> <span class="op">=</span> <span class="st">"SELECT OrderName, Freight from Orders"</span></span>
 | ||
| <span id="cb123-4"><a href="#cb123-4" aria-hidden="true" tabindex="-1"></a><span class="va">$da</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">CData</span><span class="op">.</span><span class="fu">Elasticsearch</span><span class="op">.</span><span class="fu">ElasticsearchDataAdapter</span><span class="op">(</span><span class="va">$sql</span><span class="op">,</span> <span class="va">$conn</span><span class="op">)</span></span>
 | ||
| <span id="cb123-5"><a href="#cb123-5" aria-hidden="true" tabindex="-1"></a><span class="va">$dt</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">DataTable</span></span>
 | ||
| <span id="cb123-6"><a href="#cb123-6" aria-hidden="true" tabindex="-1"></a><span class="va">$da</span><span class="op">.</span><span class="fu">Fill</span><span class="op">(</span><span class="va">$dt</span><span class="op">)</span></span>
 | ||
| <span id="cb123-7"><a href="#cb123-7" aria-hidden="true" tabindex="-1"></a><span class="va">$dt</span><span class="op">.</span><span class="fu">Rows</span> <span class="op">|</span> <span class="cf">foreach</span> <span class="op">{</span></span>
 | ||
| <span id="cb123-8"><a href="#cb123-8" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Host</span> <span class="va">$_</span><span class="op">.</span><span class="fu">ordername</span> <span class="va">$_</span><span class="op">.</span><span class="fu">freight</span></span>
 | ||
| <span id="cb123-9"><a href="#cb123-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <h3 id="update-1">UPDATE</h3>
 | ||
| <div class="sourceCode" id="cb124"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb124-1"><a href="#cb124-1" aria-hidden="true" tabindex="-1"></a>Update-Elasticsearch <span class="op">-</span>Connection <span class="va">$Elasticsearch</span> <span class="op">-</span>Columns <span class="op">@(</span><span class="st">'OrderName'</span><span class="op">,</span><span class="st">'Freight'</span><span class="op">)</span> <span class="op">-</span>Values <span class="op">@(</span><span class="st">'MyOrderName'</span><span class="op">,</span> <span class="st">'MyFreight'</span><span class="op">)</span> <span class="op">-</span>Table Orders <span class="op">-</span>Id <span class="st">"MyId"</span></span>
 | ||
| <span id="cb124-2"><a href="#cb124-2" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb124-3"><a href="#cb124-3" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span> <span class="op">=</span>  <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">CData</span><span class="op">.</span><span class="fu">Elasticsearch</span><span class="op">.</span><span class="fu">ElasticsearchCommand</span><span class="op">(</span><span class="st">"UPDATE Orders SET ShipCity='New York' WHERE Id = @myId"</span><span class="op">,</span> <span class="va">$conn</span><span class="op">)</span></span>
 | ||
| <span id="cb124-4"><a href="#cb124-4" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span><span class="op">.</span><span class="fu">Parameters</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span>new System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">CData</span><span class="op">.</span><span class="fu">Elasticsearch</span><span class="op">.</span><span class="fu">ElasticsearchParameter</span><span class="op">(</span><span class="st">"@myId"</span><span class="op">,</span><span class="st">"10456255-0015501366"</span><span class="op">))</span></span>
 | ||
| <span id="cb124-5"><a href="#cb124-5" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span><span class="op">.</span><span class="fu">ExecuteNonQuery</span><span class="op">()</span></span></code></pre></div>
 | ||
| <h3 id="insert-1">INSERT</h3>
 | ||
| <div class="sourceCode" id="cb125"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb125-1"><a href="#cb125-1" aria-hidden="true" tabindex="-1"></a>Add-Elasticsearch <span class="op">-</span>Connection <span class="va">$Elasticsearch</span> <span class="op">-</span>Table Orders <span class="op">-</span>Columns <span class="op">@(</span><span class="st">"OrderName"</span><span class="op">,</span> <span class="st">"Freight"</span><span class="op">)</span> <span class="op">-</span>Values <span class="op">@(</span><span class="st">"MyOrderName"</span><span class="op">,</span> <span class="st">"MyFreight"</span><span class="op">)</span></span>
 | ||
| <span id="cb125-2"><a href="#cb125-2" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb125-3"><a href="#cb125-3" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span> <span class="op">=</span>  <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">CData</span><span class="op">.</span><span class="fu">Elasticsearch</span><span class="op">.</span><span class="fu">ElasticsearchCommand</span><span class="op">(</span><span class="st">"INSERT INTO Orders (ShipCity) VALUES (@myShipCity)"</span><span class="op">,</span> <span class="va">$conn</span><span class="op">)</span></span>
 | ||
| <span id="cb125-4"><a href="#cb125-4" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span><span class="op">.</span><span class="fu">Parameters</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span>new System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">CData</span><span class="op">.</span><span class="fu">Elasticsearch</span><span class="op">.</span><span class="fu">ElasticsearchParameter</span><span class="op">(</span><span class="st">"@myShipCity"</span><span class="op">,</span><span class="st">"New York"</span><span class="op">))</span></span>
 | ||
| <span id="cb125-5"><a href="#cb125-5" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span><span class="op">.</span><span class="fu">ExecuteNonQuery</span><span class="op">()</span></span></code></pre></div>
 | ||
| <h3 id="delete-1">DELETE</h3>
 | ||
| <div class="sourceCode" id="cb126"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb126-1"><a href="#cb126-1" aria-hidden="true" tabindex="-1"></a>Remove-Elasticsearch <span class="op">-</span>Connection <span class="va">$Elasticsearch</span> <span class="op">-</span>Table <span class="st">"Orders"</span> <span class="op">-</span>Id <span class="st">"MyId"</span></span>
 | ||
| <span id="cb126-2"><a href="#cb126-2" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb126-3"><a href="#cb126-3" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span> <span class="op">=</span>  <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">CData</span><span class="op">.</span><span class="fu">Elasticsearch</span><span class="op">.</span><span class="fu">ElasticsearchCommand</span><span class="op">(</span><span class="st">"DELETE FROM Orders WHERE Id=@myId"</span><span class="op">,</span> <span class="va">$conn</span><span class="op">)</span></span>
 | ||
| <span id="cb126-4"><a href="#cb126-4" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span><span class="op">.</span><span class="fu">Parameters</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span>new System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">CData</span><span class="op">.</span><span class="fu">Elasticsearch</span><span class="op">.</span><span class="fu">ElasticsearchParameter</span><span class="op">(</span><span class="st">"@myId"</span><span class="op">,</span><span class="st">"001d000000YBRseAAH"</span><span class="op">))</span></span>
 | ||
| <span id="cb126-5"><a href="#cb126-5" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span><span class="op">.</span><span class="fu">ExecuteNonQuery</span><span class="op">()</span></span></code></pre></div>
 | ||
| <h1 id="odbc">ODBC</h1>
 | ||
| <p><code>Get-Command -Module Wdac</code><br />
 | ||
| <code>Get-OdbcDriver | ft</code> список установленных драйверов</p>
 | ||
| <p>https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-client-apps-ps1.html</p>
 | ||
| <div class="sourceCode" id="cb127"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb127-1"><a href="#cb127-1" aria-hidden="true" tabindex="-1"></a><span class="va">$connectstring</span> <span class="op">=</span> <span class="st">"DSN=Local Elasticsearch;"</span></span>
 | ||
| <span id="cb127-2"><a href="#cb127-2" aria-hidden="true" tabindex="-1"></a><span class="va">$sql</span> <span class="op">=</span> <span class="st">"SELECT * FROM library"</span></span>
 | ||
| <span id="cb127-3"><a href="#cb127-3" aria-hidden="true" tabindex="-1"></a><span class="va">$conn</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">Odbc</span><span class="op">.</span><span class="fu">OdbcConnection</span><span class="op">(</span><span class="va">$connectstring</span><span class="op">)</span></span>
 | ||
| <span id="cb127-4"><a href="#cb127-4" aria-hidden="true" tabindex="-1"></a><span class="va">$conn</span><span class="op">.</span><span class="fu">open</span><span class="op">()</span></span>
 | ||
| <span id="cb127-5"><a href="#cb127-5" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span> <span class="op">=</span> <span class="fu">New-Object</span> system<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">Odbc</span><span class="op">.</span><span class="fu">OdbcCommand</span><span class="op">(</span><span class="va">$sql</span><span class="op">,</span><span class="va">$conn</span><span class="op">)</span></span>
 | ||
| <span id="cb127-6"><a href="#cb127-6" aria-hidden="true" tabindex="-1"></a><span class="va">$da</span> <span class="op">=</span> <span class="fu">New-Object</span> system<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">Odbc</span><span class="op">.</span><span class="fu">OdbcDataAdapter</span><span class="op">(</span><span class="va">$cmd</span><span class="op">)</span></span>
 | ||
| <span id="cb127-7"><a href="#cb127-7" aria-hidden="true" tabindex="-1"></a><span class="va">$dt</span> <span class="op">=</span> <span class="fu">New-Object</span> system<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">datatable</span></span>
 | ||
| <span id="cb127-8"><a href="#cb127-8" aria-hidden="true" tabindex="-1"></a><span class="va">$null</span> <span class="op">=</span> <span class="va">$da</span><span class="op">.</span><span class="fu">fill</span><span class="op">(</span><span class="va">$dt</span><span class="op">)</span></span>
 | ||
| <span id="cb127-9"><a href="#cb127-9" aria-hidden="true" tabindex="-1"></a><span class="va">$conn</span><span class="op">.</span><span class="fu">close</span><span class="op">()</span></span>
 | ||
| <span id="cb127-10"><a href="#cb127-10" aria-hidden="true" tabindex="-1"></a><span class="va">$dt</span></span></code></pre></div>
 | ||
| <h1 id="postgresql">PostgreSQL</h1>
 | ||
| <p>Скачать и установить драйвер:
 | ||
| https://www.postgresql.org/ftp/odbc/versions/msi/</p>
 | ||
| <div class="sourceCode" id="cb128"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb128-1"><a href="#cb128-1" aria-hidden="true" tabindex="-1"></a><span class="va">$dbServer</span> <span class="op">=</span> <span class="st">"192.168.3.101"</span></span>
 | ||
| <span id="cb128-2"><a href="#cb128-2" aria-hidden="true" tabindex="-1"></a><span class="va">$port</span> <span class="op">=</span> <span class="st">"5432"</span></span>
 | ||
| <span id="cb128-3"><a href="#cb128-3" aria-hidden="true" tabindex="-1"></a><span class="va">$dbName</span> <span class="op">=</span> <span class="st">"test"</span></span>
 | ||
| <span id="cb128-4"><a href="#cb128-4" aria-hidden="true" tabindex="-1"></a><span class="va">$dbUser</span> <span class="op">=</span> <span class="st">"admin"</span></span>
 | ||
| <span id="cb128-5"><a href="#cb128-5" aria-hidden="true" tabindex="-1"></a><span class="va">$dbPass</span> <span class="op">=</span> <span class="st">"admin"</span></span>
 | ||
| <span id="cb128-6"><a href="#cb128-6" aria-hidden="true" tabindex="-1"></a><span class="va">$szConnect</span> <span class="op">=</span> <span class="st">"Driver={PostgreSQL Unicode(x64)};Server=</span><span class="va">$dbServer</span><span class="st">;Port=</span><span class="va">$port</span><span class="st">;Database=</span><span class="va">$dbName</span><span class="st">;Uid=</span><span class="va">$dbUser</span><span class="st">;Pwd=</span><span class="va">$dbPass</span><span class="st">;"</span> </span>
 | ||
| <span id="cb128-7"><a href="#cb128-7" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb128-8"><a href="#cb128-8" aria-hidden="true" tabindex="-1"></a><span class="va">$cnDB</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">Odbc</span><span class="op">.</span><span class="fu">OdbcConnection</span><span class="op">(</span><span class="va">$szConnect</span><span class="op">)</span></span>
 | ||
| <span id="cb128-9"><a href="#cb128-9" aria-hidden="true" tabindex="-1"></a><span class="va">$dsDB</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">DataSet</span></span>
 | ||
| <span id="cb128-10"><a href="#cb128-10" aria-hidden="true" tabindex="-1"></a><span class="cf">try</span> <span class="op">{</span></span>
 | ||
| <span id="cb128-11"><a href="#cb128-11" aria-hidden="true" tabindex="-1"></a>    <span class="va">$cnDB</span><span class="op">.</span><span class="fu">Open</span><span class="op">()</span></span>
 | ||
| <span id="cb128-12"><a href="#cb128-12" aria-hidden="true" tabindex="-1"></a>    <span class="va">$adDB</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">Odbc</span><span class="op">.</span><span class="fu">OdbcDataAdapter</span></span>
 | ||
| <span id="cb128-13"><a href="#cb128-13" aria-hidden="true" tabindex="-1"></a>    <span class="va">$adDB</span><span class="op">.</span><span class="fu">SelectCommand</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">Odbc</span><span class="op">.</span><span class="fu">OdbcCommand</span><span class="op">(</span><span class="st">"SELECT id, name, age, login FROM public.users"</span> <span class="op">,</span> <span class="va">$cnDB</span><span class="op">)</span></span>
 | ||
| <span id="cb128-14"><a href="#cb128-14" aria-hidden="true" tabindex="-1"></a>    <span class="va">$adDB</span><span class="op">.</span><span class="fu">Fill</span><span class="op">(</span><span class="va">$dsDB</span><span class="op">)</span></span>
 | ||
| <span id="cb128-15"><a href="#cb128-15" aria-hidden="true" tabindex="-1"></a>    <span class="va">$cnDB</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span>
 | ||
| <span id="cb128-16"><a href="#cb128-16" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb128-17"><a href="#cb128-17" aria-hidden="true" tabindex="-1"></a><span class="cf">catch</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">Odbc</span><span class="op">.</span><span class="fu">OdbcException</span><span class="op">]</span> <span class="op">{</span></span>
 | ||
| <span id="cb128-18"><a href="#cb128-18" aria-hidden="true" tabindex="-1"></a>    <span class="va">$_</span><span class="op">.</span><span class="fu">Exception</span></span>
 | ||
| <span id="cb128-19"><a href="#cb128-19" aria-hidden="true" tabindex="-1"></a>    <span class="va">$_</span><span class="op">.</span><span class="fu">Exception</span><span class="op">.</span><span class="fu">Message</span></span>
 | ||
| <span id="cb128-20"><a href="#cb128-20" aria-hidden="true" tabindex="-1"></a>    <span class="va">$_</span><span class="op">.</span><span class="fu">Exception</span><span class="op">.</span><span class="fu">ItemName</span></span>
 | ||
| <span id="cb128-21"><a href="#cb128-21" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb128-22"><a href="#cb128-22" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$row</span> <span class="kw">in</span> <span class="va">$dsDB</span><span class="op">[</span><span class="dv">0</span><span class="op">].</span><span class="fu">Tables</span><span class="op">[</span><span class="dv">0</span><span class="op">].</span><span class="fu">Rows</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb128-23"><a href="#cb128-23" aria-hidden="true" tabindex="-1"></a>    <span class="va">$row</span><span class="op">.</span><span class="fu">login</span></span>
 | ||
| <span id="cb128-24"><a href="#cb128-24" aria-hidden="true" tabindex="-1"></a>    <span class="va">$row</span><span class="op">.</span><span class="fu">age</span></span>
 | ||
| <span id="cb128-25"><a href="#cb128-25" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <h1 id="wmi">WMI</h1>
 | ||
| <h3
 | ||
| id="wmicim-windows-management-instrumentationcommon-information-model">WMI/CIM
 | ||
| (Windows Management Instrumentation/Common Information Model)</h3>
 | ||
| <p><code>Get-WmiObjec -ComputerName localhost -Namespace root -class "__NAMESPACE" | select name,__namespace</code>
 | ||
| отобразить дочернии Namespace (логические иерархические группы)<br />
 | ||
| <code>Get-WmiObject -List</code> отобразить все классы пространства имен
 | ||
| “root” (по умолчанию), свойства (описывают конфигурацию и текущее
 | ||
| состояние управляемого ресурса) и их методы (какие действия позволяет
 | ||
| выполнить над этим ресурсом)<br />
 | ||
| <code>Get-WmiObject -List | Where-Object {$_.name -match "video"}</code>
 | ||
| поиск класса по имени, его свойств и методов<br />
 | ||
| <code>Get-WmiObject -ComputerName localhost -Class Win32_VideoController</code>
 | ||
| отобразить содержимое свойств класса</p>
 | ||
| <p><code>gwmi -List | where name -match "service" | ft -auto</code> если
 | ||
| в таблице присутствуют Methods, то можно взаимодействовать
 | ||
| {StartService, StopService}<br />
 | ||
| <code>gwmi -Class win32_service | select *</code> отобразить список всех
 | ||
| служб и всех их свойств<br />
 | ||
| <code>Get-CimInstance Win32_service</code> обращается на прямую к
 | ||
| “root”<br />
 | ||
| <code>gwmi win32_service -Filter "name='Zabbix Agent'"</code>
 | ||
| отфильтровать вывод по имени<br />
 | ||
| <code>(gwmi win32_service -Filter "name='Zabbix Agent'").State</code>
 | ||
| отобразить конкретное свойство<br />
 | ||
| <code>gwmi win32_service -Filter "State = 'Running'"</code>
 | ||
| отфильтровать запущенные службы<br />
 | ||
| <code>gwmi win32_service -Filter "StartMode = 'Auto'"</code>
 | ||
| отфильтровать службы по методу запуска<br />
 | ||
| <code>gwmi -Query 'select * from win32_service where startmode="Auto"'</code>
 | ||
| WQL-запрос (WMI Query Language)<br />
 | ||
| <code>gwmi win32_service | Get-Member -MemberType Method</code>
 | ||
| отобразить все методы взаимодействия с описание применения (Delete,
 | ||
| StartService)<br />
 | ||
| <code>(gwmi win32_service -Filter 'name="Zabbix Agent"').Delete()</code>
 | ||
| удалить службу<br />
 | ||
| <code>(gwmi win32_service -Filter 'name="MSSQL$MSSQLE"').StartService()</code>
 | ||
| запустить службу</p>
 | ||
| <p><code>Get-CimInstance -ComputerName $srv Win32_OperatingSystem | select LastBootUpTime</code>
 | ||
| время последнего включения<br />
 | ||
| <code>gwmi -ComputerName $srv -Class Win32_OperatingSystem | select LocalDateTime,LastBootUpTime</code>
 | ||
| текущее время и время последнего включения<br />
 | ||
| <code>gwmi Win32_OperatingSystem | Get-Member -MemberType Method</code>
 | ||
| методы reboot и shutdown<br />
 | ||
| <code>(gwmi Win32_OperatingSystem -EnableAllPrivileges).Reboot()</code>
 | ||
| используется с ключем повышения привелегий<br />
 | ||
| <code>(gwmi Win32_OperatingSystem -EnableAllPrivileges).Win32Shutdown(0)</code>
 | ||
| завершение сеанса пользователя</p>
 | ||
| <div class="sourceCode" id="cb129"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb129-1"><a href="#cb129-1" aria-hidden="true" tabindex="-1"></a><span class="va">$system</span> <span class="op">=</span> <span class="fu">Get-WmiObject</span> <span class="op">-</span>Class Win32_OperatingSystem</span>
 | ||
| <span id="cb129-2"><a href="#cb129-2" aria-hidden="true" tabindex="-1"></a><span class="va">$InstallDate</span> <span class="op">=</span> <span class="op">[</span>Management<span class="op">.</span><span class="fu">ManagementDateTimeconverter</span><span class="op">]::</span>ToDateTime<span class="op">(</span><span class="va">$system</span><span class="op">.</span><span class="fu">installdate</span><span class="op">)</span><span class="ch">` </span>Получаем дату установки ОС</span>
 | ||
| <span id="cb129-3"><a href="#cb129-3" aria-hidden="true" tabindex="-1"></a><span class="va">$AfterInstallDays</span> <span class="op">=</span> <span class="op">((</span><span class="fu">Get-Date</span><span class="op">)</span> — <span class="va">$Installdate</span><span class="op">).</span><span class="fu">Days</span><span class="ch">` </span>Вычисляем время<span class="op">,</span> прошедшее с момента установки</span>
 | ||
| <span id="cb129-4"><a href="#cb129-4" aria-hidden="true" tabindex="-1"></a><span class="va">$ShortInstallDate</span> <span class="op">=</span> <span class="st">"{0:yyyy-MM-dd HH:MM}"</span> <span class="op">-</span>f <span class="op">(</span><span class="va">$InstallDate</span><span class="op">)</span></span>
 | ||
| <span id="cb129-5"><a href="#cb129-5" aria-hidden="true" tabindex="-1"></a><span class="st">"Система установлена: </span><span class="va">$ShortInstallDate</span><span class="st"> (Прошло </span><span class="va">$AfterInstalldays</span><span class="st"> дней)"</span></span></code></pre></div>
 | ||
| <p><code>(Get-WmiObject win32_battery).estimatedChargeRemaining</code>
 | ||
| заряд батареи в процентах<br />
 | ||
| <code>gwmi Win32_UserAccount</code> доменные пользователи<br />
 | ||
| <code>(gwmi Win32_SystemUsers).PartComponent</code><br />
 | ||
| <code>Get-CimInstance -ClassName Win32_LogonSession</code><br />
 | ||
| <code>Get-CimInstance -ClassName Win32_BIOS</code></p>
 | ||
| <p><code>gwmi -list -Namespace root\CIMV2\Terminalservices</code><br />
 | ||
| <code>(gwmi -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).AllowTSConnections</code><br />
 | ||
| <code>(gwmi -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).SetAllowTSConnections(1)</code>
 | ||
| включить RDP</p>
 | ||
| <pre><code>$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))+" %"}}</code></pre>
 | ||
| <h3 id="nla-network-level-authentication">NLA (Network Level
 | ||
| Authentication)</h3>
 | ||
| <p><code>(gwmi -class "Win32_TSGeneralSetting" -Namespace root\cimv2\Terminalservices -Filter "TerminalName='RDP-tcp'").UserAuthenticationRequired</code><br />
 | ||
| <code>(gwmi -class "Win32_TSGeneralSetting" -Namespace root\cimv2\Terminalservices -Filter "TerminalName='RDP-tcp'").SetUserAuthenticationRequired(1)</code>
 | ||
| включить NLA<br />
 | ||
| <code>Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name SecurityLayer</code>
 | ||
| отобразить значение (2)<br />
 | ||
| <code>Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name UserAuthentication</code>
 | ||
| отобразить значение (1)<br />
 | ||
| <code>Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name SecurityLayer -Value 0</code>
 | ||
| изменить значение<br />
 | ||
| <code>Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name UserAuthentication -Value 0</code><br />
 | ||
| <code>REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters /v AllowEncryptionOracle /t REG_DWORD /d 2</code>
 | ||
| отключить на клиентском компьютере проверку версии CredSSP, если на
 | ||
| целевом комьютере-сервере не установлены обновления KB4512509 от мая
 | ||
| 2018 года</p>
 | ||
| <h1 id="regedit">Regedit</h1>
 | ||
| <p><code>Get-PSDrive</code> список всех доступных дисков/разделов, их
 | ||
| размер и веток реестра<br />
 | ||
| <code>cd HKLM:\</code> HKEY_LOCAL_MACHINE<br />
 | ||
| <code>cd HKCU:\</code> HKEY_CURRENT_USER<br />
 | ||
| <code>Get-Item</code> получить информацию о ветке реестра<br />
 | ||
| <code>New-Item</code> создать новый раздел реестра<br />
 | ||
| <code>Remove-Item</code> удалить ветку реестра<br />
 | ||
| <code>Get-ItemProperty</code> получить значение ключей/параметров
 | ||
| реестра (это свойства ветки реестра, аналогично свойствам файла)<br />
 | ||
| <code>Set-ItemProperty</code> изменить название или значение параметра
 | ||
| реестра<br />
 | ||
| <code>New-ItemProperty</code> создать параметр реестра<br />
 | ||
| <code>Remove-ItemProperty</code> удалить параметр</p>
 | ||
| <p><code>Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select DisplayName</code>
 | ||
| список установленных программ<br />
 | ||
| <code>Get-Item HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002</code>
 | ||
| посмотреть содержимое Items<br />
 | ||
| <code>(Get-ItemProperty HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002)."New Signature"</code>
 | ||
| отобразить значение (Value) свойства (Property) Items<br />
 | ||
| <code>$reg_path = "HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002"</code><br />
 | ||
| <code>$sig_name = "auto"</code><br />
 | ||
| <code>Set-ItemProperty -Path $reg_path -Name "New Signature" -Value $sig_name</code>
 | ||
| изменить или добавить в корне ветки (Path) свойство (Name) со значением
 | ||
| (Value)<br />
 | ||
| <code>Set-ItemProperty -Path $reg_path -Name "Reply-Forward Signature" -Value $sig_name</code></p>
 | ||
| <pre><code>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\""</code></pre>
 | ||
| <h1 id="performance">Performance</h1>
 | ||
| <p><code>lodctr /R</code> пересоздать счетчиков производительности из
 | ||
| системного хранилища архивов (так же исправляет счетчики для CIM,
 | ||
| например, для cpu Win32_PerfFormattedData_PerfOS_Processor и iops
 | ||
| Win32_PerfFormattedData_PerfDisk_PhysicalDisk)<br />
 | ||
| <code>(Get-Counter -ListSet *).CounterSetName</code> вывести список всех
 | ||
| доступных счетчиков производительности в системе<br />
 | ||
| <code>(Get-Counter -ListSet *memory*).Counter</code> поиск по
 | ||
| wildcard-имени во всех счетчиках (включая дочернии)<br />
 | ||
| <code>Get-Counter "\Memory\Available MBytes"</code> объем свободной
 | ||
| оперативной памяти<br />
 | ||
| <code>Get-Counter -cn $srv "\LogicalDisk(*)\% Free Space"</code> %
 | ||
| свободного места на всех разделах дисков<br />
 | ||
| <code>(Get-Counter "\Process(*)\ID Process").CounterSamples</code><br />
 | ||
| <code>Get-Counter "\Processor(_Total)\% Processor Time" –ComputerName $srv -MaxSamples 5 -SampleInterval 2</code>
 | ||
| 5 проверок каждые 2 секунды<br />
 | ||
| <code>Get-Counter "\Процессор(_Total)\% загруженности процессора" -Continuous</code>
 | ||
| непрерывно<br />
 | ||
| <code>(Get-Counter "\Процессор(*)\% загруженности процессора").CounterSamples</code></p>
 | ||
| <p><code>(Get-Counter -ListSet *интерфейс*).Counter</code> найти все
 | ||
| счетчики<br />
 | ||
| <code>Get-Counter "\Сетевой интерфейс(*)\Всего байт/с"</code> отобразить
 | ||
| все адаптеры (выбрать действующий по трафику)</p>
 | ||
| <div class="sourceCode" id="cb132"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb132-1"><a href="#cb132-1" aria-hidden="true" tabindex="-1"></a><span class="va">$WARNING</span> <span class="op">=</span> <span class="dv">25</span></span>
 | ||
| <span id="cb132-2"><a href="#cb132-2" aria-hidden="true" tabindex="-1"></a><span class="va">$CRITICAL</span> <span class="op">=</span> <span class="dv">50</span></span>
 | ||
| <span id="cb132-3"><a href="#cb132-3" aria-hidden="true" tabindex="-1"></a><span class="va">$TransferRate</span> <span class="op">=</span> <span class="op">((</span><span class="fu">Get-Counter</span> <span class="st">"\\huawei-mb-x-pro\сетевой интерфейс(intel[r] wi-fi 6e ax211 160mhz)\всего байт/с"</span></span>
 | ||
| <span id="cb132-4"><a href="#cb132-4" aria-hidden="true" tabindex="-1"></a><span class="op">).</span><span class="fu">countersamples</span> <span class="op">|</span> <span class="fu">select</span> <span class="op">-</span>ExpandProperty CookedValue<span class="op">)*</span><span class="dv">8</span></span>
 | ||
| <span id="cb132-5"><a href="#cb132-5" aria-hidden="true" tabindex="-1"></a><span class="va">$NetworkUtilisation</span> <span class="op">=</span> <span class="op">[</span>math<span class="op">]::</span>round<span class="op">(</span><span class="va">$TransferRate</span><span class="op">/</span><span class="dv">1000000000</span><span class="op">*</span><span class="dv">100</span><span class="op">,</span><span class="dv">2</span><span class="op">)</span></span>
 | ||
| <span id="cb132-6"><a href="#cb132-6" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$NetworkUtilisation</span> <span class="op">-gt</span> <span class="va">$CRITICAL</span><span class="op">){</span></span>
 | ||
| <span id="cb132-7"><a href="#cb132-7" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Output</span> <span class="st">"CRITICAL: </span><span class="op">$(</span><span class="va">$NetworkUtilisation</span><span class="op">)</span><span class="st"> % Network utilisation, </span><span class="op">$(</span><span class="va">$TransferRate</span><span class="op">.</span><span class="fu">ToString</span><span class="op">(</span><span class="st">'N0'</span><span class="op">)</span><span class="st">) b/s"</span>   </span>
 | ||
| <span id="cb132-8"><a href="#cb132-8" aria-hidden="true" tabindex="-1"></a><span class="co">#exit 2     </span></span>
 | ||
| <span id="cb132-9"><a href="#cb132-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb132-10"><a href="#cb132-10" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$NetworkUtilisation</span> <span class="op">-gt</span> <span class="va">$WARNING</span><span class="op">){</span></span>
 | ||
| <span id="cb132-11"><a href="#cb132-11" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Output</span> <span class="st">"WARNING: </span><span class="op">$(</span><span class="va">$NetworkUtilisation</span><span class="op">)</span><span class="st"> % Network utilisation, </span><span class="op">$(</span><span class="va">$TransferRate</span><span class="op">.</span><span class="fu">ToString</span><span class="op">(</span><span class="st">'N0'</span><span class="op">)</span><span class="st">) b/s"</span></span>
 | ||
| <span id="cb132-12"><a href="#cb132-12" aria-hidden="true" tabindex="-1"></a><span class="co">#exit 1</span></span>
 | ||
| <span id="cb132-13"><a href="#cb132-13" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb132-14"><a href="#cb132-14" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Output</span> <span class="st">"OK: </span><span class="op">$(</span><span class="va">$NetworkUtilisation</span><span class="op">)</span><span class="st"> % Network utilisation, </span><span class="op">$(</span><span class="va">$TransferRate</span><span class="op">.</span><span class="fu">ToString</span><span class="op">(</span><span class="st">'N0'</span><span class="op">)</span><span class="st">) b/s"</span>   </span>
 | ||
| <span id="cb132-15"><a href="#cb132-15" aria-hidden="true" tabindex="-1"></a><span class="co">#exit 0</span></span></code></pre></div>
 | ||
| <h1 id="snmp">SNMP</h1>
 | ||
| <h3 id="setup-snmp-service">Setup SNMP Service</h3>
 | ||
| <p><code>Install-WindowsFeature SNMP-Service,SNMP-WMI-Provider -IncludeManagementTools</code>
 | ||
| установить роль SNMP и WMI провайдер через Server Manager<br />
 | ||
| <code>Get-WindowsFeature SNMP*</code><br />
 | ||
| <code>Add-WindowsCapability -Online -Name SNMP.Client~~~~0.0.1.0</code>
 | ||
| установить компонент Feature On Demand для Windows
 | ||
| 10/11<code>\</code>Get-Service SNMP<em><code>\</code>Get-NetFirewallrule
 | ||
| -DisplayName </em>snmp* | ft<code>\</code>Get-NetFirewallrule
 | ||
| -DisplayName <em>snmp</em> | Enable-NetFirewallRule`</p>
 | ||
| <h3 id="setting-snmp-service-via-regedit">Setting SNMP Service via
 | ||
| Regedit</h3>
 | ||
| <p>Agent:<br />
 | ||
| <code>New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\RFC1156Agent" -Name "sysContact" -Value "lifailon-user"</code>
 | ||
| создать (New) или изменить (Set)<br />
 | ||
| <code>New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\RFC1156Agent" -Name "sysLocation" -Value "plex-server"</code></p>
 | ||
| <p>Security:<br />
 | ||
| <code>New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\public"</code>
 | ||
| создать новый community string<br />
 | ||
| <code>New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\ValidCommunities" -Name "public" -Value 16</code>
 | ||
| назначить права на public<br />
 | ||
| <code>1 — NONE</code><br />
 | ||
| <code>2 — NOTIFY</code> позволяет получать SNMP ловушки<br />
 | ||
| <code>4 — READ ONLY</code> позволяет получать данные с устройства<br />
 | ||
| <code>8 — READ WRITE</code> позволяет получать данные и изменять
 | ||
| конфигурацию устройства<br />
 | ||
| <code>16 — READ CREATE</code> позволяет читать данные, изменять и
 | ||
| создавать объекты<br />
 | ||
| <code>New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\PermittedManagers" -Name "1" -Value "192.168.3.99"</code>
 | ||
| от кого разрешено принимать запросы<br />
 | ||
| <code>Get-Service SNMP | Restart-Service</code></p>
 | ||
| <h3 id="snmpwalk">snmpwalk</h3>
 | ||
| <p><code>snmpwalk -v 2c -c public 192.168.3.100</code><br />
 | ||
| <code>snmpwalk -v 2c -c public -O e 192.168.3.100</code></p>
 | ||
| <h3 id="modules">Modules</h3>
 | ||
| <p><code>Install-Module -Name SNMP</code><br />
 | ||
| <code>Get-SnmpData -IP 192.168.3.100 -OID 1.3.6.1.2.1.1.4.0 -UDPport 161 -Community public</code><br />
 | ||
| <code>(Get-SnmpData -IP 192.168.3.100 -OID 1.3.6.1.2.1.1.4.0).Data</code><br />
 | ||
| <code>Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.1</code>
 | ||
| пройтись по дереву OID<br />
 | ||
| <code>Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.25.6.3.1.2</code>
 | ||
| список установленного ПО<br />
 | ||
| <code>Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.25.2.3.1</code>
 | ||
| список разделов и памяти (C: D: Virtual Memory и Physical Memory)<br />
 | ||
| <code>Set-SnmpData</code> изменение данных на удаленном устройстве</p>
 | ||
| <p><code>Install-Module -Name SNMPv3</code><br />
 | ||
| <code>Invoke-SNMPv3Get</code> получение данных по одному OID<br />
 | ||
| <code>Invoke-SNMPv3Set</code> изменение данных<br />
 | ||
| <code>Invoke-SNMPv3Walk</code> обход по дереву OID<br />
 | ||
| <code>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</code></p>
 | ||
| <h3 id="lextm.sharpsnmplib">Lextm.SharpSnmpLib</h3>
 | ||
| <p>https://api.nuget.org/v3-flatcontainer/lextm.sharpsnmplib/12.5.2/lextm.sharpsnmplib.12.5.2.nupkg<br />
 | ||
| <code>Add-Type -LiteralPath "$home\Desktop\lextm.sharpsnmplib-12.5.2\net471\SharpSnmpLib.dll"</code></p>
 | ||
| <div class="sourceCode" id="cb133"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb133-1"><a href="#cb133-1" aria-hidden="true" tabindex="-1"></a><span class="va">$port</span> <span class="op">=</span> <span class="dv">161</span></span>
 | ||
| <span id="cb133-2"><a href="#cb133-2" aria-hidden="true" tabindex="-1"></a><span class="va">$OID</span> <span class="op">=</span> <span class="st">"1.3.6.1.2.1.1.4.0"</span></span>
 | ||
| <span id="cb133-3"><a href="#cb133-3" aria-hidden="true" tabindex="-1"></a><span class="va">$variableList</span> <span class="op">=</span> <span class="fu">New-Object</span> Collections<span class="op">.</span><span class="fu">Generic</span><span class="op">.</span><span class="fu">List</span><span class="op">[</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">Variable</span><span class="op">]</span></span>
 | ||
| <span id="cb133-4"><a href="#cb133-4" aria-hidden="true" tabindex="-1"></a><span class="va">$variableList</span><span class="op">.</span><span class="fu">Add</span><span class="op">([</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">Variable</span><span class="op">]::</span>new<span class="op">([</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">ObjectIdentifier</span><span class="op">]::</span>new<span class="op">(</span><span class="va">$OID</span><span class="op">)))</span></span>
 | ||
| <span id="cb133-5"><a href="#cb133-5" aria-hidden="true" tabindex="-1"></a><span class="va">$timeout</span> <span class="op">=</span> <span class="dv">3000</span></span>
 | ||
| <span id="cb133-6"><a href="#cb133-6" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Net<span class="op">.</span><span class="fu">IPAddress</span><span class="op">]</span><span class="va">$ip</span> <span class="op">=</span> <span class="st">"192.168.3.100"</span></span>
 | ||
| <span id="cb133-7"><a href="#cb133-7" aria-hidden="true" tabindex="-1"></a><span class="va">$endpoint</span> <span class="op">=</span> <span class="fu">New-Object</span> Net<span class="op">.</span><span class="fu">IpEndPoint</span> <span class="va">$ip</span><span class="op">,</span> <span class="va">$port</span></span>
 | ||
| <span id="cb133-8"><a href="#cb133-8" aria-hidden="true" tabindex="-1"></a><span class="va">$Community</span> <span class="op">=</span> <span class="st">"public"</span></span>
 | ||
| <span id="cb133-9"><a href="#cb133-9" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">VersionCode</span><span class="op">]</span><span class="va">$Version</span> <span class="op">=</span> <span class="st">"V2"</span></span>
 | ||
| <span id="cb133-10"><a href="#cb133-10" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb133-11"><a href="#cb133-11" aria-hidden="true" tabindex="-1"></a><span class="va">$message</span> <span class="op">=</span> <span class="op">[</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">Messaging</span><span class="op">.</span><span class="fu">Messenger</span><span class="op">]::</span>Get<span class="op">(</span></span>
 | ||
| <span id="cb133-12"><a href="#cb133-12" aria-hidden="true" tabindex="-1"></a><span class="va">$Version</span><span class="op">,</span></span>
 | ||
| <span id="cb133-13"><a href="#cb133-13" aria-hidden="true" tabindex="-1"></a><span class="va">$endpoint</span><span class="op">,</span></span>
 | ||
| <span id="cb133-14"><a href="#cb133-14" aria-hidden="true" tabindex="-1"></a><span class="va">$Community</span><span class="op">,</span></span>
 | ||
| <span id="cb133-15"><a href="#cb133-15" aria-hidden="true" tabindex="-1"></a><span class="va">$variableList</span><span class="op">,</span></span>
 | ||
| <span id="cb133-16"><a href="#cb133-16" aria-hidden="true" tabindex="-1"></a><span class="va">$TimeOut</span></span>
 | ||
| <span id="cb133-17"><a href="#cb133-17" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
 | ||
| <span id="cb133-18"><a href="#cb133-18" aria-hidden="true" tabindex="-1"></a><span class="va">$message</span><span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">ToString</span><span class="op">()</span></span></code></pre></div>
 | ||
| <h3 id="walk">Walk</h3>
 | ||
| <div class="sourceCode" id="cb134"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb134-1"><a href="#cb134-1" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">ObjectIdentifier</span><span class="op">]</span><span class="va">$OID</span> <span class="op">=</span> <span class="st">"1.3.6.1.2.1.1"</span> <span class="co"># дерево или конечный OID</span></span>
 | ||
| <span id="cb134-2"><a href="#cb134-2" aria-hidden="true" tabindex="-1"></a><span class="va">$WalkMode</span> <span class="op">=</span> <span class="op">[</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">Messaging</span><span class="op">.</span><span class="fu">WalkMode</span><span class="op">]::</span>WithinSubtree <span class="co"># режим обхода по дереву</span></span>
 | ||
| <span id="cb134-3"><a href="#cb134-3" aria-hidden="true" tabindex="-1"></a><span class="va">$results</span> <span class="op">=</span> <span class="fu">New-Object</span> Collections<span class="op">.</span><span class="fu">Generic</span><span class="op">.</span><span class="fu">List</span><span class="op">[</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">Variable</span><span class="op">]</span></span>
 | ||
| <span id="cb134-4"><a href="#cb134-4" aria-hidden="true" tabindex="-1"></a><span class="va">$message</span> <span class="op">=</span> <span class="op">[</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">Messaging</span><span class="op">.</span><span class="fu">Messenger</span><span class="op">]::</span>Walk<span class="op">(</span></span>
 | ||
| <span id="cb134-5"><a href="#cb134-5" aria-hidden="true" tabindex="-1"></a>  <span class="va">$Version</span><span class="op">,</span></span>
 | ||
| <span id="cb134-6"><a href="#cb134-6" aria-hidden="true" tabindex="-1"></a>  <span class="va">$endpoint</span><span class="op">,</span></span>
 | ||
| <span id="cb134-7"><a href="#cb134-7" aria-hidden="true" tabindex="-1"></a>  <span class="va">$Community</span><span class="op">,</span></span>
 | ||
| <span id="cb134-8"><a href="#cb134-8" aria-hidden="true" tabindex="-1"></a>  <span class="va">$OID</span><span class="op">,</span></span>
 | ||
| <span id="cb134-9"><a href="#cb134-9" aria-hidden="true" tabindex="-1"></a>  <span class="va">$results</span><span class="op">,</span></span>
 | ||
| <span id="cb134-10"><a href="#cb134-10" aria-hidden="true" tabindex="-1"></a>  <span class="va">$TimeOut</span><span class="op">,</span></span>
 | ||
| <span id="cb134-11"><a href="#cb134-11" aria-hidden="true" tabindex="-1"></a>  <span class="va">$WalkMode</span></span>
 | ||
| <span id="cb134-12"><a href="#cb134-12" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
 | ||
| <span id="cb134-13"><a href="#cb134-13" aria-hidden="true" tabindex="-1"></a><span class="va">$results</span></span>
 | ||
| <span id="cb134-14"><a href="#cb134-14" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb134-15"><a href="#cb134-15" aria-hidden="true" tabindex="-1"></a><span class="va">$results2</span> <span class="op">=</span> <span class="op">@()</span></span>
 | ||
| <span id="cb134-16"><a href="#cb134-16" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$d</span> <span class="kw">in</span> <span class="va">$results</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb134-17"><a href="#cb134-17" aria-hidden="true" tabindex="-1"></a><span class="va">$results2</span> <span class="op">+=[</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span><span class="st">'ID'</span><span class="op">=</span><span class="va">$d</span><span class="op">.</span><span class="fu">id</span><span class="op">.</span><span class="fu">ToString</span><span class="op">();</span><span class="st">'Data'</span><span class="op">=</span><span class="va">$d</span><span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">ToString</span><span class="op">()}</span> <span class="co"># перекодировать вывод построчно в строку</span></span>
 | ||
| <span id="cb134-18"><a href="#cb134-18" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb134-19"><a href="#cb134-19" aria-hidden="true" tabindex="-1"></a><span class="va">$results2</span></span></code></pre></div>
 | ||
| <h1 id="zabbix">Zabbix</h1>
 | ||
| <h3 id="zabbix-agent-deploy">Zabbix Agent Deploy</h3>
 | ||
| <div class="sourceCode" id="cb135"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb135-1"><a href="#cb135-1" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="st">"https://cdn.zabbix.com/zabbix/binaries/stable/6.4/6.4.5/zabbix_agent2-6.4.5-windows-amd64-static.zip"</span></span>
 | ||
| <span id="cb135-2"><a href="#cb135-2" aria-hidden="true" tabindex="-1"></a><span class="va">$path</span> <span class="op">=</span> <span class="st">"</span><span class="va">$home</span><span class="st">\Downloads\zabbix-agent2-6.4.5.zip"</span></span>
 | ||
| <span id="cb135-3"><a href="#cb135-3" aria-hidden="true" tabindex="-1"></a><span class="va">$WebClient</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">WebClient</span></span>
 | ||
| <span id="cb135-4"><a href="#cb135-4" aria-hidden="true" tabindex="-1"></a><span class="va">$WebClient</span><span class="op">.</span><span class="fu">DownloadFile</span><span class="op">(</span><span class="va">$url</span><span class="op">,</span> <span class="va">$path</span><span class="op">)</span><span class="ch">` </span>скачать файл</span>
 | ||
| <span id="cb135-5"><a href="#cb135-5" aria-hidden="true" tabindex="-1"></a>Expand-Archive <span class="va">$path</span> <span class="op">-</span>DestinationPath <span class="st">"C:\zabbix-agent2-6.4.5\"</span><span class="ch">` </span>разархивировать</span>
 | ||
| <span id="cb135-6"><a href="#cb135-6" aria-hidden="true" tabindex="-1"></a><span class="fu">Remove-Item</span> <span class="va">$path</span><span class="ch">` </span>удалить архив</span>
 | ||
| <span id="cb135-7"><a href="#cb135-7" aria-hidden="true" tabindex="-1"></a>New-NetFirewallRule <span class="op">-</span>DisplayName <span class="st">"Zabbix-Agent"</span> <span class="op">-</span>Profile Any <span class="op">-</span>Direction Inbound <span class="op">-</span>Action Allow <span class="op">-</span>Protocol TCP <span class="op">-</span>LocalPort <span class="dv">10050</span><span class="op">,</span><span class="dv">10051</span><span class="ch">` </span>открыть порты в <span class="fu">FW</span></span>
 | ||
| <span id="cb135-8"><a href="#cb135-8" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb135-9"><a href="#cb135-9" aria-hidden="true" tabindex="-1"></a><span class="va">$Zabbix_Server</span> <span class="op">=</span> <span class="st">"192.168.3.102"</span></span>
 | ||
| <span id="cb135-10"><a href="#cb135-10" aria-hidden="true" tabindex="-1"></a><span class="va">$conf</span> <span class="op">=</span> <span class="st">"C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.conf"</span></span>
 | ||
| <span id="cb135-11"><a href="#cb135-11" aria-hidden="true" tabindex="-1"></a><span class="va">$cat</span> <span class="op">=</span> <span class="fu">cat</span> <span class="va">$conf</span></span>
 | ||
| <span id="cb135-12"><a href="#cb135-12" aria-hidden="true" tabindex="-1"></a><span class="va">$rep</span> <span class="op">=</span> <span class="va">$cat</span> <span class="op">-replace</span> <span class="st">"Server=.+"</span><span class="op">,</span><span class="st">"Server=</span><span class="va">$Zabbix_Server</span><span class="st">"</span></span>
 | ||
| <span id="cb135-13"><a href="#cb135-13" aria-hidden="true" tabindex="-1"></a><span class="va">$rep</span> <span class="op">|</span> <span class="fu">Select-String</span> Server<span class="op">=</span></span>
 | ||
| <span id="cb135-14"><a href="#cb135-14" aria-hidden="true" tabindex="-1"></a><span class="va">$rep</span> <span class="op">></span> <span class="va">$conf</span></span>
 | ||
| <span id="cb135-15"><a href="#cb135-15" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb135-16"><a href="#cb135-16" aria-hidden="true" tabindex="-1"></a><span class="va">$exe</span> <span class="op">=</span> <span class="st">"C:\zabbix-agent2-6.4.5\bin\zabbix_agent2.exe"</span></span>
 | ||
| <span id="cb135-17"><a href="#cb135-17" aria-hidden="true" tabindex="-1"></a><span class="op">.</span><span class="va">$exe</span> <span class="op">--</span>config <span class="va">$conf</span> <span class="op">--</span>install<span class="ch">` </span>установить службу</span>
 | ||
| <span id="cb135-18"><a href="#cb135-18" aria-hidden="true" tabindex="-1"></a><span class="fu">Get-Service</span> <span class="op">*</span>Zabbix<span class="op">*</span>Agent<span class="op">*</span> <span class="op">|</span> Start-Service<span class="ch">` </span>запустить службу</span>
 | ||
| <span id="cb135-19"><a href="#cb135-19" aria-hidden="true" tabindex="-1"></a><span class="co">#.$exe --config $conf --uninstall` удалить службу</span></span></code></pre></div>
 | ||
| <h3 id="zabbix_sender">zabbix_sender</h3>
 | ||
| <p>Создать host - задать произвольное имя (powershell-host) и добавить в
 | ||
| группу<br />
 | ||
| Создать Items:<br />
 | ||
| Name: Service Count<br />
 | ||
| Type: Zabbix trapper<br />
 | ||
| Key: service.count<br />
 | ||
| Type of Information: Numeric</p>
 | ||
| <div class="sourceCode" id="cb136"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb136-1"><a href="#cb136-1" aria-hidden="true" tabindex="-1"></a><span class="va">$path</span> <span class="op">=</span> <span class="st">"C:\zabbix-agent2-6.4.5\bin"</span></span>
 | ||
| <span id="cb136-2"><a href="#cb136-2" aria-hidden="true" tabindex="-1"></a><span class="va">$scount</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Service</span><span class="op">).</span><span class="fu">Count</span></span>
 | ||
| <span id="cb136-3"><a href="#cb136-3" aria-hidden="true" tabindex="-1"></a><span class="op">.</span><span class="va">$path</span>\zabbix_sender<span class="op">.</span><span class="fu">exe</span> <span class="op">-</span>z <span class="dv">192.168</span><span class="op">.</span><span class="dv">3.102</span> <span class="op">-</span>s <span class="st">"powershell-host"</span> <span class="op">-</span>k service<span class="op">.</span><span class="fu">count</span> <span class="op">-</span>o <span class="va">$scount</span></span></code></pre></div>
 | ||
| <h3 id="zabbix_get">zabbix_get</h3>
 | ||
| <p><code>apt install zabbix-get</code><br />
 | ||
| <code>nano /etc/zabbix/zabbix_agentd.conf</code><br />
 | ||
| <code>Server=127.0.0.1,192.168.3.102,192.168.3.99</code> добавить
 | ||
| сервера для получения данных zabbix_get с агента (как их запрашивает
 | ||
| сервер)</p>
 | ||
| <p><code>.$path\zabbix_get -s 192.168.3.101 -p 10050 -k agent.version</code>
 | ||
| проверить версию агента<br />
 | ||
| <code>.$path\zabbix_get -s 192.168.3.101 -p 10050 -k agent.ping</code> 1
 | ||
| - ok<br />
 | ||
| <code>.$path\zabbix_get -s 192.168.3.101 -p 10050 -k net.if.discovery</code>
 | ||
| список сетевых интерфейсов<br />
 | ||
| <code>.$path\zabbix_get -s 192.168.3.101 -p 10050 -k net.if.in["ens33"]</code><br />
 | ||
| <code>.$path\zabbix_get -s 192.168.3.101 -p 10050 -k net.if.out["ens33"]</code></p>
 | ||
| <h3 id="userparameter">UserParameter</h3>
 | ||
| <p><code>UserParameter=process.count,powershell -Command "(Get-Process).Count"</code><br />
 | ||
| <code>UserParameter=process.vm[*],powershell -Command "(Get-Process $1).ws"</code></p>
 | ||
| <p>Test:<br />
 | ||
| <code>C:\zabbix-agent2-6.4.5\bin\zabbix_get.exe -s 127.0.0.1 -p 10050 -k process.count</code><br />
 | ||
| <code>C:\zabbix-agent2-6.4.5\bin\zabbix_get.exe -s 127.0.0.1 -p 10050 -k process.vm[zabbix_agent2]</code><br />
 | ||
| <code>C:\zabbix-agent2-6.4.5\bin\zabbix_get.exe -s 127.0.0.1 -p 10050 -k process.vm[powershell]</code></p>
 | ||
| <p>Создать новые Items:<br />
 | ||
| key: <code>process.count</code><br />
 | ||
| key: <code>process.vm[zabbix_agent2]</code></p>
 | ||
| <h3 id="include">Include</h3>
 | ||
| <ul>
 | ||
| <li><p>Добавить параметр Include для включения конфигурационных файлов
 | ||
| подключаемых плагинов
 | ||
| <code>'Include=.\zabbix_agent2.d\plugins.d\*.conf' >> C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.conf</code></p></li>
 | ||
| <li><p>Создать конфигурационный файл с пользовательскими параметрами в
 | ||
| каталоге, путь к которому указан в zabbix_agentd.conf<br />
 | ||
| <code>'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</code></p></li>
 | ||
| <li><p>Поместить скрипт Get-Query-Param.ps1 в каталог, путь к которому
 | ||
| указан в User-Sessions.conf. Скрипт содержим пользовательские параметры,
 | ||
| которые он принимает от Zabbix сервера для передачи их в функции
 | ||
| скрипта.</p></li>
 | ||
| </ul>
 | ||
| <div class="sourceCode" id="cb137"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb137-1"><a href="#cb137-1" aria-hidden="true" tabindex="-1"></a><span class="kw">Param</span><span class="op">([</span><span class="dt">string</span><span class="op">]</span><span class="va">$select</span><span class="op">)</span></span>
 | ||
| <span id="cb137-2"><a href="#cb137-2" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$select</span> <span class="op">-eq</span> <span class="st">"ACTIVEUSER"</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb137-3"><a href="#cb137-3" aria-hidden="true" tabindex="-1"></a><span class="op">(</span>Get-Query <span class="op">|</span> <span class="fu">where</span> status <span class="op">-match</span> <span class="st">"Active"</span><span class="op">).</span><span class="fu">User</span></span>
 | ||
| <span id="cb137-4"><a href="#cb137-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb137-5"><a href="#cb137-5" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$select</span> <span class="op">-eq</span> <span class="st">"INACTIVEUSER"</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb137-6"><a href="#cb137-6" aria-hidden="true" tabindex="-1"></a><span class="op">(</span>Get-Query <span class="op">|</span> <span class="fu">where</span> status <span class="op">-match</span> <span class="st">"Disconnect"</span><span class="op">).</span><span class="fu">User</span></span>
 | ||
| <span id="cb137-7"><a href="#cb137-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb137-8"><a href="#cb137-8" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$select</span> <span class="op">-eq</span> <span class="st">"ACTIVECOUNT"</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb137-9"><a href="#cb137-9" aria-hidden="true" tabindex="-1"></a><span class="op">(</span>Get-Query <span class="op">|</span> <span class="fu">where</span> status <span class="op">-match</span> <span class="st">"Active"</span><span class="op">).</span><span class="fu">Status</span><span class="op">.</span><span class="fu">Count</span></span>
 | ||
| <span id="cb137-10"><a href="#cb137-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb137-11"><a href="#cb137-11" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$select</span> <span class="op">-eq</span> <span class="st">"INACTIVECOUNT"</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb137-12"><a href="#cb137-12" aria-hidden="true" tabindex="-1"></a><span class="op">(</span>Get-Query <span class="op">|</span> <span class="fu">where</span> status <span class="op">-match</span> <span class="st">"Disconnect"</span><span class="op">).</span><span class="fu">Status</span><span class="op">.</span><span class="fu">Count</span></span>
 | ||
| <span id="cb137-13"><a href="#cb137-13" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <ul>
 | ||
| <li>Проверить работу скрипта:</li>
 | ||
| </ul>
 | ||
| <p><code>$path = "C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.d\scripts\User-Sessions"</code><br />
 | ||
| <code>.$path\Get-Query-Param.ps1 ACTIVEUSER</code><br />
 | ||
| <code>.$path\Get-Query-Param.ps1 INACTIVEUSER</code><br />
 | ||
| <code>.$path\Get-Query-Param.ps1 ACTIVECOUNT</code><br />
 | ||
| <code>.$path\Get-Query-Param.ps1 INACTIVECOUNT</code></p>
 | ||
| <ul>
 | ||
| <li>Создать Items с ключами:</li>
 | ||
| </ul>
 | ||
| <p><code>Get-Query-Param[ACTIVEUSER]</code> Type: Text<br />
 | ||
| <code>Get-Query-Param[INACTIVEUSER]</code> Type: Text<br />
 | ||
| <code>Get-Query-Param[ACTIVECOUNT]</code> Type: Int<br />
 | ||
| <code>Get-Query-Param[INACTIVECOUNT]</code> Type: Int</p>
 | ||
| <ul>
 | ||
| <li>Макросы:</li>
 | ||
| </ul>
 | ||
| <p><code>{$ACTIVEMAX} = 16</code><br />
 | ||
| <code>{$ACTIVEMIN} = 0</code></p>
 | ||
| <ul>
 | ||
| <li>Триггеры:</li>
 | ||
| </ul>
 | ||
| <p><code>last(/Windows-User-Sessions/Get-Query-Param[ACTIVECOUNT])>{$ACTIVEMAX}</code><br />
 | ||
| <code>min(/Windows-User-Sessions/Get-Query-Param[ACTIVECOUNT],24h)={$ACTIVEMIN}</code></p>
 | ||
| <h3 id="zabbix_agent2.conf">zabbix_agent2.conf</h3>
 | ||
| <pre><code># Агент может работать в пассивном (сервер забирает сам информацию) и активном режиме (агент сам отправляет):
 | ||
| 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</code></pre>
 | ||
| <h3 id="api-token">API Token</h3>
 | ||
| <p>https://www.zabbix.com/documentation/current/en/manual/api/reference</p>
 | ||
| <p><code>$ip = "192.168.3.102"</code><br />
 | ||
| <code>$url = "http://$ip/zabbix/api_jsonrpc.php"</code></p>
 | ||
| <div class="sourceCode" id="cb139"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb139-1"><a href="#cb139-1" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb139-2"><a href="#cb139-2" aria-hidden="true" tabindex="-1"></a>    <span class="st">"jsonrpc"</span><span class="op">=</span><span class="st">"2.0"</span><span class="op">;</span></span>
 | ||
| <span id="cb139-3"><a href="#cb139-3" aria-hidden="true" tabindex="-1"></a>    <span class="st">"method"</span><span class="op">=</span><span class="st">"user.login"</span><span class="op">;</span></span>
 | ||
| <span id="cb139-4"><a href="#cb139-4" aria-hidden="true" tabindex="-1"></a>    <span class="st">"params"</span><span class="op">=</span>@<span class="op">{</span></span>
 | ||
| <span id="cb139-5"><a href="#cb139-5" aria-hidden="true" tabindex="-1"></a>        <span class="st">"username"</span><span class="op">=</span><span class="st">"Admin"</span><span class="op">;</span><span class="ch">` </span>в версии до <span class="dv">6.4</span> параметр <span class="st">"user"</span></span>
 | ||
| <span id="cb139-6"><a href="#cb139-6" aria-hidden="true" tabindex="-1"></a>        <span class="st">"password"</span><span class="op">=</span><span class="st">"zabbix"</span><span class="op">;</span></span>
 | ||
| <span id="cb139-7"><a href="#cb139-7" aria-hidden="true" tabindex="-1"></a>    <span class="op">};</span></span>
 | ||
| <span id="cb139-8"><a href="#cb139-8" aria-hidden="true" tabindex="-1"></a>    <span class="st">"id"</span><span class="op">=</span><span class="dv">1</span><span class="op">;</span></span>
 | ||
| <span id="cb139-9"><a href="#cb139-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb139-10"><a href="#cb139-10" aria-hidden="true" tabindex="-1"></a><span class="va">$token</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Body <span class="op">(</span><span class="va">$data</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span><span class="op">)</span> <span class="op">-</span>ContentType <span class="st">"application/json"</span><span class="op">).</span><span class="fu">Result</span></span></code></pre></div>
 | ||
| <p><code>$token = "2eefd25fdf1590ebcdb7978b5bcea1fff755c65b255da8cbd723181b639bb789"</code>
 | ||
| сгенерировать токен в UI
 | ||
| (http://192.168.3.102/zabbix/zabbix.php?action=token.list)</p>
 | ||
| <h3 id="user.get">user.get</h3>
 | ||
| <div class="sourceCode" id="cb140"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb140-1"><a href="#cb140-1" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb140-2"><a href="#cb140-2" aria-hidden="true" tabindex="-1"></a>    <span class="st">"jsonrpc"</span><span class="op">=</span><span class="st">"2.0"</span><span class="op">;</span></span>
 | ||
| <span id="cb140-3"><a href="#cb140-3" aria-hidden="true" tabindex="-1"></a>    <span class="st">"method"</span><span class="op">=</span><span class="st">"user.get"</span><span class="op">;</span></span>
 | ||
| <span id="cb140-4"><a href="#cb140-4" aria-hidden="true" tabindex="-1"></a>    <span class="st">"params"</span><span class="op">=</span>@<span class="op">{</span></span>
 | ||
| <span id="cb140-5"><a href="#cb140-5" aria-hidden="true" tabindex="-1"></a>    <span class="op">};</span></span>
 | ||
| <span id="cb140-6"><a href="#cb140-6" aria-hidden="true" tabindex="-1"></a>    <span class="st">"auth"</span><span class="op">=</span><span class="va">$token</span><span class="op">;</span></span>
 | ||
| <span id="cb140-7"><a href="#cb140-7" aria-hidden="true" tabindex="-1"></a>    <span class="st">"id"</span><span class="op">=</span><span class="dv">1</span><span class="op">;</span></span>
 | ||
| <span id="cb140-8"><a href="#cb140-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb140-9"><a href="#cb140-9" aria-hidden="true" tabindex="-1"></a><span class="va">$users</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Body <span class="op">(</span><span class="va">$data</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span><span class="op">)</span> <span class="op">-</span>ContentType <span class="st">"application/json"</span><span class="op">).</span><span class="fu">Result</span></span></code></pre></div>
 | ||
| <h3 id="problem.get">problem.get</h3>
 | ||
| <div class="sourceCode" id="cb141"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb141-1"><a href="#cb141-1" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb141-2"><a href="#cb141-2" aria-hidden="true" tabindex="-1"></a>    <span class="st">"jsonrpc"</span><span class="op">=</span><span class="st">"2.0"</span><span class="op">;</span></span>
 | ||
| <span id="cb141-3"><a href="#cb141-3" aria-hidden="true" tabindex="-1"></a>    <span class="st">"method"</span><span class="op">=</span><span class="st">"problem.get"</span><span class="op">;</span></span>
 | ||
| <span id="cb141-4"><a href="#cb141-4" aria-hidden="true" tabindex="-1"></a>    <span class="st">"params"</span><span class="op">=</span>@<span class="op">{</span></span>
 | ||
| <span id="cb141-5"><a href="#cb141-5" aria-hidden="true" tabindex="-1"></a>    <span class="op">};</span></span>
 | ||
| <span id="cb141-6"><a href="#cb141-6" aria-hidden="true" tabindex="-1"></a>    <span class="st">"auth"</span><span class="op">=</span><span class="va">$token</span><span class="op">;</span></span>
 | ||
| <span id="cb141-7"><a href="#cb141-7" aria-hidden="true" tabindex="-1"></a>    <span class="st">"id"</span><span class="op">=</span><span class="dv">1</span><span class="op">;</span></span>
 | ||
| <span id="cb141-8"><a href="#cb141-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb141-9"><a href="#cb141-9" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Body <span class="op">(</span><span class="va">$data</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span><span class="op">)</span> <span class="op">-</span>ContentType <span class="st">"application/json"</span><span class="op">).</span><span class="fu">Result</span></span></code></pre></div>
 | ||
| <h3 id="host.get">host.get</h3>
 | ||
| <p>Получить список всех хостов (имя и id)</p>
 | ||
| <p>https://www.zabbix.com/documentation/current/en/manual/api/reference/host</p>
 | ||
| <p>host.create - creating new hosts<br />
 | ||
| host.delete - deleting hosts<br />
 | ||
| host.get - retrieving hosts<br />
 | ||
| host.massadd - adding related objects to hosts<br />
 | ||
| host.massremove - removing related objects from hosts<br />
 | ||
| host.massupdate - replacing or removing related objects from hosts<br />
 | ||
| host.update - updating hosts</p>
 | ||
| <div class="sourceCode" id="cb142"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb142-1"><a href="#cb142-1" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb142-2"><a href="#cb142-2" aria-hidden="true" tabindex="-1"></a>    <span class="st">"jsonrpc"</span><span class="op">=</span><span class="st">"2.0"</span><span class="op">;</span></span>
 | ||
| <span id="cb142-3"><a href="#cb142-3" aria-hidden="true" tabindex="-1"></a>    <span class="st">"method"</span><span class="op">=</span><span class="st">"host.get"</span><span class="op">;</span></span>
 | ||
| <span id="cb142-4"><a href="#cb142-4" aria-hidden="true" tabindex="-1"></a>    <span class="st">"params"</span><span class="op">=</span>@<span class="op">{</span></span>
 | ||
| <span id="cb142-5"><a href="#cb142-5" aria-hidden="true" tabindex="-1"></a>        <span class="st">"output"</span><span class="op">=@(</span><span class="ch">` </span>отфильтровать вывод</span>
 | ||
| <span id="cb142-6"><a href="#cb142-6" aria-hidden="true" tabindex="-1"></a>            <span class="st">"hostid"</span><span class="op">;</span></span>
 | ||
| <span id="cb142-7"><a href="#cb142-7" aria-hidden="true" tabindex="-1"></a>            <span class="st">"host"</span><span class="op">;</span></span>
 | ||
| <span id="cb142-8"><a href="#cb142-8" aria-hidden="true" tabindex="-1"></a>        <span class="op">);</span></span>
 | ||
| <span id="cb142-9"><a href="#cb142-9" aria-hidden="true" tabindex="-1"></a>    <span class="op">};</span></span>
 | ||
| <span id="cb142-10"><a href="#cb142-10" aria-hidden="true" tabindex="-1"></a>    <span class="st">"id"</span><span class="op">=</span><span class="dv">2</span><span class="op">;</span></span>
 | ||
| <span id="cb142-11"><a href="#cb142-11" aria-hidden="true" tabindex="-1"></a>    <span class="st">"auth"</span><span class="op">=</span><span class="va">$token</span><span class="op">;</span></span>
 | ||
| <span id="cb142-12"><a href="#cb142-12" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb142-13"><a href="#cb142-13" aria-hidden="true" tabindex="-1"></a><span class="va">$hosts</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Body <span class="op">(</span><span class="va">$data</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span><span class="op">)</span> <span class="op">-</span>ContentType <span class="st">"application/json"</span><span class="op">).</span><span class="fu">Result</span></span>
 | ||
| <span id="cb142-14"><a href="#cb142-14" aria-hidden="true" tabindex="-1"></a><span class="va">$host_id</span> <span class="op">=</span> <span class="va">$hosts</span><span class="op">[</span><span class="dv">3</span><span class="op">].</span><span class="fu">hostid</span><span class="ch">` </span>забрать id хоста по индексу</span></code></pre></div>
 | ||
| <h3 id="item.get">item.get</h3>
 | ||
| <p>Получить id элементов данных по наименованию ключа для конкретного
 | ||
| хоста</p>
 | ||
| <div class="sourceCode" id="cb143"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb143-1"><a href="#cb143-1" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb143-2"><a href="#cb143-2" aria-hidden="true" tabindex="-1"></a>    <span class="st">"jsonrpc"</span><span class="op">=</span><span class="st">"2.0"</span><span class="op">;</span></span>
 | ||
| <span id="cb143-3"><a href="#cb143-3" aria-hidden="true" tabindex="-1"></a>    <span class="st">"method"</span><span class="op">=</span><span class="st">"item.get"</span><span class="op">;</span></span>
 | ||
| <span id="cb143-4"><a href="#cb143-4" aria-hidden="true" tabindex="-1"></a>    <span class="st">"params"</span><span class="op">=</span>@<span class="op">{</span></span>
 | ||
| <span id="cb143-5"><a href="#cb143-5" aria-hidden="true" tabindex="-1"></a>        <span class="st">"hostids"</span><span class="op">=@(</span><span class="va">$host_id</span><span class="op">);</span><span class="ch">` </span>отфильтровать по хосту</span>
 | ||
| <span id="cb143-6"><a href="#cb143-6" aria-hidden="true" tabindex="-1"></a>    <span class="op">};</span></span>
 | ||
| <span id="cb143-7"><a href="#cb143-7" aria-hidden="true" tabindex="-1"></a>    <span class="st">"auth"</span><span class="op">=</span><span class="va">$token</span><span class="op">;</span></span>
 | ||
| <span id="cb143-8"><a href="#cb143-8" aria-hidden="true" tabindex="-1"></a>    <span class="st">"id"</span><span class="op">=</span><span class="dv">1</span><span class="op">;</span></span>
 | ||
| <span id="cb143-9"><a href="#cb143-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb143-10"><a href="#cb143-10" aria-hidden="true" tabindex="-1"></a><span class="va">$items</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Body <span class="op">(</span><span class="va">$data</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span><span class="op">)</span> <span class="op">-</span>ContentType <span class="st">"application/json"</span><span class="op">).</span><span class="fu">Result</span></span>
 | ||
| <span id="cb143-11"><a href="#cb143-11" aria-hidden="true" tabindex="-1"></a><span class="va">$items_id</span> <span class="op">=</span> <span class="op">(</span><span class="va">$items</span> <span class="op">|</span> <span class="fu">where</span> key_ <span class="op">-match</span> system<span class="op">.</span><span class="fu">uptime</span><span class="op">).</span><span class="fu">itemid</span><span class="ch">` </span>забрать id элемента данных</span></code></pre></div>
 | ||
| <h3 id="history.get">history.get</h3>
 | ||
| <p>Получить всю историю элемента данных по его id</p>
 | ||
| <div class="sourceCode" id="cb144"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb144-1"><a href="#cb144-1" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb144-2"><a href="#cb144-2" aria-hidden="true" tabindex="-1"></a>    <span class="st">"jsonrpc"</span><span class="op">=</span><span class="st">"2.0"</span><span class="op">;</span></span>
 | ||
| <span id="cb144-3"><a href="#cb144-3" aria-hidden="true" tabindex="-1"></a>    <span class="st">"method"</span><span class="op">=</span><span class="st">"history.get"</span><span class="op">;</span></span>
 | ||
| <span id="cb144-4"><a href="#cb144-4" aria-hidden="true" tabindex="-1"></a>    <span class="st">"params"</span><span class="op">=</span>@<span class="op">{</span></span>
 | ||
| <span id="cb144-5"><a href="#cb144-5" aria-hidden="true" tabindex="-1"></a>        <span class="st">"hostids"</span><span class="op">=@(</span><span class="va">$host_id</span><span class="op">);</span> <span class="ch">` </span>фильтрация по хосту</span>
 | ||
| <span id="cb144-6"><a href="#cb144-6" aria-hidden="true" tabindex="-1"></a>        <span class="st">"itemids"</span><span class="op">=@(</span><span class="va">$items_id</span><span class="op">);</span><span class="ch">` </span>фильтрация по элементу данных</span>
 | ||
| <span id="cb144-7"><a href="#cb144-7" aria-hidden="true" tabindex="-1"></a>    <span class="op">};</span></span>
 | ||
| <span id="cb144-8"><a href="#cb144-8" aria-hidden="true" tabindex="-1"></a>    <span class="st">"auth"</span><span class="op">=</span><span class="va">$token</span><span class="op">;</span></span>
 | ||
| <span id="cb144-9"><a href="#cb144-9" aria-hidden="true" tabindex="-1"></a>    <span class="st">"id"</span><span class="op">=</span><span class="dv">1</span><span class="op">;</span></span>
 | ||
| <span id="cb144-10"><a href="#cb144-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb144-11"><a href="#cb144-11" aria-hidden="true" tabindex="-1"></a><span class="va">$items_data_uptime</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Body <span class="op">(</span><span class="va">$data</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span><span class="op">)</span> <span class="op">-</span>ContentType <span class="st">"application/json"</span><span class="op">).</span><span class="fu">Result</span><span class="ch">` </span>получить все данные по ключу у конкретного хоста</span></code></pre></div>
 | ||
| <h3 id="convert-secconds-to-timespan-and-datetime">Convert Secconds To
 | ||
| TimeSpan and DateTime</h3>
 | ||
| <p><code>$sec = $items_data_uptime.value</code></p>
 | ||
| <div class="sourceCode" id="cb145"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb145-1"><a href="#cb145-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> ConvertSecondsTo-TimeSpan <span class="op">{</span></span>
 | ||
| <span id="cb145-2"><a href="#cb145-2" aria-hidden="true" tabindex="-1"></a>    <span class="kw">param</span> <span class="op">(</span></span>
 | ||
| <span id="cb145-3"><a href="#cb145-3" aria-hidden="true" tabindex="-1"></a>        <span class="va">$insec</span></span>
 | ||
| <span id="cb145-4"><a href="#cb145-4" aria-hidden="true" tabindex="-1"></a>    <span class="op">)</span></span>
 | ||
| <span id="cb145-5"><a href="#cb145-5" aria-hidden="true" tabindex="-1"></a>    <span class="va">$TimeSpan</span> <span class="op">=</span> <span class="op">[</span>TimeSpan<span class="op">]::</span>fromseconds<span class="op">(</span><span class="va">$insec</span><span class="op">)</span></span>
 | ||
| <span id="cb145-6"><a href="#cb145-6" aria-hidden="true" tabindex="-1"></a>    <span class="st">"{0:dd' day 'hh\:mm\:ss}"</span> <span class="op">-</span>f <span class="va">$TimeSpan</span></span>
 | ||
| <span id="cb145-7"><a href="#cb145-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>$UpTime = ConvertSecondsTo-TimeSpan $sec[-1]</code></p>
 | ||
| <h3 id="convert-from-unix-time">Convert From Unix Time</h3>
 | ||
| <p><code>$time = $items_data_uptime.clock</code></p>
 | ||
| <div class="sourceCode" id="cb146"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb146-1"><a href="#cb146-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> ConvertFrom-UnixTime <span class="op">{</span></span>
 | ||
| <span id="cb146-2"><a href="#cb146-2" aria-hidden="true" tabindex="-1"></a>    <span class="kw">param</span> <span class="op">(</span></span>
 | ||
| <span id="cb146-3"><a href="#cb146-3" aria-hidden="true" tabindex="-1"></a>        <span class="va">$intime</span></span>
 | ||
| <span id="cb146-4"><a href="#cb146-4" aria-hidden="true" tabindex="-1"></a>    <span class="op">)</span></span>
 | ||
| <span id="cb146-5"><a href="#cb146-5" aria-hidden="true" tabindex="-1"></a>    <span class="va">$EpochTime</span> <span class="op">=</span> <span class="op">[</span>DateTime<span class="op">]</span><span class="st">"1/1/1970"</span></span>
 | ||
| <span id="cb146-6"><a href="#cb146-6" aria-hidden="true" tabindex="-1"></a>    <span class="va">$TimeZone</span> <span class="op">=</span> Get-TimeZone</span>
 | ||
| <span id="cb146-7"><a href="#cb146-7" aria-hidden="true" tabindex="-1"></a>    <span class="va">$UTCTime</span> <span class="op">=</span> <span class="va">$EpochTime</span><span class="op">.</span><span class="fu">AddSeconds</span><span class="op">(</span><span class="va">$intime</span><span class="op">)</span></span>
 | ||
| <span id="cb146-8"><a href="#cb146-8" aria-hidden="true" tabindex="-1"></a>    <span class="va">$UTCTime</span><span class="op">.</span><span class="fu">AddMinutes</span><span class="op">(</span><span class="va">$TimeZone</span><span class="op">.</span><span class="fu">BaseUtcOffset</span><span class="op">.</span><span class="fu">TotalMinutes</span><span class="op">)</span></span>
 | ||
| <span id="cb146-9"><a href="#cb146-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>$GetDataTime = ConvertFrom-UnixTime $time[-1]</code></p>
 | ||
| <p><code>($hosts | where hostid -eq $host_id).host</code> получить имя
 | ||
| хоста<br />
 | ||
| <code>$UpTime</code> последнее полученное значение времени работы
 | ||
| хоста<br />
 | ||
| <code>$GetDataTime</code> время последнего полученного значения</p>
 | ||
| <h1 id="pki">pki</h1>
 | ||
| <p><code>New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "$env:computername" -FriendlyName "Test Certificate" -NotAfter (Get-Date).AddYears(5)</code>
 | ||
| создать самоподписанный сертификат (в LocalMachine- Сертификаты
 | ||
| компьютера) с сроком действия 5 лет</p>
 | ||
| <p><code>Get-ChildItem -Path Cert:\CurrentUser\Root\</code> список всех
 | ||
| установленных сертификатов в хранилище Доверенные корневые ЦС Текущего
 | ||
| пользователя<br />
 | ||
| <code>Get-ChildItem -Path Cert:\CurrentUser\My\</code> список
 | ||
| самозаверяющих сертификатов в Личное хранилище Текущего
 | ||
| пользователя<br />
 | ||
| <code>Get-ChildItem -Path Cert:\LocalMachine\My\</code> список
 | ||
| самозаверяющих сертификатов в Личное хранилище Локального
 | ||
| компьютера<br />
 | ||
| <code>Get-ChildItem -Path Cert:\LocalMachine\My\ | select NotBefore,NotAfter,Thumbprint,Subject</code>
 | ||
| срок действия сертификата<br />
 | ||
| <code>Get-ChildItem -Path Cert:\LocalMachine\My\ | where Thumbprint -eq D9356FB774EE0E6206B7D5B59B99102CA5B17BDA</code>
 | ||
| поиск сертификат по отпечатку</p>
 | ||
| <p><code>Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificates\My\Certificates\</code>
 | ||
| сертификаты в файловой системе, каждый файл соответствует сертификату,
 | ||
| установленному в личном хранилище текущего пользователя<br />
 | ||
| <code>Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificates\My\Keys\</code>
 | ||
| ссылки на объекты закрытых ключей, созданных поставщиком хранилища
 | ||
| ключей (KSP)<br />
 | ||
| <code>Get-ChildItem -Path HKCU:\Software\Microsoft\SystemCertificates\CA\Certificates | ft -AutoSize</code>
 | ||
| список сертификатов в реестре вошедшего в систему пользователя</p>
 | ||
| <p><code>$cert = (Get-ChildItem -Path Cert:\CurrentUser\My\)[1]</code>
 | ||
| выбрать сертификат<br />
 | ||
| <code>$cert | Remove-Item</code> удалить сертификат</p>
 | ||
| <p><code>Export-Certificate -FilePath $home\Desktop\certificate.cer -Cert $cert</code>
 | ||
| экспортировать сертификат<br />
 | ||
| <code>$cert.HasPrivateKey</code> проверить наличие закрытого ключа<br />
 | ||
| <code>$pass = "password" | ConvertTo-SecureString -AsPlainText -Force</code>
 | ||
| создать пароль для шифрования закрытого ключа<br />
 | ||
| <code>Export-PfxCertificate -FilePath $home\Desktop\certificate.pfx -Password $pass -Cert $certificate</code>
 | ||
| экспортировать сертификат с закрытым ключем</p>
 | ||
| <p><code>Import-Certificate -FilePath $home\Desktop\certificate.cer -CertStoreLocation Cert:\CurrentUser\My</code>
 | ||
| импортировать сертификат<br />
 | ||
| <code>Import-PfxCertificate -Exportable -Password $pass -CertStoreLocation Cert:\CurrentUser\My -FilePath $home\Desktop\certificate.pfx</code></p>
 | ||
| <h1 id="openssl">OpenSSL</h1>
 | ||
| <div class="sourceCode" id="cb147"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb147-1"><a href="#cb147-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-WebRequest</span> <span class="op">-</span>Uri https<span class="op">://</span>slproweb<span class="op">.</span><span class="fu">com</span><span class="op">/</span>download<span class="op">/</span>Win64OpenSSL_Light-3_1_1<span class="op">.</span><span class="fu">msi</span> <span class="op">-</span>OutFile <span class="va">$home</span>\Downloads\OpenSSL-Light-3<span class="op">.</span><span class="dv">1.1</span><span class="op">.</span><span class="fu">msi</span></span>
 | ||
| <span id="cb147-2"><a href="#cb147-2" aria-hidden="true" tabindex="-1"></a><span class="fu">Start-Process</span> <span class="va">$home</span>\Downloads\OpenSSL-Light-3<span class="op">.</span><span class="dv">1.1</span><span class="op">.</span><span class="fu">msi</span> <span class="op">-</span>ArgumentList <span class="st">'/quiet'</span> <span class="op">-</span>Wait<span class="ch">` </span>установить msi пакет в тихом режиме <span class="op">(</span>запуск от имени Администратора<span class="op">)</span></span>
 | ||
| <span id="cb147-3"><a href="#cb147-3" aria-hidden="true" tabindex="-1"></a><span class="fu">rm</span> <span class="va">$home</span>\Downloads\OpenSSL-Light-3<span class="op">.</span><span class="dv">1.1</span><span class="op">.</span><span class="fu">msi</span></span>
 | ||
| <span id="cb147-4"><a href="#cb147-4" aria-hidden="true" tabindex="-1"></a><span class="fu">cd</span> <span class="st">"C:\Program Files\OpenSSL-Win64\bin"</span></span></code></pre></div>
 | ||
| <ul>
 | ||
| <li><p>Изменить пароль для PFX<br />
 | ||
| <code>openssl pkcs12 -in "C:\Cert\domain.ru.pfx" -out "C:\Cert\domain.ru.pem" -nodes</code>
 | ||
| экспортируем имеющийся сертификат и закрытый ключ в .pem-файл без пароля
 | ||
| с указанием текущего пароля<br />
 | ||
| <code>openssl pkcs12 -export -in "C:\Cert\domain.ru.pem" -out "C:\Cert\domain.ru_password.pfx" -nodes</code>
 | ||
| конвертируем .pem обратно в .pfx c указанием нового пароля</p></li>
 | ||
| <li><p>Конвертация из закрытого и открытого ключа PEM в PFX<br />
 | ||
| <code>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"</code><br />
 | ||
| in – путь до файла с открытым ключом<br />
 | ||
| inkey – путь до файла с закрытым ключом<br />
 | ||
| out – путь до файла, в который будет конвертирован сертификат
 | ||
| (pfx)</p></li>
 | ||
| <li><p>Конвертация PFX в CRT<br />
 | ||
| <code>openssl pkcs12 -in "C:\OpenSSL-Win64\bin\_.domain.ru.pfx" -clcerts -out "C:\OpenSSL-Win64\bin\_.domain.ru.crt"</code>
 | ||
| указывается текущий и 2 раза новый пароль PEM pass phrase (файл содержит
 | ||
| EGIN CERTIFICATE и BEGIN ENCRYPTED PRIVATE KEY)<br />
 | ||
| <code>openssl pkcs12 -in "C:\OpenSSL-Win64\bin\_.domain.ru.pfx" -clcerts -nokeys -out "C:\OpenSSL-Win64\bin\_.domain.ru.crt"</code>
 | ||
| без ключа, получить открытую часть (файл содержит только EGIN
 | ||
| CERTIFICATE)</p></li>
 | ||
| <li><p>Конвертация PFX в KEY<br />
 | ||
| <code>openssl pkcs12 -in "C:\OpenSSL-Win64\bin\_.domain.ru.pfx" -nocerts -out "C:\OpenSSL-Win64\bin\_.domain.ru.key"</code>
 | ||
| файл содержит только BEGIN ENCRYPTED PRIVATE KEY</p></li>
 | ||
| <li><p>Снять пароль к закрытого ключа .key<br />
 | ||
| <code>openssl rsa -in "C:\OpenSSL-Win64\bin\_.domain.ru.key" -out "C:\OpenSSL-Win64\bin\_.domain.ru-decrypted.key"</code></p></li>
 | ||
| <li><p>CRT и KEY в PFX:<br />
 | ||
| <code>openssl pkcs12 -inkey certificate.key -in certificate.crt -export -out certificate.pfx</code></p></li>
 | ||
| </ul>
 | ||
| <h1 id="openvpn">OpenVPN</h1>
 | ||
| <p><code>Invoke-WebRequest -Uri https://swupdate.openvpn.org/community/releases/OpenVPN-2.6.5-I001-amd64.msi -OutFile $home\Downloads\OpenVPN-2.6.5.msi</code><br />
 | ||
| <code>Start-Process $home\Downloads\OpenVPN-2.6.5.msi -ArgumentList '/quiet /SELECT_OPENSSL_UTILITIES=1' -Wait</code><br />
 | ||
| <code>msiexec /i $home\Downloads\OpenVPN-2.6.5.msi ADDLOCAL=EasyRSA /passive /quiet # установить отдельный компонент EasyRSA Certificate Management Scripts</code><br />
 | ||
| <code># msiexec /i $home\Downloads\OpenVPN-2.6.5.msi ADDLOCAL=OpenVPN.Service,Drivers,Drivers.Wintun,OpenVPN,OpenVPN.GUI,OpenVPN.GUI.OnLogon,EasyRSA /passive</code>
 | ||
| выборочная установка<br />
 | ||
| <code># 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</code>
 | ||
| скачать отдельный пакет EasyRSA<br />
 | ||
| <code>rm $home\Downloads\OpenVPN-2.6.5.msi</code></p>
 | ||
| <p><code>cd "C:\Program Files\OpenVPN\easy-rsa"</code><br />
 | ||
| <code>Copy-Item vars.example vars</code> файл конфигурации для
 | ||
| EasyRSA</p>
 | ||
| <pre><code>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 "lifailon@domain.ru"
 | ||
| set_var EASYRSA_REQ_OU "IT"
 | ||
| #set_var EASYRSA_KEY_SIZE 2048
 | ||
| #set_var EASYRSA_CA_EXPIRE 3650
 | ||
| #set_var EASYRSA_CERT_EXPIRE 825</code></pre>
 | ||
| <p><code>.\EasyRSA-Start.bat</code> среда EasyRSA Shell<br />
 | ||
| <code>easyrsa init-pki</code> инициализация PKI, создает директорию:
 | ||
| C:Files-rsaи читает переменные файла -rsa<br />
 | ||
| <code>easyrsa build-ca</code> генерация корневого CA с указанием пароля
 | ||
| и произвольное имя сервера (.crt и .key)<br />
 | ||
| <code>easyrsa gen-req server nopass</code> генерация запроса сертификата
 | ||
| и ключ для сервера OpenVPN - yes (.req и .key)<br />
 | ||
| <code>easyrsa sign-req server server</code> подписать запрос на выпуск
 | ||
| сертификата сервера с помощью CA - yes (.crt)<br />
 | ||
| <code>easyrsa gen-dh</code> создать ключ Диффи-Хеллмана (.pem)<br />
 | ||
| <code>easyrsa gen-req client1</code>
 | ||
| nopass<code>генерация запроса сертификата и ключ для клиента OpenVPN (\pki\reqs\client1.req и \pki\private\client1.key)</code><br />
 | ||
| <code>easyrsa sign-req client client1</code> подписать запрос на выпуск
 | ||
| сертификата клиента с помощью CA - yes (1.crt)<br />
 | ||
| <code>easyrsa revoke client1</code> отозвать сертификат
 | ||
| пользователя<br />
 | ||
| <code>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"</code>
 | ||
| снять защиту паролем для ключа (BEGIN ENCRYPTED PRIVATE KEY -> BEGIN
 | ||
| PRIVATE KEY)<br />
 | ||
| <code>exit</code><br />
 | ||
| <code>cd "C:\Program Files\OpenVPN\bin"</code><br />
 | ||
| <code>.\openvpn --genkey secret ta.key</code> генерация ключа tls-auth
 | ||
| (.key)<br />
 | ||
| <code>Move-Item "C:\Program Files\OpenVPN\bin\ta.key" "C:\Program Files\OpenVPN\easy-rsa\pki\"</code></p>
 | ||
| <h3 id="server.ovpn">server.ovpn</h3>
 | ||
| <p><code># Copy-Item "C:\Program Files\OpenVPN\sample-config\server.ovpn" "C:\Program Files\OpenVPN\config-auto\server.ovpn"</code><br />
 | ||
| <code>New-Item -ItemType File -Path "C:\Program Files\OpenVPN\config-auto\server.ovpn"</code></p>
 | ||
| <pre><code>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"</code></pre>
 | ||
| <p><code>New-NetFirewallRule -DisplayName "AllowOpenVPN-In" -Direction Inbound -Protocol UDP –LocalPort 1194 -Action Allow</code>
 | ||
| на сервере<br />
 | ||
| <code>New-NetFirewallRule -DisplayName "AllowOpenVPN-Out" -Direction Outbound -Protocol UDP –LocalPort 1194 -Action Allow</code>
 | ||
| на клиенте<br />
 | ||
| <code>Get-Service *openvpn* | Restart-Service</code></p>
 | ||
| <h3 id="client.ovpn">client.ovpn</h3>
 | ||
| <p><code># Copy-Item "C:\Program Files\OpenVPN\sample-config\client.ovpn" "C:\Program Files\OpenVPN\config-auto\client.ovpn"</code><br />
 | ||
| <code>New-Item -ItemType File -Path "C:\Program Files\OpenVPN\config-auto\client.ovpn"</code></p>
 | ||
| <pre><code>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</code></pre>
 | ||
| <h3 id="client">Client</h3>
 | ||
| <p><code>iwr -Uri https://openvpn.net/downloads/openvpn-connect-v3-windows.msi -OutFile "$home\downloads\OpenVPN-Connect-3.msi"</code><br />
 | ||
| Передать конфигурацию и ключи:<br />
 | ||
| <code>client.ovpn</code><br />
 | ||
| <code>ca.crt</code><br />
 | ||
| <code>dh.pem</code><br />
 | ||
| <code>ta.key</code><br />
 | ||
| <code>client1.crt</code><br />
 | ||
| <code>client1.key</code></p>
 | ||
| <h1 id="route">Route</h1>
 | ||
| <p><code>Get-Service RemoteAccess | Stop-Service</code><br />
 | ||
| <code>Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -Name "IPEnableRouter" -Value 1</code>
 | ||
| включает IP маршрутизацию<br />
 | ||
| <code>(Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters").IPEnableRouter</code><br />
 | ||
| <code>Get-NetIPInterface | select ifIndex,InterfaceAlias,AddressFamily,ConnectionState,Forwarding | ft</code>
 | ||
| отобразить сетевые интерфейсы<br />
 | ||
| <code>Set-NetIPInterface -ifIndex 13 -Forwarding Enabled</code> включить
 | ||
| переадресацию на интерфейсе</p>
 | ||
| <p><code>sysctl net.ipv4.ip_forward=1</code><br />
 | ||
| <code>echo "sysctl net.ipv4.ip_forward = 1" >> /etc/sysctl.conf</code></p>
 | ||
| <p><code>Get-NetRoute</code><br />
 | ||
| <code>New-NetRoute -DestinationPrefix "192.168.3.0/24" -NextHop "192.168.4.1" -InterfaceIndex 8</code><br />
 | ||
| <code>route -p add 192.168.3.0 mask 255.255.255.0 192.168.4.1 metric 1</code><br />
 | ||
| <code>route -p change 192.168.3.0 mask 255.255.255.0 192.168.4.1 metric 2</code><br />
 | ||
| <code>route -p add 192.168.3.0 mask 255.255.255.0 192.168.4.1 metric 1 if 7</code>
 | ||
| указать номер сетевого интерфейса на который необходимо посылать пакет
 | ||
| (Wintun Userspace Tunnel)<br />
 | ||
| <code>route print -4</code><br />
 | ||
| <code>route delete 192.168.3.0</code></p>
 | ||
| <p><code>tracert 192.168.3.101</code> с 192.168.4.6</p>
 | ||
| <pre><code>1    17 ms     *       22 ms  192.168.4.1
 | ||
| 2    12 ms    13 ms    14 ms  192.168.3.101</code></pre>
 | ||
| <p><code>route add -net 192.168.4.0 netmask 255.255.255.0 gw 192.168.3.100</code><br />
 | ||
| <code>route -e</code></p>
 | ||
| <p><code>traceroute 192.168.4.6</code> с 192.168.3.101</p>
 | ||
| <pre><code>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 * *</code></pre>
 | ||
| <p><code>ping 192.168.3.101 -t</code> с 192.168.4.6<br />
 | ||
| <code>tcpdump -n -i ens33 icmp</code> на 192.168.3.101</p>
 | ||
| <pre><code>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 # отправил ответ</code></pre>
 | ||
| <h1 id="nat">NAT</h1>
 | ||
| <p><code>Get-Command -Module NetNat</code><br />
 | ||
| <code>New-NetNat -Name LocalNat -InternalIPInterfaceAddressPrefix "192.168.3.0/24"</code><br />
 | ||
| <code>Add-NetNatStaticMapping -NatName LocalNat -Protocol TCP -ExternalIPAddress 0.0.0.0 -ExternalPort 80 -InternalIPAddress 192.168.3.102 -InternalPort 80</code><br />
 | ||
| <code>Remove-NetNatStaticMapping -StaticMappingID 0</code><br />
 | ||
| <code>Remove-NetNat -Name LocalNat</code></p>
 | ||
| <h1 id="wireguard">WireGuard</h1>
 | ||
| <p><code>Invoke-WebRequest "https://download.wireguard.com/windows-client/wireguard-amd64-0.5.3.msi" -OutFile "$home\Downloads\WireGuard-Client-0.5.3.msi"</code><br />
 | ||
| <code>msiexec.exe /i "$home\Downloads\WireGuard-Client-0.5.3.msi" DO_NOT_LAUNCH=1 /qn</code><br />
 | ||
| <code>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"</code><br />
 | ||
| <code>msiexec.exe /i "http://www.wiresock.net/downloads/wiresock-vpn-gateway-x64-1.1.4.1.msi" /qn</code><br />
 | ||
| <code>$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")</code><br />
 | ||
| <code>wg-quick-config -add -start</code><br />
 | ||
| <code>26.115.154.67:8181</code><br />
 | ||
| <code>192.168.21.4/24</code><br />
 | ||
| <code>Successfully saved client configuration: C:\ProgramData\NT KERNEL\WireSock VPN Gateway\wsclient_1.conf</code><br />
 | ||
| <code>Successfully saved server configuration: C:\ProgramData\NT KERNEL\WireSock VPN Gateway\wiresock.conf</code><br />
 | ||
| <code>get-service *wire*</code><br />
 | ||
| <code>wg show</code><br />
 | ||
| <code>wg-quick-config -add -restart</code> add client</p>
 | ||
| <p>wiresock.conf</p>
 | ||
| <pre><code>[Interface]
 | ||
| PrivateKey = gCHC0g2JPwr6sXPiaOL4/KTkMyjN9TculrJUA/GORV8=
 | ||
| Address = 192.168.21.5/24
 | ||
| ListenPort = 8181
 | ||
| 
 | ||
| [Peer]
 | ||
| PublicKey = NoSxjew2RCHiUzI6mlahjd4I+0EcLsoYom/H01z91yU=
 | ||
| AllowedIPs = 192.168.21.6/32</code></pre>
 | ||
| <p>wsclient_1.conf (добавить маршруты для клиента в AllowedIPs)</p>
 | ||
| <pre><code>[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</code></pre>
 | ||
| <h1 id="vpnclient">VpnClient</h1>
 | ||
| <p><code>Get-Command -Module VpnClient</code><br />
 | ||
| <code>Add-VpnConnection -Name "vpn-failon" -ServerAddress "26.115.154.67" -TunnelType L2TP -L2tpPsk "123098" -EncryptionLevel "Required" -AuthenticationMethod MSChapv2 -RememberCredential -AllUserConnection –PassThru -Force</code><br />
 | ||
| <code>-TunnelType PPTP/L2TP/SSTP/IKEv2/Automatic</code><br />
 | ||
| <code>-L2tpPsk</code> использовать общий ключ для аутентификации (без
 | ||
| параметра, для L2TP аутентификации используется сертификат)<br />
 | ||
| <code>-AuthenticationMethod Pap/Chap/MSChapv2/Eap/MachineCertificate</code><br />
 | ||
| <code>-EncryptionLevel NoEncryption/Optional/Required/Maximum/Custom</code><br />
 | ||
| <code>-SplitTunneling</code> заворачивать весь трафик через VPN-туннель
 | ||
| (включение Use default gateway on remote network в настройках параметра
 | ||
| VPN адаптера)<br />
 | ||
| <code>-UseWinlogonCredential</code> использовать учетные данные текущего
 | ||
| пользователя для аутентификации на VPN сервере<br />
 | ||
| <code>-RememberCredential</code> разрешить сохранять учетные данные для
 | ||
| VPN подключения (учетная запись и пароль сохраняются в диспетчер учетных
 | ||
| данных Windows после первого успешного подключения)<br />
 | ||
| <code>-DnsSuffix domain.local</code><br />
 | ||
| <code>-AllUserConnection</code> разрешить использовать VPN подключение
 | ||
| для всех пользователей компьютера (сохраняется в конфигурационный файл:
 | ||
| C:.pbk)</p>
 | ||
| <p><code>Install-Module -Name VPNCredentialsHelper</code> модуль для
 | ||
| сохранения логина и пароля в Windows Credential Manager для VPN
 | ||
| подключения<br />
 | ||
| <code>Set-VpnConnectionUsernamePassword -connectionname vpn-failon -username user1 -password password</code></p>
 | ||
| <p><code>rasdial "vpn-failon"</code> подключиться<br />
 | ||
| <code>Get-VpnConnection -AllUserConnection | select *</code> список VPN
 | ||
| подключения, доступных для всех пользователей, найстройки и текущий
 | ||
| статус подключения (ConnectionStatus)<br />
 | ||
| <code>Add-VpnConnectionRoute -ConnectionName vpn-failon -DestinationPrefix 192.168.3.0/24 –PassThru</code>
 | ||
| динамически добавить в таблицу маршрутизации маршрут, который будет
 | ||
| активен при подключении к VPN<br />
 | ||
| <code>Remove-VpnConnection -Name vpn-failon -AllUserConnection -Force</code>
 | ||
| удалить</p>
 | ||
| <p><code>Set-VpnConnection -Name "vpn-failon" -SplitTunneling $True</code>
 | ||
| включить раздельное тунеллирование<br />
 | ||
| <code>Add-VpnConnectionRoute -ConnectionName "vpn-failon" -DestinationPrefix 172.22.22.0/24</code>
 | ||
| настроить маршрутизацию к указанной подсети через VPN-соединение<br />
 | ||
| <code>(Get-VpnConnection -ConnectionName "vpn-failon").routes</code>
 | ||
| отобразить таблицу маршрутизации для указанного соединения<br />
 | ||
| <code>Remove-VpnConnectionRoute -ConnectionName "vpn-failon" -DestinationPrefix "172.22.23.0/24"</code></p>
 | ||
| <h1 id="proxy">Proxy</h1>
 | ||
| <p><code>$user = "lifailon"</code><br />
 | ||
| <code>$pass = "Proxy"</code><br />
 | ||
| <code>$SecureString = ConvertTo-SecureString $pass -AsPlainText -Force</code><br />
 | ||
| <code>$Credential = New-Object System.Management.Automation.PSCredential($user, $SecureString)</code><br />
 | ||
| <code>[System.Net.Http.HttpClient]::DefaultProxy = New-Object System.Net.WebProxy("http://192.168.3.100:9090")</code><br />
 | ||
| <code>[System.Net.Http.HttpClient]::DefaultProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials</code><br />
 | ||
| <code>[System.Net.Http.HttpClient]::DefaultProxy.Credentials = $Credential</code><br />
 | ||
| <code>Invoke-RestMethod http://ifconfig.me/ip</code><br />
 | ||
| <code>Invoke-RestMethod https://kinozal.tv/rss.xml</code></p>
 | ||
| <h1 id="openssh">OpenSSH</h1>
 | ||
| <p><code>Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*'</code><br />
 | ||
| <code>Add-WindowsCapability -Online -Name OpenSSH.Client*</code><br />
 | ||
| <code>dism /Online /Add-Capability /CapabilityName:OpenSSH.Client~~~~0.0.1.0</code><br />
 | ||
| <code>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</code>
 | ||
| скачать<br />
 | ||
| <code>msiexec /i $home\Downloads\OpenSSH-Win64-v9.2.2.0.msi</code>
 | ||
| установить msi пакет<br />
 | ||
| <code>Set-Service sshd -StartupType Automatic</code><br />
 | ||
| <code>Get-NetTCPConnection | where LocalPort -eq 22</code><br />
 | ||
| <code>New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22</code><br />
 | ||
| <code>Get-NetFirewallRule -Name *ssh*</code><br />
 | ||
| <code>Start-Process notepad++ C:\Programdata\ssh\sshd_config</code>
 | ||
| конфигурационный файл<br />
 | ||
| <code>GSSAPIAuthentication yes</code> включить Kerberos аутентификацию
 | ||
| (через AD)<br />
 | ||
| <code>SyslogFacility LOCAL0</code> включить локальное ведение журнала в
 | ||
| файл (C:.log)<br />
 | ||
| <code>LogLevel INFO</code><br />
 | ||
| <code>Restart-Service sshd</code><br />
 | ||
| <code>ssh -K $srv</code> выполнить Kerberos аутентификацию<br />
 | ||
| <code>ssh Lifailon@192.168.3.99 -p 22</code><br />
 | ||
| <code>pwsh -command Get-Service</code><br />
 | ||
| <code>ssh -L 3101:192.168.3.101:22 -R 3101:192.168.3.101:22 lifailon@192.168.3.101 -p 22</code>
 | ||
| SSH Tunnel lifailon@localhost:3101 -> 192.168.3.101:3101</p>
 | ||
| <h1 id="winrm">WinRM</h1>
 | ||
| <p><code>Enter-PSSession -ComputerName $srv</code> подключиться к
 | ||
| PowerShell сессии через PSRemoting. Подключение возможно только по
 | ||
| FQDN-имени<br />
 | ||
| <code>Invoke-Command $srv -ScriptBlock {Get-ComputerInfo}</code>
 | ||
| выполнение команды через PSRemoting<br />
 | ||
| <code>$session = New-PSSession $srv</code> открыть сессию<br />
 | ||
| <code>Get-PSSession</code> отобразить активные сессии<br />
 | ||
| <code>icm -Session $session {$srv = $using:srv}</code> передать
 | ||
| переменную текущей сессии ($using) в удаленную<br />
 | ||
| <code>Disconnect-PSSession $session</code> закрыть сессию<br />
 | ||
| <code>Remove-PSSession $session</code> удалить сессию<br />
 | ||
| <code>Import-Module -Name ActiveDirectory -PSSession $srv</code>
 | ||
| импортировать модуль с удаленного компьютера в локальную сессию</p>
 | ||
| <h3 id="windows-remote-management-configuration">Windows Remote
 | ||
| Management Configuration</h3>
 | ||
| <p><code>winrm quickconfig -quiet</code> изменит запуск службы WinRM на
 | ||
| автоматический, задаст стандартные настройки WinRM и добавить исключения
 | ||
| для портов в fw<br />
 | ||
| <code>Enable-PSRemoting –Force</code> включить PowerShell Remoting,
 | ||
| работает только для доменного и частного сетевых профилей Windows<br />
 | ||
| <code>Enable-PSRemoting -SkipNetworkProfileCheck -Force</code> для
 | ||
| настройки компьютера в общей (public) сети (работает с версии powershell
 | ||
| 6)</p>
 | ||
| <p><code>$NetProfiles = Get-NetConnectionProfile</code> отобразить
 | ||
| профили сетевых подключений<br />
 | ||
| <code>Set-NetConnectionProfile -InterfaceIndex $NetProfiles[1].InterfaceIndex -NetworkCategory Private</code>
 | ||
| изменить тип сети для профиля (DomainAuthenticated/Public)<br />
 | ||
| <code>(Get-CimInstance -ClassName Win32_ComputerSystem).PartOfDomain</code>
 | ||
| проверить, что компьютер добавлен в домен AD<br />
 | ||
| <code>Get-Service WinRM | Set-Service -StartupType AutomaticDelayedStart</code>
 | ||
| отложенный запуск<br />
 | ||
| <code>Get-Service -Name winrm -RequiredServices</code> статус зависимых
 | ||
| служб<br />
 | ||
| <code>New-NetFirewallRule -Profile Any -DisplayName "WinRM HTTP" -Direction Inbound -Protocol TCP -LocalPort 5985,5986</code><br />
 | ||
| <code>Test-NetConnection $srv -port 5895</code> проверить порт<br />
 | ||
| <code>Test-WSMan $srv -ErrorAction Ignore</code> проверить работу WinRM
 | ||
| на удаленном компьютере (игнорировать вывод ошибок для скрипта) или
 | ||
| локально (localhost)</p>
 | ||
| <p><code>$Cert = New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "$env:computername" -FriendlyName "WinRM HTTPS Certificate" -NotAfter (Get-Date).AddYears(5)</code>
 | ||
| создать самоподписанный сертификат<br />
 | ||
| <code>$Thumbprint = $Cert.Thumbprint</code> забрать отпечаток<br />
 | ||
| <code>New-Item -Path WSMan:\Localhost\Listener -Transport HTTPS -Address * -CertificateThumbprint $Thumbprint -Name WinRM_HTTPS_Listener -Force</code>
 | ||
| создать прослушиватель<br />
 | ||
| <code>New-NetFirewallRule -DisplayName 'WinRM HTTPS' -Profile Domain,Private -Direction Inbound -Action Allow -Protocol TCP -LocalPort 5986</code>
 | ||
| открыть порт в fw</p>
 | ||
| <pre><code>$selector_set = @{
 | ||
|     Address = "*"
 | ||
|     Transport = "HTTPS"
 | ||
| }
 | ||
| $value_set = @{
 | ||
|     CertificateThumbprint = "66ABFDA044D8C85135048186E2FDC0DBE6125163"
 | ||
| }
 | ||
| New-WSManInstance -ResourceURI "winrm/config/Listener" -SelectorSet $selector_set -ValueSet $value_set</code></pre>
 | ||
| <p><code>winrm get winrm/config</code> отобразить всю конфигурацию
 | ||
| (Client/Service)<br />
 | ||
| <code>winrm get winrm/config/service/auth</code> конфигурация
 | ||
| авторизации на сервере<br />
 | ||
| <code>winrm enumerate winrm/config/listener</code> текущая конфигурация
 | ||
| прослушивателей WinRM (отображает отпечаток сертификата для HTTPS
 | ||
| 5986)<br />
 | ||
| <code>Get-ChildItem -Path Cert:\LocalMachine\My\ | where Thumbprint -eq D9356FB774EE0E6206B7D5B59B99102CA5B17BDA | select *</code>
 | ||
| информация о сертификате</p>
 | ||
| <p><code>ls WSMan:\localhost\Client</code> конфигурацию клиента<br />
 | ||
| <code>ls WSMan:\localhost\Service</code> конфигурация сервера<br />
 | ||
| <code>ls WSMan:\localhost\Service\auth</code> список всех конфигураций
 | ||
| аутентификации WinRM сервера<br />
 | ||
| <code>Set-Item -path WSMan:\localhost\Service\auth\basic -value $true</code>
 | ||
| разрешить локальную аутентификацию к текущему серверу<br />
 | ||
| <code>ls HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN</code>
 | ||
| настройки в реестре (например, для включения аудентификации в _basic =
 | ||
| 1)<br />
 | ||
| <code>Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.* -Force</code>
 | ||
| добавить доверенные хосты в конфигурацию на клиенте, чтобы работала
 | ||
| Negotiate аутентификация через NTLM<br />
 | ||
| <code>Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.3.100 -Concatenate -Force</code>
 | ||
| добавить второй компьютер<br />
 | ||
| <code>ls WSMan:\localhost\Client\TrustedHosts</code><br />
 | ||
| <code>Set-Item WSMan:\localhost\Client\AllowUnencrypted $true</code>
 | ||
| включить передача незашифрованных данных конфигурации клиента<br />
 | ||
| <code>Set-Item WSMan:\localhost\Service\AllowUnencrypted $true</code>
 | ||
| включить передача незашифрованных данных конфигурации сервера
 | ||
| (необходимо быть в private сети)</p>
 | ||
| <p><code>Get-PSSessionConfiguration</code> проверить, включен ли
 | ||
| PSremoting и вывести список пользователей и групп, которым разрешено
 | ||
| подключаться через WinRM<br />
 | ||
| <code>Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI</code>
 | ||
| назначить права доступа через дескриптор безопасности текущей сессии (до
 | ||
| перезагруки)<br />
 | ||
| <code>(Get-PSSessionConfiguration -Name "Microsoft.PowerShell").SecurityDescriptorSDDL</code>
 | ||
| получить настройки дескриптора в формате SDDL<br />
 | ||
| <code>Set-PSSessionConfiguration -Name Microsoft.PowerShell -SecurityDescriptorSDDL $SDDL</code>
 | ||
| применить настройки дескриптора на другом компьютере без использования
 | ||
| GUI<br />
 | ||
| </p>
 | ||
| <p><code>New-LocalUser "WinRM-Writer" -Password (ConvertTo-SecureString -AsPlainText "123098")</code>
 | ||
| создать пользователя<br />
 | ||
| <code>Add-LocalGroupMember -Group "Remote Management Users" -Member "WinRM-Writer"</code>
 | ||
| добавить пользователя WinRM-Writer в локальную группу доступа
 | ||
| “Пользователи удаленного управления”<br />
 | ||
| <code>cmdkey /add:192.168.3.99 /user:WinRM-Writer /pass:123098</code>
 | ||
| сохранить пароль в CredentialManager <code>cmdkey /list</code><br />
 | ||
| <code>Import-Module CredentialManager</code><br />
 | ||
| <code>Add-Type -AssemblyName System.Web</code><br />
 | ||
| <code>New-StoredCredential -Target 192.168.3.99 -UserName WinRM-Writer -Password 123098 -Comment WinRM</code>
 | ||
| сохранить пароль в CredentialManager (из PS5)<br />
 | ||
| <code>Get-StoredCredential -AsCredentialObject</code><br />
 | ||
| <code>$cred = Get-StoredCredential -Target 192.168.3.99</code><br />
 | ||
| <code>Enter-PSSession -ComputerName 192.168.3.99 -Credential $cred -Authentication Negotiate</code><br />
 | ||
| <code>Enter-PSSession -ComputerName 192.168.3.99 -Credential $cred -Authentication Basic -Port 5985</code>
 | ||
| работает при отключении allowunencrypted на стороне сервера и
 | ||
| клиента<br />
 | ||
| <code>winrs -r:http://192.168.3.100:5985/wsman -u:WinRM-Writer -p:123098 ipconfig</code>
 | ||
| передать команду через winrs (-?)<br />
 | ||
| <code>winrs -r:https://192.168.3.100:5985/wsman -u:WinRM-Writer -p:123098 -ssl ipconfig</code>
 | ||
| через https<br />
 | ||
| <code>pwsh -Command "Install-Module -Name PSWSMan"</code> установить
 | ||
| модуль для использования в Linux системе</p>
 | ||
| <h3 id="kerberos">Kerberos</h3>
 | ||
| <p><code>.\CheckMaxTokenSize.ps1 -Principals login -OSEmulation $true -Details $true</code>
 | ||
| узнать размер токена пользователя в домене<br />
 | ||
| <code>Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters | select maxtokensize</code>
 | ||
| максимальный размер токена на сервере<br />
 | ||
| <code>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters</code>
 | ||
| изменить размера, если заголовок пакета аутентификации превышает 16 Кб
 | ||
| (из за большого кол-ва групп)<br />
 | ||
| <code>MaxFieldLength увеличить до 0000ffff (65535)</code><br />
 | ||
| <code>MaxRequestBytes увеличить до 0000ffff (65535)</code></p>
 | ||
| <h1 id="packagemanagement">PackageManagement</h1>
 | ||
| <p><code>Import-Module PackageManagement</code> импортировать
 | ||
| модуль<br />
 | ||
| <code>Get-Module PackageManagement</code> информация о модуле<br />
 | ||
| <code>Get-Command -Module PackageManagement</code> отобразить все
 | ||
| командлеты модуля<br />
 | ||
| <code>Get-Package</code> отобразить все установленные пакеты
 | ||
| PowerShellGallery<br />
 | ||
| <code>Get-Package -ProviderName msi,Programs</code> список установленных
 | ||
| программ
 | ||
| <code>[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12</code>
 | ||
| включить использование протокол TLS 1.2 (если не отключены протоколы TLS
 | ||
| 1.0 и 1.1)<br />
 | ||
| <code>Find-PackageProvider</code> поиск провайдеров<br />
 | ||
| <code>Install-PackageProvider PSGallery -force</code> установить
 | ||
| источник<br />
 | ||
| <code>Install-PackageProvider NuGet -force</code><br />
 | ||
| <code>Install-PackageProvider Chocolatey -force</code><br />
 | ||
| <code>Get-PackageSource</code> источники установки пакетов<br />
 | ||
| <code>Set-PackageSource -Name PSGallery -Trusted</code> по
 | ||
| умолчанию<br />
 | ||
| <code>Find-Package -Name *Veeam* -Source PSGallery</code> поиск пакетов
 | ||
| с указанием источника<br />
 | ||
| <code>Install-Package -Name VeeamLogParser -ProviderName PSGallery -scope CurrentUser</code><br />
 | ||
| <code>Get-Command *Veeam*</code><br />
 | ||
| <code>Import-Module -Name VeeamLogParser</code> загрузить модуль<br />
 | ||
| <code>Get-Module VeeamLogParser | select -ExpandProperty ExportedCommands</code>
 | ||
| отобразить список функций</p>
 | ||
| <h3 id="winget">winget</h3>
 | ||
| <p><a href="https://github.com/microsoft/winget-cli">Source</a> <a
 | ||
| href="https://winget.run">Web</a></p>
 | ||
| <p><code>winget list</code> список установленных пакетов<br />
 | ||
| <code>winget search VLC</code> найти пакет<br />
 | ||
| <code>winget show VideoLAN.VLC</code> информация о пакете<br />
 | ||
| <code>winget show VideoLAN.VLC --versions</code> список доступных версий
 | ||
| в репозитории<br />
 | ||
| <code>winget install VideoLAN.VLC</code> установить пакет<br />
 | ||
| <code>winget uninstall VideoLAN.VLC</code> удалить пакет<br />
 | ||
| <code>winget download jqlang.jq</code> загрузкить пакет
 | ||
| (https://github.com/jqlang/jq/releases/download/jq-1.7/jq-windows-amd64.exe)<br />
 | ||
| <code>winget install jqlang.jq</code> добавляет в переменную среду и
 | ||
| псевдоним командной строки jq<br />
 | ||
| <code>winget uninstall jqlang.jq</code></p>
 | ||
| <h3 id="jqlang-install">jqlang-install</h3>
 | ||
| <div class="sourceCode" id="cb157"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb157-1"><a href="#cb157-1" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>uri<span class="op">]</span><span class="va">$url</span> <span class="op">=</span> <span class="op">$($(</span><span class="fu">irm</span> https<span class="op">://</span>api<span class="op">.</span><span class="fu">github</span><span class="op">.</span><span class="fu">com</span><span class="op">/</span>repos<span class="op">/</span>jqlang<span class="op">/</span>jq<span class="op">/</span>releases<span class="op">/</span>latest<span class="op">).</span><span class="fu">assets</span><span class="op">.</span><span class="fu">browser_download_url</span> <span class="op">-match</span> <span class="st">"windows-amd64"</span><span class="op">).</span><span class="fu">ToString</span><span class="op">()</span> <span class="co"># получить версию latest на GitHub</span></span>
 | ||
| <span id="cb157-2"><a href="#cb157-2" aria-hidden="true" tabindex="-1"></a><span class="fu">irm</span> <span class="va">$url</span> <span class="op">-</span>OutFile <span class="st">"C:\Windows\System32\jq.exe"</span> <span class="co"># загрузить jq.exe</span></span></code></pre></div>
 | ||
| <h3 id="scoop">Scoop</h3>
 | ||
| <p><code>Set-ExecutionPolicy RemoteSigned -Scope CurrentUser</code><br />
 | ||
| <code>irm get.scoop.sh | iex</code> установка<br />
 | ||
| <code>scoop help</code><br />
 | ||
| <code>scoop search jq</code><br />
 | ||
| <code>scoop info jq</code><br />
 | ||
| <code>(scoop info jq).version</code><br />
 | ||
| <code>scoop cat jq</code><br />
 | ||
| <code>scoop download jq</code> C:<br />
 | ||
| <code>scoop install jq</code> C:\1.7<br />
 | ||
| <code>scoop list</code><br />
 | ||
| <code>(scoop list).version</code><br />
 | ||
| <code>scoop uninstall jq</code></p>
 | ||
| <h3 id="chocolatey">Chocolatey</h3>
 | ||
| <div class="sourceCode" id="cb158"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb158-1"><a href="#cb158-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Set-ExecutionPolicy</span> Bypass <span class="op">-</span>Scope <span class="cf">Process</span> <span class="op">-</span>Force<span class="op">;</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">ServicePointManager</span><span class="op">]::</span>SecurityProtocol <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">ServicePointManager</span><span class="op">]::</span>SecurityProtocol <span class="op">-bor</span> <span class="dv">3072</span><span class="op">;</span> <span class="fu">iex</span> <span class="op">((</span><span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">WebClient</span><span class="op">).</span><span class="fu">DownloadString</span><span class="op">(</span><span class="st">'https://community.chocolatey.org/install.ps1'</span><span class="op">))</span></span></code></pre></div>
 | ||
| <p><code>choco -v</code><br />
 | ||
| <code>choco -help</code><br />
 | ||
| <code>choco list</code><br />
 | ||
| <code>choco install adobereader</code></p>
 | ||
| <h1 id="nuget">NuGet</h1>
 | ||
| <p><code>Invoke-RestMethod https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -OutFile "$home\Documents\nuget.exe"</code><br />
 | ||
| <code>Invoke-Expression "$home\Documents\nuget.exe search Selenium.WebDriver"</code><br />
 | ||
| <code>Invoke-Expression "$home\Documents\nuget.exe install Selenium.WebDriver"</code><br />
 | ||
| <code>Get-Item $home\Documents\*Selenium*</code></p>
 | ||
| <p><code>& "$home\Documents\nuget.exe" list console-translate</code><br />
 | ||
| <code>$nuget_api_key = "<API-KEY>"</code><br />
 | ||
| <code>$source = "https://api.nuget.org/v3/index.json"</code><br />
 | ||
| <code>$Name = "Console-Translate"</code><br />
 | ||
| <code>$path = "$home\Documents\$Name"</code><br />
 | ||
| <code>New-Item -Type Directory $path</code><br />
 | ||
| <code>Copy-Item "$home\Documents\Git\$Name\$Name\0.2\*" "$path\"</code><br />
 | ||
| <code>Copy-Item "$home\Documents\Git\$Name\LICENSE" "$path\"</code><br />
 | ||
| <code>Copy-Item "$home\Documents\Git\$Name\README.md" "$path\"</code></p>
 | ||
| <div class="sourceCode" id="cb159"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb159-1"><a href="#cb159-1" aria-hidden="true" tabindex="-1"></a><span class="st">'<?xml version="1.0"?></span></span>
 | ||
| <span id="cb159-2"><a href="#cb159-2" aria-hidden="true" tabindex="-1"></a><span class="st"><package ></span></span>
 | ||
| <span id="cb159-3"><a href="#cb159-3" aria-hidden="true" tabindex="-1"></a><span class="st">  <metadata></span></span>
 | ||
| <span id="cb159-4"><a href="#cb159-4" aria-hidden="true" tabindex="-1"></a><span class="st">    <id>Console-Translate</id></span></span>
 | ||
| <span id="cb159-5"><a href="#cb159-5" aria-hidden="true" tabindex="-1"></a><span class="st">    <version>0.2.2</version></span></span>
 | ||
| <span id="cb159-6"><a href="#cb159-6" aria-hidden="true" tabindex="-1"></a><span class="st">    <authors>Lifailon</authors></span></span>
 | ||
| <span id="cb159-7"><a href="#cb159-7" aria-hidden="true" tabindex="-1"></a><span class="st">    <owners>Lifailon</owners></span></span>
 | ||
| <span id="cb159-8"><a href="#cb159-8" aria-hidden="true" tabindex="-1"></a><span class="st">    <description>Cross-platform client for translating text in the console, uses API Google (edded public free token), MyMemory and DeepLX (no token required)</description></span></span>
 | ||
| <span id="cb159-9"><a href="#cb159-9" aria-hidden="true" tabindex="-1"></a><span class="st">    <tags>PowerShell, Module, Translate, api</tags></span></span>
 | ||
| <span id="cb159-10"><a href="#cb159-10" aria-hidden="true" tabindex="-1"></a><span class="st">    <projectUrl>https://github.com/Lifailon/Console-Translate</projectUrl></span></span>
 | ||
| <span id="cb159-11"><a href="#cb159-11" aria-hidden="true" tabindex="-1"></a><span class="st">    <contentFiles></span></span>
 | ||
| <span id="cb159-12"><a href="#cb159-12" aria-hidden="true" tabindex="-1"></a><span class="st">      <files include="Console-Translate.psm1" buildAction="Content" /></span></span>
 | ||
| <span id="cb159-13"><a href="#cb159-13" aria-hidden="true" tabindex="-1"></a><span class="st">      <files include="Console-Translate.psd1" buildAction="Content" /></span></span>
 | ||
| <span id="cb159-14"><a href="#cb159-14" aria-hidden="true" tabindex="-1"></a><span class="st">      <files include="lang-iso-639-1.csv" buildAction="Content" /></span></span>
 | ||
| <span id="cb159-15"><a href="#cb159-15" aria-hidden="true" tabindex="-1"></a><span class="st">      <files include="README.md" buildAction="Content" /></span></span>
 | ||
| <span id="cb159-16"><a href="#cb159-16" aria-hidden="true" tabindex="-1"></a><span class="st">      <files include="LICENSE" buildAction="Content" /></span></span>
 | ||
| <span id="cb159-17"><a href="#cb159-17" aria-hidden="true" tabindex="-1"></a><span class="st">    </contentFiles></span></span>
 | ||
| <span id="cb159-18"><a href="#cb159-18" aria-hidden="true" tabindex="-1"></a><span class="st">  </metadata></span></span>
 | ||
| <span id="cb159-19"><a href="#cb159-19" aria-hidden="true" tabindex="-1"></a><span class="st"></package>'</span> <span class="op">></span> <span class="st">"</span><span class="va">$path</span><span class="st">\</span><span class="va">$Name</span><span class="st">.nuspec"</span></span></code></pre></div>
 | ||
| <p><code>Set-Location $path</code><br />
 | ||
| <code>& "$home\Documents\nuget.exe" pack "$path\$Name.nuspec"</code><br />
 | ||
| <code>& "$home\Documents\nuget.exe" push "$path\$Name.0.2.2.nupkg" -ApiKey $nuget_api_key -Source $source</code><br />
 | ||
| <code>& "$home\Documents\nuget.exe" push "$path\$Name.0.2.2.nupkg" -ApiKey $nuget_api_key -Source $source -SkipDuplicate</code></p>
 | ||
| <p><code>Install-Package Console-Translate -Source nuget.org</code><br />
 | ||
| <code>Get-Package Console-Translate | select *</code></p>
 | ||
| <p><code>Register-PSRepository -Name "NuGet" -SourceLocation "https://www.nuget.org/api/v2" -InstallationPolicy Trusted</code><br />
 | ||
| <code>Get-PSRepository</code><br />
 | ||
| <code>Find-Module -Name Console-Translate</code><br />
 | ||
| <code>Install-Module Console-Translate -Repository NuGet</code></p>
 | ||
| <p><code>& "$home\Documents\nuget.exe" delete Console-Translate 0.2.0 -Source https://api.nuget.org/v3/index.json -ApiKey $nuget_api_key -NoPrompt</code></p>
 | ||
| <h1 id="git">Git</h1>
 | ||
| <p><code>git --version</code><br />
 | ||
| <code>git config --global user.name "Lifailon"</code> добавить имя для
 | ||
| коммитов<br />
 | ||
| <code>git config --global user.email "lifailon@yandex.ru"</code><br />
 | ||
| <code>git config --global --edit</code><br />
 | ||
| <code>ssh-keygen -t rsa -b 4096</code><br />
 | ||
| <code>Get-Service | where name -match "ssh-agent" | Set-Service -StartupType Automatic</code><br />
 | ||
| <code>Get-Service | where name -match "ssh-agent" | Start-Service</code><br />
 | ||
| <code>Get-Service | where name -match "ssh-agent" | select Name,Status,StartType</code><br />
 | ||
| <code>ssh-agent</code><br />
 | ||
| <code>ssh-add C:\Users\Lifailon\.ssh\id_rsa</code><br />
 | ||
| <code>cat ~\.ssh\id_rsa.pub | Set-Clipboard</code> copy to
 | ||
| https://github.com/settings/keys<br />
 | ||
| <code>cd $home\Documents\Git</code><br />
 | ||
| <code>git clone git@github.com:Lifailon/PowerShell-Commands</code><br />
 | ||
| <code>cd PowerShell-Commands</code><br />
 | ||
| <code>git grep powershell</code> поиск текста в файлах<br />
 | ||
| <code>git pull</code> синхронизировать изменения из хранилища<br />
 | ||
| <code>git status</code> отобразить статус изменений по файлам<br />
 | ||
| <code>git diff</code> отобразить изменения построчно<br />
 | ||
| <code>git add .</code> добавить (проиндексировать) изменения во всех
 | ||
| файлах<br />
 | ||
| <code>git commit -m "added file and changed file"</code> сохранить
 | ||
| изменения с комментарием<br />
 | ||
| <code>git push</code> синхронизировать локальные изменения с
 | ||
| репозиторием<br />
 | ||
| <code>git branch dev</code> создать новую ветку<br />
 | ||
| <code>git switch dev</code> переключиться на другую ветку<br />
 | ||
| <code>git push --set-upstream origin dev</code> добавить ветку<br />
 | ||
| <code>git branch -d dev</code> удалить ветку<br />
 | ||
| <code>git diff rsa</code> сравнить файлы текущей ветки с файлами в
 | ||
| указанной ветки rsa<br />
 | ||
| <code>git merge dev</code> слияние текущей ветки (rsa/master) с
 | ||
| указанной (dev)<br />
 | ||
| <code>git log --oneline --all</code> лог коммитов<br />
 | ||
| <code>git log --graph</code> коммиты и следование веток<br />
 | ||
| <code>git show d01f09dead3a6a8d75dda848162831c58ca0ee13</code>
 | ||
| отобразить подробный лог по номеру коммита<br />
 | ||
| <code>git checkout filename</code> откатить изменения, если не было
 | ||
| команды add<br />
 | ||
| <code>git checkout d01f09dead3a6a8d75dda848162831c58ca0ee13</code>
 | ||
| переключить локальные файлы рабочей копии на указанный коммит (изменить
 | ||
| HEAD на указанный коммит)<br />
 | ||
| <code>git reset HEAD filename</code> откатить изменения последнего
 | ||
| индекса, если был add но не было commit, тем самым вернуться до
 | ||
| последней зафиксированный версии (коммита) и потом выполнить
 | ||
| checkout<br />
 | ||
| <code>git reset --mixed HEAD filename</code> изменения, содержащиеся в
 | ||
| отменяемом коммите, не должны исчезнуть, они будут сохранены в виде
 | ||
| локальных изменений в рабочей копии<br />
 | ||
| <code>git restore filename</code> отменить все локальные изменения в
 | ||
| рабочей копии<br />
 | ||
| <code>git restore --source d01f09dead3a6a8d75dda848162831c58ca0ee13 filename</code>
 | ||
| восстановить файл на указанную версию по хэшу индентификатора
 | ||
| коммита<br />
 | ||
| <code>git revert HEAD --no-edit</code> отменить последний коммит, без
 | ||
| указания комментария (события записываются в git log)<br />
 | ||
| <code>git reset --hard d01f09dead3a6a8d75dda848162831c58ca0ee13</code>
 | ||
| удалить все коммиты до указанного (и откатиться до него)</p>
 | ||
| <h1 id="dsc">DSC</h1>
 | ||
| <p><code>Import-Module PSDesiredStateConfiguration</code><br />
 | ||
| <code>Get-Command -Module PSDesiredStateConfiguration</code><br />
 | ||
| <code>(Get-Module PSDesiredStateConfiguration).ExportedCommands</code><br />
 | ||
| <code>Get-DscLocalConfigurationManager</code></p>
 | ||
| <p><code>Get-DscResource</code><br />
 | ||
| <code>Get-DscResource -Name File -Syntax</code>
 | ||
| https://learn.microsoft.com/ru-ru/powershell/dsc/reference/resources/windows/fileresource?view=dsc-1.1</p>
 | ||
| <p><code>Ensure = Present</code> настройка должна быть включена (каталог
 | ||
| должен присутствовать, процесс должен быть запущен, если нет – создать,
 | ||
| запустить)<br />
 | ||
| <code>Ensure = Absent</code> настройка должна быть выключена (каталога
 | ||
| быть не должно, процесс не должен быть запущен, если нет – удалить,
 | ||
| остановить)</p>
 | ||
| <div class="sourceCode" id="cb160"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb160-1"><a href="#cb160-1" aria-hidden="true" tabindex="-1"></a>Configuration TestConfiguraion</span>
 | ||
| <span id="cb160-2"><a href="#cb160-2" aria-hidden="true" tabindex="-1"></a><span class="op">{</span></span>
 | ||
| <span id="cb160-3"><a href="#cb160-3" aria-hidden="true" tabindex="-1"></a>    Ctrl<span class="op">+</span>Space</span>
 | ||
| <span id="cb160-4"><a href="#cb160-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb160-5"><a href="#cb160-5" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb160-6"><a href="#cb160-6" aria-hidden="true" tabindex="-1"></a>Configuration DSConfigurationProxy </span>
 | ||
| <span id="cb160-7"><a href="#cb160-7" aria-hidden="true" tabindex="-1"></a><span class="op">{</span></span>
 | ||
| <span id="cb160-8"><a href="#cb160-8" aria-hidden="true" tabindex="-1"></a>    Node vproxy-01 </span>
 | ||
| <span id="cb160-9"><a href="#cb160-9" aria-hidden="true" tabindex="-1"></a>    <span class="op">{</span></span>
 | ||
| <span id="cb160-10"><a href="#cb160-10" aria-hidden="true" tabindex="-1"></a>        File CreateDir</span>
 | ||
| <span id="cb160-11"><a href="#cb160-11" aria-hidden="true" tabindex="-1"></a>        <span class="op">{</span></span>
 | ||
| <span id="cb160-12"><a href="#cb160-12" aria-hidden="true" tabindex="-1"></a>            Ensure <span class="op">=</span> <span class="st">"Present"</span></span>
 | ||
| <span id="cb160-13"><a href="#cb160-13" aria-hidden="true" tabindex="-1"></a>            <span class="fu">Type</span> <span class="op">=</span> <span class="st">"Directory"</span></span>
 | ||
| <span id="cb160-14"><a href="#cb160-14" aria-hidden="true" tabindex="-1"></a>            DestinationPath <span class="op">=</span> <span class="st">"C:\Temp"</span></span>
 | ||
| <span id="cb160-15"><a href="#cb160-15" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb160-16"><a href="#cb160-16" aria-hidden="true" tabindex="-1"></a>        Service StopW32time</span>
 | ||
| <span id="cb160-17"><a href="#cb160-17" aria-hidden="true" tabindex="-1"></a>        <span class="op">{</span></span>
 | ||
| <span id="cb160-18"><a href="#cb160-18" aria-hidden="true" tabindex="-1"></a>            Name <span class="op">=</span> <span class="st">"w32time"</span></span>
 | ||
| <span id="cb160-19"><a href="#cb160-19" aria-hidden="true" tabindex="-1"></a>            State <span class="op">=</span> <span class="st">"Stopped"</span><span class="ch">` </span>Running</span>
 | ||
| <span id="cb160-20"><a href="#cb160-20" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb160-21"><a href="#cb160-21" aria-hidden="true" tabindex="-1"></a>        WindowsProcess RunCalc</span>
 | ||
| <span id="cb160-22"><a href="#cb160-22" aria-hidden="true" tabindex="-1"></a>        <span class="op">{</span></span>
 | ||
| <span id="cb160-23"><a href="#cb160-23" aria-hidden="true" tabindex="-1"></a>            Ensure <span class="op">=</span> <span class="st">"Present"</span></span>
 | ||
| <span id="cb160-24"><a href="#cb160-24" aria-hidden="true" tabindex="-1"></a>            Path <span class="op">=</span> <span class="st">"C:\WINDOWS\system32\calc.exe"</span></span>
 | ||
| <span id="cb160-25"><a href="#cb160-25" aria-hidden="true" tabindex="-1"></a>            Arguments <span class="op">=</span> <span class="st">""</span></span>
 | ||
| <span id="cb160-26"><a href="#cb160-26" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb160-27"><a href="#cb160-27" aria-hidden="true" tabindex="-1"></a>        Registry RegSettings</span>
 | ||
| <span id="cb160-28"><a href="#cb160-28" aria-hidden="true" tabindex="-1"></a>        <span class="op">{</span></span>
 | ||
| <span id="cb160-29"><a href="#cb160-29" aria-hidden="true" tabindex="-1"></a>            Ensure <span class="op">=</span> <span class="st">"Present"</span></span>
 | ||
| <span id="cb160-30"><a href="#cb160-30" aria-hidden="true" tabindex="-1"></a>            Key <span class="op">=</span> <span class="st">"HKEY_LOCAL_MACHINE\SOFTWARE\MySoft"</span></span>
 | ||
| <span id="cb160-31"><a href="#cb160-31" aria-hidden="true" tabindex="-1"></a>            ValueName <span class="op">=</span> <span class="st">"TestName"</span></span>
 | ||
| <span id="cb160-32"><a href="#cb160-32" aria-hidden="true" tabindex="-1"></a>            ValueData <span class="op">=</span> <span class="st">"TestValue"</span></span>
 | ||
| <span id="cb160-33"><a href="#cb160-33" aria-hidden="true" tabindex="-1"></a>            ValueType <span class="op">=</span> <span class="st">"String"</span></span>
 | ||
| <span id="cb160-34"><a href="#cb160-34" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb160-35"><a href="#cb160-35" aria-hidden="true" tabindex="-1"></a><span class="co">#       WindowsFeature IIS</span></span>
 | ||
| <span id="cb160-36"><a href="#cb160-36" aria-hidden="true" tabindex="-1"></a><span class="co">#       {</span></span>
 | ||
| <span id="cb160-37"><a href="#cb160-37" aria-hidden="true" tabindex="-1"></a><span class="co">#            Ensure = "Present"</span></span>
 | ||
| <span id="cb160-38"><a href="#cb160-38" aria-hidden="true" tabindex="-1"></a><span class="co">#            Name = "Web-Server"</span></span>
 | ||
| <span id="cb160-39"><a href="#cb160-39" aria-hidden="true" tabindex="-1"></a><span class="co">#       }</span></span>
 | ||
| <span id="cb160-40"><a href="#cb160-40" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb160-41"><a href="#cb160-41" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>$Path = (DSConfigurationProxy).DirectoryName</code><br />
 | ||
| <code>Test-DscConfiguration -Path $Path | select *</code>
 | ||
| ResourcesInDesiredState - уже настроено, ResourcesNotInDesiredState - не
 | ||
| настроено (не соответствует)<br />
 | ||
| <code>Start-DscConfiguration -Path $Path</code><br />
 | ||
| <code>Get-Job</code><br />
 | ||
| <code>$srv = "vproxy-01"</code><br />
 | ||
| <code>Get-Service -ComputerName $srv | ? name -match w32time # Start-Service</code><br />
 | ||
| <code>icm $srv {Get-Process | ? ProcessName -match calc} | ft # Stop-Process -Force</code><br />
 | ||
| <code>icm $srv {ls C:\ | ? name -match Temp} | ft</code>
 | ||
| rm<code>```PowerShell 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"             }         }     } } ```</code>$Path
 | ||
| =
 | ||
| (InstallPowerShellCore).DirectoryName<code>\</code>Test-DscConfiguration
 | ||
| -Path $Path<code>\</code>Start-DscConfiguration -Path $path -Wait
 | ||
| -Verbose<code>\</code>Get-Job`</p>
 | ||
| <h1 id="ansible">Ansible</h1>
 | ||
| <p><code>apt -y update && apt -y upgrade</code><br />
 | ||
| <code>apt -y install ansible</code> v2.10.8<br />
 | ||
| <code>apt -y install ansible-core</code> v2.12.0<br />
 | ||
| <code>apt -y install sshpass</code></p>
 | ||
| <p><code>ansible-galaxy collection install ansible.windows</code>
 | ||
| установить коллекцию модулей<br />
 | ||
| <code>ansible-galaxy collection install community.windows</code><br />
 | ||
| <code>ansible-galaxy collection list | grep windows</code><br />
 | ||
| <code>ansible-config dump | grep DEFAULT_MODULE_PATH</code> путь
 | ||
| хранения модулей</p>
 | ||
| <p><code>apt-get -y install python-dev libkrb5-dev krb5-user</code>
 | ||
| пакеты для Kerberos аутентификации<br />
 | ||
| <code>apt install python3-pip</code><br />
 | ||
| <code>pip3 install requests-kerberos</code><br />
 | ||
| <code>nano /etc/krb5.conf</code> настроить [realms] и
 | ||
| [domain_realm]<br />
 | ||
| <code>kinit -C support4@domail.local</code><br />
 | ||
| <code>klist</code></p>
 | ||
| <p><code>ansible --version</code><br />
 | ||
| <code>config file = None</code><br />
 | ||
| <code>nano /etc/ansible/ansible.cfg</code> файл конфигурации</p>
 | ||
| <pre><code>[defaults]
 | ||
| inventory = /etc/ansible/hosts
 | ||
| # uncomment this to disable SSH key host checking
 | ||
| # Отключить проверку ключа ssh (для подключения используя пароль)
 | ||
| host_key_checking = False</code></pre>
 | ||
| <p><code>nano /etc/ansible/hosts</code></p>
 | ||
| <pre><code>[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
 | ||
| #ansible_user=support4@DOMAIN.LOCAL
 | ||
| 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</code></pre>
 | ||
| <p><code>ansible-inventory --list</code> проверить конфигурацию (читает
 | ||
| в формате JSON) или YAML (-y) с просмотром все применяемых
 | ||
| переменных</p>
 | ||
| <h1 id="modules-1">Modules</h1>
 | ||
| <p><code>ansible us -m ping</code><br />
 | ||
| <code>ansible win_ssh -m ping</code><br />
 | ||
| <code>ansible us -m shell -a "uptime && df -h | grep lv"</code><br />
 | ||
| <code>ansible us -m setup | grep -iP "mem|proc"</code> информация о
 | ||
| железе<br />
 | ||
| <code>ansible us -m apt -a "name=mc" -b</code> повысить привилегии sudo
 | ||
| (-b)<br />
 | ||
| <code>ansible us -m service -a "name=ssh state=restarted enabled=yes" -b</code>
 | ||
| перезапустить службу<br />
 | ||
| <code>echo "echo test" > test.sh</code><br />
 | ||
| <code>ansible us -m copy -a "src=test.sh dest=/root mode=777" -b</code><br />
 | ||
| <code>ansible us -a "ls /root" -b</code><br />
 | ||
| <code>ansible us -a "cat /root/test.sh" -b</code></p>
 | ||
| <p><code>ansible-doc -l | grep win_</code> список всех модулей Windows
 | ||
| (https://docs.ansible.com/ansible/latest/collections/ansible/windows/)<br />
 | ||
| <code>ansible ws -m win_ping</code> windows модуль<br />
 | ||
| <code>ansible ws -m win_ping -u WinRM-Writer</code> указать логин<br />
 | ||
| <code>ansible ws -m setup</code> собрать подробную информацию о
 | ||
| системе<br />
 | ||
| <code>ansible ws -m win_whoami</code> информация о правах доступах,
 | ||
| группах доступа<br />
 | ||
| <code>ansible ws -m win_shell -a '$PSVersionTable'</code><br />
 | ||
| <code>ansible ws -m win_shell -a 'Get-Service | where name -match "ssh|winrm"'</code><br />
 | ||
| <code>ansible ws -m win_service -a "name=sshd state=stopped"</code><br />
 | ||
| <code>ansible ws -m win_service -a "name=sshd state=started"</code></p>
 | ||
| <h3 id="win_shell-varsdebug">win_shell (vars/debug)</h3>
 | ||
| <p><code>nano /etc/ansible/PowerShell-Vars.yml</code></p>
 | ||
| <pre><code>- 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</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/PowerShell-Vars.yml</code><br />
 | ||
| <code>ansible-playbook /etc/ansible/PowerShell-Vars.yml --extra-vars "SearchName='LogLevel|Syslog'"</code>
 | ||
| передать переменную</p>
 | ||
| <h3 id="win_powershell">win_powershell</h3>
 | ||
| <p><code>nano /etc/ansible/powershell-param.yml</code></p>
 | ||
| <pre><code>- 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</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/powershell-param.yml</code></p>
 | ||
| <h3 id="win_chocolatey">win_chocolatey</h3>
 | ||
| <p><code>nano /etc/ansible/setup-adobe-acrobat.yml</code></p>
 | ||
| <pre><code>- hosts: ws
 | ||
|   tasks:
 | ||
|   - name: Install Acrobat Reader
 | ||
|     win_chocolatey:
 | ||
|       name: adobereader
 | ||
|       state: present</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/setup-adobe-acrobat.yml</code></p>
 | ||
| <p><code>nano /etc/ansible/setup-openssh.yml</code></p>
 | ||
| <pre><code>- hosts: ws
 | ||
|   tasks:
 | ||
|   - name: install the Win32-OpenSSH service
 | ||
|     win_chocolatey:
 | ||
|       name: openssh
 | ||
|       package_params: /SSHServerFeature
 | ||
|       state: present</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/setup-openssh.yml</code></p>
 | ||
| <h3 id="win_regedit">win_regedit</h3>
 | ||
| <p><code>nano /etc/ansible/win-set-shell-ssh-ps7.yml</code></p>
 | ||
| <pre><code>- 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</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/win-set-shell-ssh-ps7.yml</code></p>
 | ||
| <h3 id="win_service">win_service</h3>
 | ||
| <p><code>nano /etc/ansible/win-service.yml</code></p>
 | ||
| <pre><code>- hosts: ws
 | ||
|   tasks:
 | ||
|   - name: Start service
 | ||
|     win_service:
 | ||
|       name: sshd
 | ||
|       state: started
 | ||
| #     state: stopped
 | ||
| #     state: restarted
 | ||
| #     start_mode: auto</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/win-service.yml</code></p>
 | ||
| <h3 id="win_service_info">win_service_info</h3>
 | ||
| <p><code>nano /etc/ansible/get-service.yml</code></p>
 | ||
| <pre><code>- 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</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/get-service.yml</code></p>
 | ||
| <h3 id="fetchslurp">fetch/slurp</h3>
 | ||
| <p><code>nano /etc/ansible/copy-from-win-to-local.yml</code></p>
 | ||
| <pre><code>- 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 }}"</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/copy-from-win-to-local.yml</code></p>
 | ||
| <h3 id="win_copy">win_copy</h3>
 | ||
| <p><code>echo "Get-Service | where name -eq vss | Start-Service" > /home/lifailon/Start-Service-VSS.ps1</code><br />
 | ||
| <code>nano /etc/ansible/copy-file-to-win.yml</code></p>
 | ||
| <pre><code>- 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</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/copy-file-to-win.yml</code></p>
 | ||
| <p><code>curl -OL https://github.com/PowerShell/PowerShell/releases/download/v7.3.6/PowerShell-7.3.6-win-x64.msi</code><br />
 | ||
| <code>nano /etc/ansible/copy-file-to-win.yml</code></p>
 | ||
| <pre><code>- 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</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/copy-file-to-win.yml</code></p>
 | ||
| <h3 id="win_command">win_command</h3>
 | ||
| <p><code>nano /etc/ansible/run-script-ps1.yml</code></p>
 | ||
| <pre><code>- hosts: ws
 | ||
|   tasks:
 | ||
|   - name: Run PowerShell Script
 | ||
|     win_command: powershell -ExecutionPolicy ByPass -File C:\Users\Lifailon\Desktop\Start-Service-VSS.ps1</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/run-script-ps1.yml</code></p>
 | ||
| <h3 id="win_package">win_package</h3>
 | ||
| <p><code>nano /etc/ansible/setup-msi-package.yml</code></p>
 | ||
| <pre><code>- 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</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/setup-msi-package.yml</code></p>
 | ||
| <h3 id="win_firewall_rule">win_firewall_rule</h3>
 | ||
| <p><code>nano /etc/ansible/win-fw-open.yml</code></p>
 | ||
| <pre><code>- 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</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/win-fw-open.yml</code></p>
 | ||
| <h3 id="win_group">win_group</h3>
 | ||
| <p><code>nano /etc/ansible/win-creat-group.yml</code></p>
 | ||
| <pre><code>- hosts: ws
 | ||
|   tasks:
 | ||
|   - name: Create a new group
 | ||
|     win_group:
 | ||
|       name: deploy
 | ||
|       description: Deploy Group
 | ||
|       state: present</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/win-creat-group.yml</code></p>
 | ||
| <h3 id="win_group_membership">win_group_membership</h3>
 | ||
| <p><code>nano /etc/ansible/add-user-to-group.yml</code></p>
 | ||
| <pre><code>- hosts: ws
 | ||
|   tasks:
 | ||
|   - name: Add a local and domain user to a local group
 | ||
|     win_group_membership:
 | ||
|       name: deploy
 | ||
|       members:
 | ||
|         - WinRM-Writer
 | ||
|       state: present</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/add-user-to-group.yml</code></p>
 | ||
| <h3 id="win_user">win_user</h3>
 | ||
| <p><code>nano /etc/ansible/creat-win-user.yml</code></p>
 | ||
| <pre><code>- hosts: ws
 | ||
|   tasks:
 | ||
|   - name: Creat user
 | ||
|     win_user:
 | ||
|       name: test
 | ||
|       password: 123098
 | ||
|       state: present
 | ||
|       groups:
 | ||
|         - deploy</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/creat-win-user.yml</code></p>
 | ||
| <p><code>nano /etc/ansible/delete-win-user.yml</code></p>
 | ||
| <pre><code>- hosts: ws
 | ||
|   tasks:
 | ||
|   - name: Delete user
 | ||
|     ansible.windows.win_user:
 | ||
|       name: test
 | ||
|       state: absent</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/delete-win-user.yml</code></p>
 | ||
| <h3 id="win_feature">win_feature</h3>
 | ||
| <p><code>nano /etc/ansible/install-feature.yml</code></p>
 | ||
| <pre><code>- hosts: ws
 | ||
|   tasks:
 | ||
|   - name: Install Windows Feature
 | ||
|       win_feature:
 | ||
|         name: SNMP-Service
 | ||
|         state: present</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/install-feature.yml</code></p>
 | ||
| <h3 id="win_reboot">win_reboot</h3>
 | ||
| <p><code>nano /etc/ansible/win-reboot.yml</code></p>
 | ||
| <pre><code>- hosts: ws
 | ||
|   tasks:
 | ||
|   - name: Reboot a slow machine that might have lots of updates to apply
 | ||
|     win_reboot:
 | ||
|       reboot_timeout: 3600</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/win-reboot.yml</code></p>
 | ||
| <h3 id="win_find">win_find</h3>
 | ||
| <p><code>nano /etc/ansible/win-ls.yml</code></p>
 | ||
| <pre><code>- 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</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/win-ls.yml</code></p>
 | ||
| <h3 id="win_uri">win_uri</h3>
 | ||
| <p><code>nano /etc/ansible/rest-get.yml</code></p>
 | ||
| <pre><code>- 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</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/rest-get.yml</code></p>
 | ||
| <h3 id="win_updates">win_updates</h3>
 | ||
| <p><code>nano /etc/ansible/win-update.yml</code></p>
 | ||
| <pre><code>- 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</code></pre>
 | ||
| <p><code>ansible-playbook /etc/ansible/win-update.yml</code></p>
 | ||
| <h3 id="win_chocolatey-1">win_chocolatey</h3>
 | ||
| <p>https://chocolatey.org/install<br />
 | ||
| https://community.chocolatey.org/api/v2/package/chocolatey<br />
 | ||
| https://docs.chocolatey.org/en-us/guides/organizations/organizational-deployment-guide</p>
 | ||
| <pre><code>- name: Ensure Chocolatey installed from internal repo
 | ||
|   win_chocolatey:
 | ||
|     name: chocolatey
 | ||
|     state: present
 | ||
|     # source: URL-адрес внутреннего репозитория
 | ||
|     source: https://community.chocolatey.org/api/v2/ChocolateyInstall.ps1</code></pre>
 | ||
| <h1 id="gigachat">GigaChat</h1>
 | ||
| <h3 id="установка-сертификатов">1. Установка сертификатов:</h3>
 | ||
| <p><code>Invoke-WebRequest "https://gu-st.ru/content/lending/russian_trusted_root_ca_pem.crt" -OutFile "$home\Downloads\russian_trusted_root_ca.cer"</code>
 | ||
| скачать сертификат минцифры<br />
 | ||
| <code>Invoke-WebRequest "https://gu-st.ru/content/lending/russian_trusted_sub_ca_pem.crt" -OutFile "$home\Downloads\russian_trusted_sub_ca.cer"</code><br />
 | ||
| <code>Import-Certificate -FilePath "$home\Downloads\russian_trusted_root_ca.cer" -CertStoreLocation "Cert:\CurrentUser\Root"</code>
 | ||
| установить сертификат минцифры<br />
 | ||
| <code>Import-Certificate -FilePath "$home\Downloads\russian_trusted_sub_ca.cer" -CertStoreLocation "Cert:\CurrentUser\CA"</code></p>
 | ||
| <h3
 | ||
| id="авторизация-по-sber-id-и-генерация-новых-авторизационных-данных-для-получения-токена-httpsdevelopers.sber.rustudio-время-жизни-30-минут">2.
 | ||
| Авторизация по Sber ID и генерация новых авторизационных данных для
 | ||
| получения токена: https://developers.sber.ru/studio (время жизни 30
 | ||
| минут)</h3>
 | ||
| <h3
 | ||
| id="формирование-авторизационных-данных-в-формате-base64-из-client-id-и-client-secret">3.
 | ||
| Формирование авторизационных данных в формате Base64 из Client ID и
 | ||
| Client Secret:</h3>
 | ||
| <div class="sourceCode" id="cb186"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb186-1"><a href="#cb186-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Client_ID</span>     <span class="op">=</span> <span class="st">"7e6d2f9f-825e-49b7-98f4-62fbb7506427"</span> <span class="co"># [System.Guid]::Parse("7e6d2f9f-825e-49b7-98f4-62fbb7506427")</span></span>
 | ||
| <span id="cb186-2"><a href="#cb186-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Client_Secret</span> <span class="op">=</span> <span class="st">"c35113ee-6757-47ba-9853-ea1d0d9db1ef"</span> <span class="co"># [System.Guid]::Parse("c35113ee-6757-47ba-9853-ea1d0d9db1ef")</span></span>
 | ||
| <span id="cb186-3"><a href="#cb186-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Client_Join</span>   <span class="op">=</span> <span class="va">$Client_ID</span><span class="op">+</span><span class="st">":"</span><span class="op">+</span><span class="va">$Client_Secret</span> <span class="co"># объединяем два UUID в одну строку, разделяя их символом ':'</span></span>
 | ||
| <span id="cb186-4"><a href="#cb186-4" aria-hidden="true" tabindex="-1"></a><span class="va">$Bytes</span>         <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Text</span><span class="op">.</span><span class="fu">Encoding</span><span class="op">]::</span>UTF8<span class="op">.</span><span class="fu">GetBytes</span><span class="op">(</span><span class="va">$Client_Join</span><span class="op">)</span> <span class="co"># преобразуем строку в массив байт</span></span>
 | ||
| <span id="cb186-5"><a href="#cb186-5" aria-hidden="true" tabindex="-1"></a><span class="va">$Cred_Base64</span>   <span class="op">=</span> <span class="op">[</span>Convert<span class="op">]::</span>ToBase64String<span class="op">(</span><span class="va">$Bytes</span><span class="op">)</span> <span class="co"># кодируем байты в строку Base64</span></span></code></pre></div>
 | ||
| <h3 id="получение-токена">4. Получение токена:</h3>
 | ||
| <p><code>$Cred_Base64   = "N2U2ZDJmOWYtODI1ZS00OWI3LTk4ZjQtNjJmYmI3NTA2NDI3OmIyYzgwZmZmLTEzOGUtNDg1Mi05MjgwLWE2MGI4NTc0YTM2MQ=="</code><br />
 | ||
| <code>$UUID = [System.Guid]::NewGuid()</code> генерируем UUID для
 | ||
| журналирования входящих вызовов и разбора инцидентов</p>
 | ||
| <div class="sourceCode" id="cb187"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb187-1"><a href="#cb187-1" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="st">"https://ngw.devices.sberbank.ru:9443/api/v2/oauth"</span></span>
 | ||
| <span id="cb187-2"><a href="#cb187-2" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb187-3"><a href="#cb187-3" aria-hidden="true" tabindex="-1"></a>    <span class="st">"Authorization"</span> <span class="op">=</span> <span class="st">"Basic </span><span class="va">$Cred_Base64</span><span class="st">"</span></span>
 | ||
| <span id="cb187-4"><a href="#cb187-4" aria-hidden="true" tabindex="-1"></a>    <span class="st">"RqUID"</span> <span class="op">=</span> <span class="st">"</span><span class="va">$UUID</span><span class="st">"</span></span>
 | ||
| <span id="cb187-5"><a href="#cb187-5" aria-hidden="true" tabindex="-1"></a>    <span class="st">"Content-Type"</span> <span class="op">=</span> <span class="st">"application/x-www-form-urlencoded"</span></span>
 | ||
| <span id="cb187-6"><a href="#cb187-6" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb187-7"><a href="#cb187-7" aria-hidden="true" tabindex="-1"></a><span class="va">$body</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb187-8"><a href="#cb187-8" aria-hidden="true" tabindex="-1"></a>    scope <span class="op">=</span> <span class="st">"GIGACHAT_API_PERS"</span></span>
 | ||
| <span id="cb187-9"><a href="#cb187-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb187-10"><a href="#cb187-10" aria-hidden="true" tabindex="-1"></a><span class="va">$GIGA_TOKEN</span> <span class="op">=</span> <span class="op">$(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Method POST <span class="op">-</span>Headers <span class="va">$headers</span> <span class="op">-</span>Body <span class="va">$body</span><span class="op">).</span><span class="fu">access_token</span></span></code></pre></div>
 | ||
| <h3 id="параметры">5. Параметры:</h3>
 | ||
| <div class="sourceCode" id="cb188"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb188-1"><a href="#cb188-1" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$content</span> <span class="op">=</span> <span class="st">"Посчитай сумму чисел: 22+33"</span></span>
 | ||
| <span id="cb188-2"><a href="#cb188-2" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$role</span> <span class="op">=</span> <span class="st">"user"</span> <span class="co"># роль автора сообщения (user/assistant/system)</span></span>
 | ||
| <span id="cb188-3"><a href="#cb188-3" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">float</span><span class="op">]</span><span class="va">$temperature</span> <span class="op">=</span> <span class="dv">0.7</span> <span class="co"># температура выборки в диапазоне от 0 до 2. Чем выше значение, тем более случайным будет ответ модели.</span></span>
 | ||
| <span id="cb188-4"><a href="#cb188-4" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">float</span><span class="op">]</span><span class="va">$top_p</span> <span class="op">=</span> <span class="dv">0.1</span> <span class="co"># используется как альтернатива temperature и изменяется в диапазоне от 0 до 1. Задает вероятностную массу токенов, которые должна учитывать модель. Так, если передать значение 0.1, модель будет учитывать только токены, чья вероятностная масса входит в верхние 10%.</span></span>
 | ||
| <span id="cb188-5"><a href="#cb188-5" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>int64<span class="op">]</span><span class="va">$n</span> <span class="op">=</span> <span class="dv">1</span> <span class="co"># количество вариантов ответов (1..4), которые нужно сгенерировать для каждого входного сообщения</span></span>
 | ||
| <span id="cb188-6"><a href="#cb188-6" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>int64<span class="op">]</span><span class="va">$max_tokens</span> <span class="op">=</span> <span class="dv">512</span> <span class="co"># максимальное количество токенов, которые будут использованы для создания ответов</span></span>
 | ||
| <span id="cb188-7"><a href="#cb188-7" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>boolean<span class="op">]</span><span class="va">$stream</span> <span class="op">=</span> <span class="va">$false</span> <span class="co"># передавать сообщения по частям в потоке</span></span></code></pre></div>
 | ||
| <h3 id="составление-запросов">6. Составление запросов:</h3>
 | ||
| <div class="sourceCode" id="cb189"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb189-1"><a href="#cb189-1" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="st">"https://gigachat.devices.sberbank.ru/api/v1/chat/completions"</span></span>
 | ||
| <span id="cb189-2"><a href="#cb189-2" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb189-3"><a href="#cb189-3" aria-hidden="true" tabindex="-1"></a>    <span class="st">"Authorization"</span> <span class="op">=</span> <span class="st">"Bearer </span><span class="va">$GIGA_TOKEN</span><span class="st">"</span></span>
 | ||
| <span id="cb189-4"><a href="#cb189-4" aria-hidden="true" tabindex="-1"></a>    <span class="st">"Content-Type"</span> <span class="op">=</span> <span class="st">"application/json"</span></span>
 | ||
| <span id="cb189-5"><a href="#cb189-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb189-6"><a href="#cb189-6" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb189-7"><a href="#cb189-7" aria-hidden="true" tabindex="-1"></a><span class="op">$(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="st">"https://gigachat.devices.sberbank.ru/api/v1/models"</span> <span class="op">-</span>Headers <span class="va">$headers</span><span class="op">).</span><span class="fu">data</span> <span class="co"># список доступных моделей</span></span>
 | ||
| <span id="cb189-8"><a href="#cb189-8" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb189-9"><a href="#cb189-9" aria-hidden="true" tabindex="-1"></a><span class="va">$body</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb189-10"><a href="#cb189-10" aria-hidden="true" tabindex="-1"></a>    model <span class="op">=</span> <span class="st">"GigaChat:latest"</span></span>
 | ||
| <span id="cb189-11"><a href="#cb189-11" aria-hidden="true" tabindex="-1"></a>    messages <span class="op">=</span> <span class="op">@(</span></span>
 | ||
| <span id="cb189-12"><a href="#cb189-12" aria-hidden="true" tabindex="-1"></a>        @<span class="op">{</span></span>
 | ||
| <span id="cb189-13"><a href="#cb189-13" aria-hidden="true" tabindex="-1"></a>            role <span class="op">=</span> <span class="va">$role</span></span>
 | ||
| <span id="cb189-14"><a href="#cb189-14" aria-hidden="true" tabindex="-1"></a>            content <span class="op">=</span> <span class="va">$content</span></span>
 | ||
| <span id="cb189-15"><a href="#cb189-15" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb189-16"><a href="#cb189-16" aria-hidden="true" tabindex="-1"></a>    <span class="op">)</span></span>
 | ||
| <span id="cb189-17"><a href="#cb189-17" aria-hidden="true" tabindex="-1"></a>    temperature <span class="op">=</span> <span class="va">$temperature</span></span>
 | ||
| <span id="cb189-18"><a href="#cb189-18" aria-hidden="true" tabindex="-1"></a>    n <span class="op">=</span> <span class="va">$n</span></span>
 | ||
| <span id="cb189-19"><a href="#cb189-19" aria-hidden="true" tabindex="-1"></a>    max_tokens <span class="op">=</span> <span class="va">$max_tokens</span></span>
 | ||
| <span id="cb189-20"><a href="#cb189-20" aria-hidden="true" tabindex="-1"></a>    stream <span class="op">=</span> <span class="va">$stream</span></span>
 | ||
| <span id="cb189-21"><a href="#cb189-21" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span></span>
 | ||
| <span id="cb189-22"><a href="#cb189-22" aria-hidden="true" tabindex="-1"></a><span class="va">$Request</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Headers <span class="va">$headers</span> <span class="op">-</span>Body <span class="va">$body</span></span>
 | ||
| <span id="cb189-23"><a href="#cb189-23" aria-hidden="true" tabindex="-1"></a><span class="va">$Request</span><span class="op">.</span><span class="fu">choices</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">content</span></span></code></pre></div>
 | ||
| <h2 id="curl">Curl</h2>
 | ||
| <h3 id="установка-сертификатов-в-ubuntu">Установка сертификатов в
 | ||
| Ubuntu:</h3>
 | ||
| <p><code>wget https://gu-st.ru/content/lending/russian_trusted_root_ca_pem.crt</code><br />
 | ||
| <code>wget https://gu-st.ru/content/lending/russian_trusted_sub_ca_pem.crt</code><br />
 | ||
| <code>mkdir /usr/local/share/ca-certificates/russian_trusted</code><br />
 | ||
| <code>cp russian_trusted_root_ca_pem.crt russian_trusted_sub_ca_pem.crt /usr/local/share/ca-certificates/russian_trusted</code><br />
 | ||
| <code>update-ca-certificates -v</code><br />
 | ||
| <code>wget -qS --spider --max-redirect=0 https://www.sberbank.ru</code></p>
 | ||
| <h3 id="получение-токена-1">Получение токена:</h3>
 | ||
| <div class="sourceCode" id="cb190"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb190-1"><a href="#cb190-1" aria-hidden="true" tabindex="-1"></a><span class="va">Cred_Base64</span><span class="op">=</span><span class="st">"N2U2ZDJmOWYtODI1ZS00OWI3LTk4ZjQtNjJmYmI3NTA2NDI3OmIyYzgwZmZmLTEzOGUtNDg1Mi05MjgwLWE2MGI4NTc0YTM2MQ=="</span></span>
 | ||
| <span id="cb190-2"><a href="#cb190-2" aria-hidden="true" tabindex="-1"></a><span class="va">UUID</span><span class="op">=</span><span class="va">$(</span><span class="fu">uuidgen</span><span class="va">)</span></span>
 | ||
| <span id="cb190-3"><a href="#cb190-3" aria-hidden="true" tabindex="-1"></a><span class="va">GIGA_TOKEN</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">--location</span> <span class="at">--request</span> POST <span class="st">"https://ngw.devices.sberbank.ru:9443/api/v2/oauth"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb190-4"><a href="#cb190-4" aria-hidden="true" tabindex="-1"></a>--header <span class="st">"Authorization: Basic </span><span class="va">$Cred_Base64</span><span class="st">"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb190-5"><a href="#cb190-5" aria-hidden="true" tabindex="-1"></a>--header <span class="st">"RqUID: </span><span class="va">$UUID</span><span class="st">"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb190-6"><a href="#cb190-6" aria-hidden="true" tabindex="-1"></a>--header <span class="st">"Content-Type: application/x-www-form-urlencoded"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb190-7"><a href="#cb190-7" aria-hidden="true" tabindex="-1"></a>--data-urlencode <span class="st">'scope=GIGACHAT_API_PERS'</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .access_token<span class="va">)</span></span></code></pre></div>
 | ||
| <p><code>curl -s --location "https://gigachat.devices.sberbank.ru/api/v1/models" --header "Authorization: Bearer $GIGA_TOKEN" | jq .</code>
 | ||
| для проверки</p>
 | ||
| <h3 id="составление-запроса">Составление запроса:</h3>
 | ||
| <div class="sourceCode" id="cb191"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb191-1"><a href="#cb191-1" aria-hidden="true" tabindex="-1"></a><span class="va">request</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> https://gigachat.devices.sberbank.ru/api/v1/chat/completions <span class="dt">\</span></span>
 | ||
| <span id="cb191-2"><a href="#cb191-2" aria-hidden="true" tabindex="-1"></a>  <span class="at">-H</span> <span class="st">"Content-Type: application/json"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb191-3"><a href="#cb191-3" aria-hidden="true" tabindex="-1"></a>  <span class="at">-H</span> <span class="st">"Authorization: Bearer </span><span class="va">$GIGA_TOKEN</span><span class="st">"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb191-4"><a href="#cb191-4" aria-hidden="true" tabindex="-1"></a>  <span class="at">-d</span> <span class="st">'{</span></span>
 | ||
| <span id="cb191-5"><a href="#cb191-5" aria-hidden="true" tabindex="-1"></a><span class="st">  "model": "GigaChat:latest",</span></span>
 | ||
| <span id="cb191-6"><a href="#cb191-6" aria-hidden="true" tabindex="-1"></a><span class="st">  "messages": [</span></span>
 | ||
| <span id="cb191-7"><a href="#cb191-7" aria-hidden="true" tabindex="-1"></a><span class="st">        {</span></span>
 | ||
| <span id="cb191-8"><a href="#cb191-8" aria-hidden="true" tabindex="-1"></a><span class="st">            "role": "user",</span></span>
 | ||
| <span id="cb191-9"><a href="#cb191-9" aria-hidden="true" tabindex="-1"></a><span class="st">            "content": "Когда уже ИИ захватит этот мир?"</span></span>
 | ||
| <span id="cb191-10"><a href="#cb191-10" aria-hidden="true" tabindex="-1"></a><span class="st">        }</span></span>
 | ||
| <span id="cb191-11"><a href="#cb191-11" aria-hidden="true" tabindex="-1"></a><span class="st">    ],</span></span>
 | ||
| <span id="cb191-12"><a href="#cb191-12" aria-hidden="true" tabindex="-1"></a><span class="st">  "temperature": 0.7</span></span>
 | ||
| <span id="cb191-13"><a href="#cb191-13" aria-hidden="true" tabindex="-1"></a><span class="st">}'</span><span class="va">)</span></span>
 | ||
| <span id="cb191-14"><a href="#cb191-14" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="va">$request</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .choices[].message.content</span></code></pre></div>
 | ||
| <h1 id="yandexgpt">YandexGPT</h1>
 | ||
| <h2 id="получить-oauth-token">Получить OAuth-Token:</h2>
 | ||
| <p>https://cloud.yandex.ru/ru/docs/iam/operations/iam-token/create время
 | ||
| жизни IAM-токена не больше 12 часов<br />
 | ||
| <code>yandexPassportOauthToken="y0_AgAAAAAGaLFLAATuwQAAAAD3xtRLQE4hvlazQ5euKO43XXXXXXXXXXX"</code>
 | ||
| для bash<br />
 | ||
| <code>$yandexPassportOauthToken = "y0_AgAAAAAGaLFLAATuwQAAAAD3xtRLQE4hvlazQ5euKO43XXXXXXXXXXX"</code>
 | ||
| для PowerShell</p>
 | ||
| <h2 id="обменять-oauth-token-на-iam-token">Обменять OAuth-Token на
 | ||
| IAM-Token:</h2>
 | ||
| <p><code>IAM_TOKEN=$(curl -s -d "{\"yandexPassportOauthToken\":\"$yandexPassportOauthToken\"}" "https://iam.api.cloud.yandex.net/iam/v1/tokens" | jq -r .iamToken)</code><br />
 | ||
| <code>$IAM_TOKEN = $(Invoke-RestMethod -Method POST -Uri "https://iam.api.cloud.yandex.net/iam/v1/tokens" -Body $(@{yandexPassportOauthToken = "$yandexPassportOauthToken"} | ConvertTo-Json -Compress)).iamToken</code></p>
 | ||
| <h2 id="получить-folder_id">Получить FOLDER_ID:</h2>
 | ||
| <div class="sourceCode" id="cb192"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb192-1"><a href="#cb192-1" aria-hidden="true" tabindex="-1"></a><span class="va">CLOUD_ID</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-H</span> <span class="st">"Authorization: Bearer </span><span class="va">$IAM_TOKEN</span><span class="st">"</span> https://resource-manager.api.cloud.yandex.net/resource-manager/v1/clouds <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .clouds[].id<span class="va">)</span> <span class="co"># получить cloud id</span></span>
 | ||
| <span id="cb192-2"><a href="#cb192-2" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="at">--request</span> GET <span class="at">-H</span> <span class="st">"Authorization: Bearer </span><span class="va">$IAM_TOKEN</span><span class="st">"</span> https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders <span class="at">-d</span> <span class="st">"{</span><span class="dt">\"</span><span class="st">cloudId</span><span class="dt">\"</span><span class="st">: </span><span class="dt">\"</span><span class="va">$CLOUD_ID</span><span class="dt">\"</span><span class="st">}"</span> <span class="co"># получить список директорий в облаке</span></span>
 | ||
| <span id="cb192-3"><a href="#cb192-3" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="at">--request</span> POST <span class="at">-H</span> <span class="st">"Authorization: Bearer </span><span class="va">$IAM_TOKEN</span><span class="st">"</span> https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders <span class="at">-d</span> <span class="st">"{</span><span class="dt">\"</span><span class="st">cloudId</span><span class="dt">\"</span><span class="st">: </span><span class="dt">\"</span><span class="va">$CLOUD_ID</span><span class="dt">\"</span><span class="st">, </span><span class="dt">\"</span><span class="st">name</span><span class="dt">\"</span><span class="st">: </span><span class="dt">\"</span><span class="st">test</span><span class="dt">\"</span><span class="st">}"</span> <span class="co"># создать директорию в облаке</span></span>
 | ||
| <span id="cb192-4"><a href="#cb192-4" aria-hidden="true" tabindex="-1"></a><span class="va">FOLDER_ID</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">--request</span> GET <span class="at">-H</span> <span class="st">"Authorization: Bearer </span><span class="va">$IAM_TOKEN</span><span class="st">"</span> https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders <span class="at">-d</span> <span class="st">'{"cloudId": "b1gf9n6heihqj0pt5piu"}'</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> <span class="st">'.folders[] | select(.name == "test") | .id'</span><span class="va">)</span> <span class="co"># забрать id директории</span></span></code></pre></div>
 | ||
| <div class="sourceCode" id="cb193"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb193-1"><a href="#cb193-1" aria-hidden="true" tabindex="-1"></a><span class="va">$CLOUD_ID</span> <span class="op">=</span> <span class="op">$(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method Get <span class="op">-</span>Uri <span class="st">"https://resource-manager.api.cloud.yandex.net/resource-manager/v1/clouds"</span> <span class="op">-</span>Headers @<span class="op">{</span><span class="st">"Authorization"</span><span class="op">=</span><span class="st">"Bearer </span><span class="va">$IAM_TOKEN</span><span class="st">"</span><span class="op">;</span> <span class="st">"Content-Type"</span><span class="op">=</span><span class="st">"application/json"</span><span class="op">}).</span><span class="fu">clouds</span><span class="op">.</span><span class="fu">id</span></span>
 | ||
| <span id="cb193-2"><a href="#cb193-2" aria-hidden="true" tabindex="-1"></a><span class="va">$FOLDER_ID</span> <span class="op">=</span> <span class="op">$(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method Get <span class="op">-</span>Uri <span class="st">"https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders"</span> <span class="op">-</span>Headers @<span class="op">{</span><span class="st">"Authorization"</span><span class="op">=</span><span class="st">"Bearer </span><span class="va">$IAM_TOKEN</span><span class="st">"</span><span class="op">;</span> <span class="st">"Content-Type"</span><span class="op">=</span><span class="st">"application/json"</span><span class="op">}</span> <span class="op">-</span>Body <span class="op">(</span>@<span class="op">{</span><span class="st">"cloudId"</span><span class="op">=</span> <span class="va">$CLOUD_ID</span><span class="op">}</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span><span class="op">)).</span><span class="fu">folders</span> <span class="op">|</span> <span class="fu">Where-Object</span> name <span class="op">-eq</span> test <span class="op">|</span> <span class="fu">Select-Object</span> <span class="op">-</span>ExpandProperty id</span></code></pre></div>
 | ||
| <h3 id="составление-запроса-1">Составление запроса:</h3>
 | ||
| <div class="sourceCode" id="cb194"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb194-1"><a href="#cb194-1" aria-hidden="true" tabindex="-1"></a><span class="va">model</span><span class="op">=</span><span class="st">"gpt://</span><span class="va">$FOLDER_ID</span><span class="st">/yandexgpt/latest"</span> <span class="co"># https://cloud.yandex.ru/ru/docs/yandexgpt/concepts/models</span></span>
 | ||
| <span id="cb194-2"><a href="#cb194-2" aria-hidden="true" tabindex="-1"></a><span class="va">body</span><span class="op">=</span><span class="va">$(</span><span class="fu">cat</span> <span class="op"><<EOF</span></span>
 | ||
| <span id="cb194-3"><a href="#cb194-3" aria-hidden="true" tabindex="-1"></a><span class="st">{</span></span>
 | ||
| <span id="cb194-4"><a href="#cb194-4" aria-hidden="true" tabindex="-1"></a><span class="st">  "modelUri": "</span><span class="va">$model</span><span class="st">",</span></span>
 | ||
| <span id="cb194-5"><a href="#cb194-5" aria-hidden="true" tabindex="-1"></a><span class="st">  "completionOptions": {</span></span>
 | ||
| <span id="cb194-6"><a href="#cb194-6" aria-hidden="true" tabindex="-1"></a><span class="st">    "stream": false,</span></span>
 | ||
| <span id="cb194-7"><a href="#cb194-7" aria-hidden="true" tabindex="-1"></a><span class="st">    "temperature": 0.6,</span></span>
 | ||
| <span id="cb194-8"><a href="#cb194-8" aria-hidden="true" tabindex="-1"></a><span class="st">    "maxTokens": 2000</span></span>
 | ||
| <span id="cb194-9"><a href="#cb194-9" aria-hidden="true" tabindex="-1"></a><span class="st">  },</span></span>
 | ||
| <span id="cb194-10"><a href="#cb194-10" aria-hidden="true" tabindex="-1"></a><span class="st">  "messages": [</span></span>
 | ||
| <span id="cb194-11"><a href="#cb194-11" aria-hidden="true" tabindex="-1"></a><span class="st">    {</span></span>
 | ||
| <span id="cb194-12"><a href="#cb194-12" aria-hidden="true" tabindex="-1"></a><span class="st">      "role": "user",</span></span>
 | ||
| <span id="cb194-13"><a href="#cb194-13" aria-hidden="true" tabindex="-1"></a><span class="st">      "text": "Посчитай сумму 22+33"</span></span>
 | ||
| <span id="cb194-14"><a href="#cb194-14" aria-hidden="true" tabindex="-1"></a><span class="st">    }</span></span>
 | ||
| <span id="cb194-15"><a href="#cb194-15" aria-hidden="true" tabindex="-1"></a><span class="st">  ]</span></span>
 | ||
| <span id="cb194-16"><a href="#cb194-16" aria-hidden="true" tabindex="-1"></a><span class="st">}</span></span>
 | ||
| <span id="cb194-17"><a href="#cb194-17" aria-hidden="true" tabindex="-1"></a><span class="st">EOF)</span></span>
 | ||
| <span id="cb194-18"><a href="#cb194-18" aria-hidden="true" tabindex="-1"></a><span class="st">curl --request POST </span><span class="dt">\</span></span>
 | ||
| <span id="cb194-19"><a href="#cb194-19" aria-hidden="true" tabindex="-1"></a><span class="st">  -H "Content-Type: application/json" </span><span class="dt">\</span></span>
 | ||
| <span id="cb194-20"><a href="#cb194-20" aria-hidden="true" tabindex="-1"></a><span class="st">  -H "Authorization: Bearer </span><span class="va">$IAM_TOKEN</span><span class="st">" </span><span class="dt">\</span></span>
 | ||
| <span id="cb194-21"><a href="#cb194-21" aria-hidden="true" tabindex="-1"></a><span class="st">  -H "x-folder-id: </span><span class="va">$FOLDER_ID</span><span class="st">" </span><span class="dt">\</span></span>
 | ||
| <span id="cb194-22"><a href="#cb194-22" aria-hidden="true" tabindex="-1"></a><span class="st">  -d "</span><span class="va">$body</span><span class="st">" </span><span class="dt">\</span></span>
 | ||
| <span id="cb194-23"><a href="#cb194-23" aria-hidden="true" tabindex="-1"></a><span class="st">  "https://llm.api.cloud.yandex.net/foundationModels/v1/completion"</span></span></code></pre></div>
 | ||
| <div class="sourceCode" id="cb195"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb195-1"><a href="#cb195-1" aria-hidden="true" tabindex="-1"></a><span class="va">$model</span> <span class="op">=</span> <span class="st">"gpt://</span><span class="va">$FOLDER_ID</span><span class="st">/yandexgpt/latest"</span></span>
 | ||
| <span id="cb195-2"><a href="#cb195-2" aria-hidden="true" tabindex="-1"></a><span class="va">$body</span> <span class="op">=</span> <span class="vs">@"</span></span>
 | ||
| <span id="cb195-3"><a href="#cb195-3" aria-hidden="true" tabindex="-1"></a><span class="vs">{</span></span>
 | ||
| <span id="cb195-4"><a href="#cb195-4" aria-hidden="true" tabindex="-1"></a><span class="vs">  "modelUri": "</span><span class="va">$model</span><span class="vs">",</span></span>
 | ||
| <span id="cb195-5"><a href="#cb195-5" aria-hidden="true" tabindex="-1"></a><span class="vs">  "completionOptions": {</span></span>
 | ||
| <span id="cb195-6"><a href="#cb195-6" aria-hidden="true" tabindex="-1"></a><span class="vs">    "stream": false,</span></span>
 | ||
| <span id="cb195-7"><a href="#cb195-7" aria-hidden="true" tabindex="-1"></a><span class="vs">    "temperature": 0.6,</span></span>
 | ||
| <span id="cb195-8"><a href="#cb195-8" aria-hidden="true" tabindex="-1"></a><span class="vs">    "maxTokens": 2000</span></span>
 | ||
| <span id="cb195-9"><a href="#cb195-9" aria-hidden="true" tabindex="-1"></a><span class="vs">  },</span></span>
 | ||
| <span id="cb195-10"><a href="#cb195-10" aria-hidden="true" tabindex="-1"></a><span class="vs">  "messages": [</span></span>
 | ||
| <span id="cb195-11"><a href="#cb195-11" aria-hidden="true" tabindex="-1"></a><span class="vs">    {</span></span>
 | ||
| <span id="cb195-12"><a href="#cb195-12" aria-hidden="true" tabindex="-1"></a><span class="vs">      "role": "user",</span></span>
 | ||
| <span id="cb195-13"><a href="#cb195-13" aria-hidden="true" tabindex="-1"></a><span class="vs">      "text": "Посчитай сумму 22+33"</span></span>
 | ||
| <span id="cb195-14"><a href="#cb195-14" aria-hidden="true" tabindex="-1"></a><span class="vs">    }</span></span>
 | ||
| <span id="cb195-15"><a href="#cb195-15" aria-hidden="true" tabindex="-1"></a><span class="vs">  ]</span></span>
 | ||
| <span id="cb195-16"><a href="#cb195-16" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
 | ||
| <span id="cb195-17"><a href="#cb195-17" aria-hidden="true" tabindex="-1"></a><span class="vs">"@</span></span>
 | ||
| <span id="cb195-18"><a href="#cb195-18" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="st">"https://llm.api.cloud.yandex.net/foundationModels/v1/completion"</span> <span class="op">-</span>Headers @<span class="op">{</span><span class="st">"Content-Type"</span><span class="op">=</span><span class="st">"application/json"</span><span class="op">;</span> <span class="st">"Authorization"</span><span class="op">=</span><span class="st">"Bearer </span><span class="va">$IAM_TOKEN</span><span class="st">"</span><span class="op">;</span> <span class="st">"x-folder-id"</span><span class="op">=</span><span class="st">"</span><span class="va">$FOLDER_ID</span><span class="st">"</span><span class="op">}</span> <span class="op">-</span>Body <span class="va">$body</span></span></code></pre></div>
 | ||
| <h1 id="superagi">SuperAGI</h1>
 | ||
| <p>https://github.com/TransformerOptimus/SuperAGI<br />
 | ||
| https://models.superagi.com/playground/generate<br />
 | ||
| https://documenter.getpostman.com/view/30119783/2s9YR3cFJG</p>
 | ||
| <div class="sourceCode" id="cb196"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb196-1"><a href="#cb196-1" aria-hidden="true" tabindex="-1"></a><span class="va">SUPERAGI_API_KEY</span><span class="op">=</span><span class="st">"31f72164129XXXXX"</span></span>
 | ||
| <span id="cb196-2"><a href="#cb196-2" aria-hidden="true" tabindex="-1"></a><span class="va">prompt</span><span class="op">=</span><span class="st">"посчитай сумму 22+33, дай только ответ без лишнего текста"</span></span>
 | ||
| <span id="cb196-3"><a href="#cb196-3" aria-hidden="true" tabindex="-1"></a><span class="va">request</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-X</span> POST <span class="st">'https://api.superagi.com/v1/generate/65437cbf227a4018516ad1ce'</span> <span class="dt">\</span></span>
 | ||
| <span id="cb196-4"><a href="#cb196-4" aria-hidden="true" tabindex="-1"></a>-H <span class="st">'Content-Type: application/json'</span> <span class="dt">\</span></span>
 | ||
| <span id="cb196-5"><a href="#cb196-5" aria-hidden="true" tabindex="-1"></a>-H <span class="st">"Authorization: Bearer </span><span class="va">$SUPERAGI_API_KEY</span><span class="st">"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb196-6"><a href="#cb196-6" aria-hidden="true" tabindex="-1"></a>-d <span class="st">'{</span></span>
 | ||
| <span id="cb196-7"><a href="#cb196-7" aria-hidden="true" tabindex="-1"></a><span class="st">  "prompt": ["$prompt"],</span></span>
 | ||
| <span id="cb196-8"><a href="#cb196-8" aria-hidden="true" tabindex="-1"></a><span class="st">  "max_tokens": 500,</span></span>
 | ||
| <span id="cb196-9"><a href="#cb196-9" aria-hidden="true" tabindex="-1"></a><span class="st">  "temperature": 0.9,</span></span>
 | ||
| <span id="cb196-10"><a href="#cb196-10" aria-hidden="true" tabindex="-1"></a><span class="st">  "top_p": 0.15,</span></span>
 | ||
| <span id="cb196-11"><a href="#cb196-11" aria-hidden="true" tabindex="-1"></a><span class="st">  "repetition_penalty": 0,</span></span>
 | ||
| <span id="cb196-12"><a href="#cb196-12" aria-hidden="true" tabindex="-1"></a><span class="st">  "best_of": 1.05,</span></span>
 | ||
| <span id="cb196-13"><a href="#cb196-13" aria-hidden="true" tabindex="-1"></a><span class="st">  "top_k": 50,</span></span>
 | ||
| <span id="cb196-14"><a href="#cb196-14" aria-hidden="true" tabindex="-1"></a><span class="st">  "stream": false</span></span>
 | ||
| <span id="cb196-15"><a href="#cb196-15" aria-hidden="true" tabindex="-1"></a><span class="st">}'</span><span class="va">)</span></span>
 | ||
| <span id="cb196-16"><a href="#cb196-16" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="va">$request</span> <span class="kw">|</span> <span class="fu">sed</span> <span class="st">"s/data: //"</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .choices[].text</span></code></pre></div>
 | ||
| <div class="sourceCode" id="cb197"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb197-1"><a href="#cb197-1" aria-hidden="true" tabindex="-1"></a><span class="va">$SUPERAGI_API_KEY</span> <span class="op">=</span> <span class="st">"31f72164129XXXXX"</span></span>
 | ||
| <span id="cb197-2"><a href="#cb197-2" aria-hidden="true" tabindex="-1"></a><span class="va">$prompt</span> <span class="op">=</span> <span class="st">"посчитай сумму 22+33, дай только ответ без лишнего текста"</span></span>
 | ||
| <span id="cb197-3"><a href="#cb197-3" aria-hidden="true" tabindex="-1"></a><span class="va">$request</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method Post <span class="op">-</span>Uri <span class="st">'https://api.superagi.com/v1/generate/65437cbf227a4018516ad1ce'</span> <span class="op">-</span>Headers @<span class="op">{</span></span>
 | ||
| <span id="cb197-4"><a href="#cb197-4" aria-hidden="true" tabindex="-1"></a>    <span class="st">'Content-Type'</span> <span class="op">=</span> <span class="st">'application/json'</span></span>
 | ||
| <span id="cb197-5"><a href="#cb197-5" aria-hidden="true" tabindex="-1"></a>    <span class="st">'Authorization'</span> <span class="op">=</span> <span class="st">"Bearer </span><span class="va">$SUPERAGI_API_KEY</span><span class="st">"</span></span>
 | ||
| <span id="cb197-6"><a href="#cb197-6" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">-</span>Body <span class="op">(</span>@<span class="op">{</span></span>
 | ||
| <span id="cb197-7"><a href="#cb197-7" aria-hidden="true" tabindex="-1"></a>    prompt <span class="op">=</span> <span class="op">@(</span><span class="va">$prompt</span><span class="op">)</span></span>
 | ||
| <span id="cb197-8"><a href="#cb197-8" aria-hidden="true" tabindex="-1"></a>    max_tokens <span class="op">=</span> <span class="dv">500</span></span>
 | ||
| <span id="cb197-9"><a href="#cb197-9" aria-hidden="true" tabindex="-1"></a>    temperature <span class="op">=</span> <span class="dv">0.9</span></span>
 | ||
| <span id="cb197-10"><a href="#cb197-10" aria-hidden="true" tabindex="-1"></a>    top_p <span class="op">=</span> <span class="dv">0.15</span></span>
 | ||
| <span id="cb197-11"><a href="#cb197-11" aria-hidden="true" tabindex="-1"></a>    repetition_penalty <span class="op">=</span> <span class="dv">0</span></span>
 | ||
| <span id="cb197-12"><a href="#cb197-12" aria-hidden="true" tabindex="-1"></a>    best_of <span class="op">=</span> <span class="dv">1.05</span></span>
 | ||
| <span id="cb197-13"><a href="#cb197-13" aria-hidden="true" tabindex="-1"></a>    top_k <span class="op">=</span> <span class="dv">50</span></span>
 | ||
| <span id="cb197-14"><a href="#cb197-14" aria-hidden="true" tabindex="-1"></a>    stream <span class="op">=</span> <span class="va">$false</span></span>
 | ||
| <span id="cb197-15"><a href="#cb197-15" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span><span class="op">)</span></span>
 | ||
| <span id="cb197-16"><a href="#cb197-16" aria-hidden="true" tabindex="-1"></a><span class="op">$(</span><span class="va">$request</span> <span class="op">-replace</span> <span class="st">"^data: "</span> <span class="op">|</span> <span class="fu">ConvertFrom-Json</span><span class="op">).</span><span class="fu">choices</span><span class="op">.</span><span class="fu">text</span></span></code></pre></div>
 | ||
| <h1 id="replicate">Replicate</h1>
 | ||
| <p>https://replicate.com/stability-ai/stable-diffusion/examples?input=http</p>
 | ||
| <div class="sourceCode" id="cb198"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb198-1"><a href="#cb198-1" aria-hidden="true" tabindex="-1"></a><span class="va">REPLICATE_API_TOKEN</span><span class="op">=</span><span class="st">"r8_STyeUNXiGonkLfxE1FSKaqll26lXXXXXXXXXX"</span></span>
 | ||
| <span id="cb198-2"><a href="#cb198-2" aria-hidden="true" tabindex="-1"></a><span class="va">prompt</span><span class="op">=</span><span class="st">"Жираф в полоску зебры"</span></span>
 | ||
| <span id="cb198-3"><a href="#cb198-3" aria-hidden="true" tabindex="-1"></a><span class="va">request</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-X</span> POST <span class="dt">\</span></span>
 | ||
| <span id="cb198-4"><a href="#cb198-4" aria-hidden="true" tabindex="-1"></a>  <span class="at">-H</span> <span class="st">"Authorization: Token </span><span class="va">$REPLICATE_API_TOKEN</span><span class="st">"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb198-5"><a href="#cb198-5" aria-hidden="true" tabindex="-1"></a>  <span class="at">-H</span> <span class="st">"Content-Type: application/json"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb198-6"><a href="#cb198-6" aria-hidden="true" tabindex="-1"></a>  <span class="at">-d</span> <span class="st">$'{</span></span>
 | ||
| <span id="cb198-7"><a href="#cb198-7" aria-hidden="true" tabindex="-1"></a><span class="st">    "version": "ac732df83cea7fff18b8472768c88ad041fa750ff7682a21affe81863cbe77e4",</span></span>
 | ||
| <span id="cb198-8"><a href="#cb198-8" aria-hidden="true" tabindex="-1"></a><span class="st">    "input": {</span></span>
 | ||
| <span id="cb198-9"><a href="#cb198-9" aria-hidden="true" tabindex="-1"></a><span class="st">      "prompt": "$prompt"</span></span>
 | ||
| <span id="cb198-10"><a href="#cb198-10" aria-hidden="true" tabindex="-1"></a><span class="st">    }</span></span>
 | ||
| <span id="cb198-11"><a href="#cb198-11" aria-hidden="true" tabindex="-1"></a><span class="st">  }'</span> <span class="dt">\</span></span>
 | ||
| <span id="cb198-12"><a href="#cb198-12" aria-hidden="true" tabindex="-1"></a>  https://api.replicate.com/v1/predictions<span class="va">)</span></span>
 | ||
| <span id="cb198-13"><a href="#cb198-13" aria-hidden="true" tabindex="-1"></a><span class="va">request_url</span><span class="op">=</span><span class="va">$(</span><span class="bu">echo</span> <span class="va">$request</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .urls.get<span class="va">)</span></span>
 | ||
| <span id="cb198-14"><a href="#cb198-14" aria-hidden="true" tabindex="-1"></a><span class="va">response_status</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-H</span> <span class="st">"Authorization: Token </span><span class="va">$REPLICATE_API_TOKEN</span><span class="st">"</span> <span class="va">$request_url</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .status<span class="va">)</span></span>
 | ||
| <span id="cb198-15"><a href="#cb198-15" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="kw">[[</span> <span class="va">$response_status</span> <span class="ot">!=</span> succeeded <span class="kw">]];</span> <span class="cf">do</span></span>
 | ||
| <span id="cb198-16"><a href="#cb198-16" aria-hidden="true" tabindex="-1"></a>    <span class="va">response_status</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-H</span> <span class="st">"Authorization: Token </span><span class="va">$REPLICATE_API_TOKEN</span><span class="st">"</span> <span class="va">$request_url</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .status<span class="va">)</span></span>
 | ||
| <span id="cb198-17"><a href="#cb198-17" aria-hidden="true" tabindex="-1"></a><span class="cf">done</span></span>
 | ||
| <span id="cb198-18"><a href="#cb198-18" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-H</span> <span class="st">"Authorization: Token </span><span class="va">$REPLICATE_API_TOKEN</span><span class="st">"</span> <span class="va">$request_url</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .output[]</span></code></pre></div>
 | ||
| <div class="sourceCode" id="cb199"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb199-1"><a href="#cb199-1" aria-hidden="true" tabindex="-1"></a><span class="va">$REPLICATE_API_TOKEN</span> <span class="op">=</span> <span class="st">"r8_STyeUNXiGonkLfxE1FSKaqll26lXXXXXXXXXX"</span></span>
 | ||
| <span id="cb199-2"><a href="#cb199-2" aria-hidden="true" tabindex="-1"></a><span class="va">$prompt</span> <span class="op">=</span> <span class="st">"Жираф в полоску зебры"</span></span>
 | ||
| <span id="cb199-3"><a href="#cb199-3" aria-hidden="true" tabindex="-1"></a><span class="va">$body</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb199-4"><a href="#cb199-4" aria-hidden="true" tabindex="-1"></a>   version <span class="op">=</span> <span class="st">"ac732df83cea7fff18b8472768c88ad041fa750ff7682a21affe81863cbe77e4"</span></span>
 | ||
| <span id="cb199-5"><a href="#cb199-5" aria-hidden="true" tabindex="-1"></a>   input <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb199-6"><a href="#cb199-6" aria-hidden="true" tabindex="-1"></a>       prompt <span class="op">=</span> <span class="va">$prompt</span></span>
 | ||
| <span id="cb199-7"><a href="#cb199-7" aria-hidden="true" tabindex="-1"></a>   <span class="op">}</span></span>
 | ||
| <span id="cb199-8"><a href="#cb199-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span></span>
 | ||
| <span id="cb199-9"><a href="#cb199-9" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb199-10"><a href="#cb199-10" aria-hidden="true" tabindex="-1"></a>   <span class="st">"Authorization"</span> <span class="op">=</span> <span class="st">"Token </span><span class="va">$REPLICATE_API_TOKEN</span><span class="st">"</span></span>
 | ||
| <span id="cb199-11"><a href="#cb199-11" aria-hidden="true" tabindex="-1"></a>   <span class="st">"Content-Type"</span> <span class="op">=</span> <span class="st">"application/json"</span></span>
 | ||
| <span id="cb199-12"><a href="#cb199-12" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb199-13"><a href="#cb199-13" aria-hidden="true" tabindex="-1"></a><span class="va">$request</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="st">"https://api.replicate.com/v1/predictions"</span> <span class="op">-</span>Method POST <span class="op">-</span>Body <span class="va">$body</span> <span class="op">-</span>Headers <span class="va">$headers</span></span>
 | ||
| <span id="cb199-14"><a href="#cb199-14" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="op">$(</span><span class="va">$request</span><span class="op">.</span><span class="fu">urls</span><span class="op">.</span><span class="fu">get</span><span class="op">)</span> <span class="op">-</span>Headers @<span class="op">{</span><span class="st">"Authorization"</span> <span class="op">=</span> <span class="st">"Token </span><span class="va">$REPLICATE_API_TOKEN</span><span class="st">"</span><span class="op">}</span></span>
 | ||
| <span id="cb199-15"><a href="#cb199-15" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(</span><span class="va">$response</span><span class="op">.</span><span class="fu">status</span> <span class="op">-ne</span> <span class="st">"succeeded"</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb199-16"><a href="#cb199-16" aria-hidden="true" tabindex="-1"></a>    <span class="va">$response</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="op">$(</span><span class="va">$request</span><span class="op">.</span><span class="fu">urls</span><span class="op">.</span><span class="fu">get</span><span class="op">)</span> <span class="op">-</span>Headers @<span class="op">{</span><span class="st">"Authorization"</span> <span class="op">=</span> <span class="st">"Token </span><span class="va">$REPLICATE_API_TOKEN</span><span class="st">"</span><span class="op">}</span></span>
 | ||
| <span id="cb199-17"><a href="#cb199-17" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb199-18"><a href="#cb199-18" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span><span class="op">.</span><span class="fu">output</span></span></code></pre></div>
 | ||
| <h1 id="google-api">Google-API</h1>
 | ||
| <h3 id="google-translate">Google-Translate</h3>
 | ||
| <div class="sourceCode" id="cb200"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb200-1"><a href="#cb200-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Key</span> <span class="op">=</span> <span class="st">"<TOKEN_API>"</span> <span class="co"># получить токен: https://console.cloud.google.com/apis/credentials</span></span>
 | ||
| <span id="cb200-2"><a href="#cb200-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Text</span> <span class="op">=</span> <span class="st">"You can see in the right corner how long each translation request takes (this does not depend on the amount of text being transferred)."</span></span>
 | ||
| <span id="cb200-3"><a href="#cb200-3" aria-hidden="true" tabindex="-1"></a><span class="va">$LanguageTarget</span> <span class="op">=</span> <span class="st">"RU"</span></span>
 | ||
| <span id="cb200-4"><a href="#cb200-4" aria-hidden="true" tabindex="-1"></a><span class="va">$LanguageSource</span> <span class="op">=</span> <span class="st">"EN"</span></span>
 | ||
| <span id="cb200-5"><a href="#cb200-5" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="st">"https://translation.googleapis.com/language/translate/v2?key=</span><span class="va">$key</span><span class="st">"</span></span>
 | ||
| <span id="cb200-6"><a href="#cb200-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Header</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb200-7"><a href="#cb200-7" aria-hidden="true" tabindex="-1"></a>    <span class="st">"Content-Type"</span> <span class="op">=</span> <span class="st">"application/json"</span></span>
 | ||
| <span id="cb200-8"><a href="#cb200-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb200-9"><a href="#cb200-9" aria-hidden="true" tabindex="-1"></a><span class="va">$Body</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb200-10"><a href="#cb200-10" aria-hidden="true" tabindex="-1"></a>    <span class="st">"q"</span> <span class="op">=</span> <span class="st">"</span><span class="va">$Text</span><span class="st">"</span></span>
 | ||
| <span id="cb200-11"><a href="#cb200-11" aria-hidden="true" tabindex="-1"></a>    <span class="st">"target"</span> <span class="op">=</span> <span class="st">"</span><span class="va">$LanguageTarget</span><span class="st">"</span></span>
 | ||
| <span id="cb200-12"><a href="#cb200-12" aria-hidden="true" tabindex="-1"></a>    <span class="st">"source"</span> <span class="op">=</span> <span class="st">"</span><span class="va">$LanguageSource</span><span class="st">"</span></span>
 | ||
| <span id="cb200-13"><a href="#cb200-13" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span></span>
 | ||
| <span id="cb200-14"><a href="#cb200-14" aria-hidden="true" tabindex="-1"></a><span class="va">$WebClient</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">WebClient</span></span>
 | ||
| <span id="cb200-15"><a href="#cb200-15" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$key</span> <span class="kw">in</span> <span class="va">$Header</span><span class="op">.</span><span class="fu">Keys</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb200-16"><a href="#cb200-16" aria-hidden="true" tabindex="-1"></a>    <span class="va">$WebClient</span><span class="op">.</span><span class="fu">Headers</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="va">$key</span><span class="op">,</span> <span class="va">$Header</span><span class="op">[</span><span class="va">$key</span><span class="op">])</span></span>
 | ||
| <span id="cb200-17"><a href="#cb200-17" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb200-18"><a href="#cb200-18" aria-hidden="true" tabindex="-1"></a><span class="va">$Response</span> <span class="op">=</span> <span class="va">$WebClient</span><span class="op">.</span><span class="fu">UploadString</span><span class="op">(</span><span class="va">$url</span><span class="op">,</span> <span class="st">"POST"</span><span class="op">,</span> <span class="va">$Body</span><span class="op">)</span> <span class="op">|</span> <span class="fu">ConvertFrom-Json</span></span>
 | ||
| <span id="cb200-19"><a href="#cb200-19" aria-hidden="true" tabindex="-1"></a><span class="va">$Response</span><span class="op">.</span><span class="fu">data</span><span class="op">.</span><span class="fu">translations</span><span class="op">.</span><span class="fu">translatedText</span></span></code></pre></div>
 | ||
| <h3 id="google-search">Google-Search</h3>
 | ||
| <div class="sourceCode" id="cb201"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb201-1"><a href="#cb201-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Key</span> <span class="op">=</span> <span class="st">"<TOKEN_API>"</span> <span class="co"># получить токен: https://developers.google.com/custom-search/v1/overview?hl=ru (пользовательский поиск JSON API предоставляет 100 поисковых запросов в день бесплатно)</span></span>
 | ||
| <span id="cb201-2"><a href="#cb201-2" aria-hidden="true" tabindex="-1"></a><span class="va">$cx</span> <span class="op">=</span> <span class="st">"35c78340f49eb474a"</span> <span class="co"># создать поисковую систему https://programmablesearchengine.google.com/controlpanel/all</span></span>
 | ||
| <span id="cb201-3"><a href="#cb201-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Query</span> <span class="op">=</span> <span class="st">"как создать бота discord"</span></span>
 | ||
| <span id="cb201-4"><a href="#cb201-4" aria-hidden="true" tabindex="-1"></a><span class="va">$Lang</span> <span class="op">=</span> <span class="st">"ru"</span></span>
 | ||
| <span id="cb201-5"><a href="#cb201-5" aria-hidden="true" tabindex="-1"></a><span class="va">$Num</span> <span class="op">=</span> <span class="dv">10</span></span>
 | ||
| <span id="cb201-6"><a href="#cb201-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Start</span> <span class="op">=</span> <span class="dv">0</span></span>
 | ||
| <span id="cb201-7"><a href="#cb201-7" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="st">"https://www.googleapis.com/customsearch/v1?q=</span><span class="va">$Query</span><span class="st">&key=</span><span class="va">$Key</span><span class="st">&cx=</span><span class="va">$cx</span><span class="st">&lr=lang_</span><span class="va">$Lang</span><span class="st">&num=</span><span class="va">$Num</span><span class="st">&</span><span class="va">$start</span><span class="st">=</span><span class="va">$Start</span><span class="st">"</span></span>
 | ||
| <span id="cb201-8"><a href="#cb201-8" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span><span class="op">.</span><span class="fu">items</span> <span class="op">|</span> <span class="fu">Select-Object</span> title<span class="op">,</span>snippet<span class="op">,</span>displayLink<span class="op">,</span>link <span class="op">|</span> <span class="fu">Format-List</span></span></code></pre></div>
 | ||
| <h1 id="rapidapi">RapidAPI</h1>
 | ||
| <p>https://rapidapi.com/ru/neoscrap-net/api/google-search72</p>
 | ||
| <div class="sourceCode" id="cb202"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb202-1"><a href="#cb202-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Key</span> <span class="op">=</span> <span class="st">"<TOKEN_API>"</span></span>
 | ||
| <span id="cb202-2"><a href="#cb202-2" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">=</span>@<span class="op">{}</span></span>
 | ||
| <span id="cb202-3"><a href="#cb202-3" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="st">"X-RapidAPI-Key"</span><span class="op">,</span> <span class="st">"</span><span class="va">$Key</span><span class="st">"</span><span class="op">)</span></span>
 | ||
| <span id="cb202-4"><a href="#cb202-4" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="st">"X-RapidAPI-Host"</span><span class="op">,</span> <span class="st">"google-search72.p.rapidapi.com"</span><span class="op">)</span></span>
 | ||
| <span id="cb202-5"><a href="#cb202-5" aria-hidden="true" tabindex="-1"></a><span class="va">$query</span> <span class="op">=</span> <span class="st">"как создать бота discord"</span></span>
 | ||
| <span id="cb202-6"><a href="#cb202-6" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="st">"https://google-search72.p.rapidapi.com/search?q=</span><span class="va">$query</span><span class="st">%20gitgub&gl=us&lr=lang_ru&num=20&start=0"</span> <span class="op">-</span>Method GET <span class="op">-</span>Headers <span class="va">$headers</span></span>
 | ||
| <span id="cb202-7"><a href="#cb202-7" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span><span class="op">.</span><span class="fu">items</span> <span class="op">|</span> <span class="fu">Select-Object</span> title<span class="op">,</span>snippet<span class="op">,</span>displayLink<span class="op">,</span>link <span class="op">|</span> <span class="fu">Format-List</span></span></code></pre></div>
 | ||
| <h3 id="imdb">IMDb</h3>
 | ||
| <p>https://rapidapi.com/apidojo/api/imdb8</p>
 | ||
| <div class="sourceCode" id="cb203"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb203-1"><a href="#cb203-1" aria-hidden="true" tabindex="-1"></a><span class="va">$key</span> <span class="op">=</span> <span class="st">"<TOKEN_API>"</span> <span class="co"># 500 запросов в месяц</span></span>
 | ||
| <span id="cb203-2"><a href="#cb203-2" aria-hidden="true" tabindex="-1"></a><span class="va">$query</span><span class="op">=</span><span class="st">"Break"</span></span>
 | ||
| <span id="cb203-3"><a href="#cb203-3" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">=</span>@<span class="op">{}</span></span>
 | ||
| <span id="cb203-4"><a href="#cb203-4" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="st">"X-RapidAPI-Key"</span><span class="op">,</span> <span class="st">"</span><span class="va">$key</span><span class="st">"</span><span class="op">)</span></span>
 | ||
| <span id="cb203-5"><a href="#cb203-5" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="st">"X-RapidAPI-Host"</span><span class="op">,</span> <span class="st">"imdb8.p.rapidapi.com"</span><span class="op">)</span></span>
 | ||
| <span id="cb203-6"><a href="#cb203-6" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="st">"https://imdb8.p.rapidapi.com/title/find?q=</span><span class="va">$query</span><span class="st">"</span> <span class="op">-</span>Method GET <span class="op">-</span>Headers <span class="va">$headers</span></span>
 | ||
| <span id="cb203-7"><a href="#cb203-7" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span><span class="op">.</span><span class="fu">results</span> <span class="op">|</span> <span class="fu">select</span> title<span class="op">,</span>titletype<span class="op">,</span>year<span class="op">,</span>runningTimeInMinutes<span class="op">,</span>id <span class="op">|</span> <span class="fu">Format-Table</span></span>
 | ||
| <span id="cb203-8"><a href="#cb203-8" aria-hidden="true" tabindex="-1"></a><span class="st">"https://www.imdb.com</span><span class="op">$(</span><span class="va">$response</span><span class="op">.</span><span class="fu">results</span><span class="op">.</span><span class="fu">id</span><span class="op">[</span><span class="dv">0</span><span class="op">])</span><span class="st">"</span></span>
 | ||
| <span id="cb203-9"><a href="#cb203-9" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span><span class="op">.</span><span class="fu">results</span><span class="op">.</span><span class="fu">principals</span> <span class="co"># актеры</span></span>
 | ||
| <span id="cb203-10"><a href="#cb203-10" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span><span class="op">.</span><span class="fu">results</span><span class="op">.</span><span class="fu">image</span></span></code></pre></div>
 | ||
| <h3 id="moviesdatabase">MoviesDatabase</h3>
 | ||
| <p>https://rapidapi.com/SAdrian/api/moviesdatabase</p>
 | ||
| <div class="sourceCode" id="cb204"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb204-1"><a href="#cb204-1" aria-hidden="true" tabindex="-1"></a><span class="va">$key</span> <span class="op">=</span> <span class="st">"<TOKEN_API>"</span></span>
 | ||
| <span id="cb204-2"><a href="#cb204-2" aria-hidden="true" tabindex="-1"></a><span class="va">$imdb_id</span> <span class="op">=</span> <span class="st">"tt0455275"</span></span>
 | ||
| <span id="cb204-3"><a href="#cb204-3" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">=</span>@<span class="op">{}</span></span>
 | ||
| <span id="cb204-4"><a href="#cb204-4" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="st">"X-RapidAPI-Key"</span><span class="op">,</span> <span class="st">"</span><span class="va">$key</span><span class="st">"</span><span class="op">)</span></span>
 | ||
| <span id="cb204-5"><a href="#cb204-5" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="st">"X-RapidAPI-Host"</span><span class="op">,</span> <span class="st">"moviesdatabase.p.rapidapi.com"</span><span class="op">)</span></span>
 | ||
| <span id="cb204-6"><a href="#cb204-6" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="st">"https://moviesdatabase.p.rapidapi.com/titles/</span><span class="va">$imdb_id</span><span class="st">"</span> <span class="op">-</span>Method GET <span class="op">-</span>Headers <span class="va">$headers</span></span>
 | ||
| <span id="cb204-7"><a href="#cb204-7" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span><span class="op">.</span><span class="fu">results</span></span></code></pre></div>
 | ||
| <h1 id="tmdb">TMDB</h1>
 | ||
| <p>https://developer.themoviedb.org/reference/intro/getting-started</p>
 | ||
| <div class="sourceCode" id="cb205"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb205-1"><a href="#cb205-1" aria-hidden="true" tabindex="-1"></a><span class="va">$TOKEN</span> <span class="op">=</span> <span class="st">"548e444e7812575caa0a7eXXXXXXXXXX"</span></span>
 | ||
| <span id="cb205-2"><a href="#cb205-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Endpoint</span> <span class="op">=</span> <span class="st">"search/tv"</span> <span class="co"># поиск сериала (tv) и фильма (movie) по названию</span></span>
 | ||
| <span id="cb205-3"><a href="#cb205-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Query</span> <span class="op">=</span> <span class="st">"зимородок"</span></span>
 | ||
| <span id="cb205-4"><a href="#cb205-4" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="op">$(</span><span class="st">"https://api.themoviedb.org/3/</span><span class="va">$Endpoint</span><span class="st">"</span><span class="op">+</span><span class="st">"?api_key=</span><span class="va">$TOKEN</span><span class="st">&query=</span><span class="va">$Query</span><span class="st">"</span><span class="op">)</span></span>
 | ||
| <span id="cb205-5"><a href="#cb205-5" aria-hidden="true" tabindex="-1"></a><span class="op">$(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Method Get<span class="op">).</span><span class="fu">results</span></span>
 | ||
| <span id="cb205-6"><a href="#cb205-6" aria-hidden="true" tabindex="-1"></a><span class="va">$id</span> <span class="op">=</span> <span class="op">$(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Method Get<span class="op">).</span><span class="fu">results</span><span class="op">.</span><span class="fu">id</span> <span class="co"># забрать id сериала (210865) https://www.themoviedb.org/tv/210865</span></span>
 | ||
| <span id="cb205-7"><a href="#cb205-7" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb205-8"><a href="#cb205-8" aria-hidden="true" tabindex="-1"></a><span class="va">$Endpoint</span> <span class="op">=</span> <span class="st">"tv/</span><span class="va">$id</span><span class="st">"</span> <span class="co"># получение информации о сериале по его ID</span></span>
 | ||
| <span id="cb205-9"><a href="#cb205-9" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="op">$(</span><span class="st">"https://api.themoviedb.org/3/</span><span class="va">$Endpoint</span><span class="st">"</span><span class="op">+</span><span class="st">"?api_key=</span><span class="va">$TOKEN</span><span class="st">"</span><span class="op">)</span></span>
 | ||
| <span id="cb205-10"><a href="#cb205-10" aria-hidden="true" tabindex="-1"></a><span class="op">$(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Method Get<span class="op">)</span> <span class="co"># список сезонов (.seasons), количество эпизодов (.seasons.episode_count)</span></span>
 | ||
| <span id="cb205-11"><a href="#cb205-11" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb205-12"><a href="#cb205-12" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="st">"https://api.themoviedb.org/3/tv/</span><span class="va">$id</span><span class="st">/season/2?api_key=</span><span class="va">$Token</span><span class="st">"</span> <span class="op">-</span>Method Get<span class="op">).</span><span class="fu">episodes</span> <span class="co"># вывести 2 сезон</span></span>
 | ||
| <span id="cb205-13"><a href="#cb205-13" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="st">"https://api.themoviedb.org/3/tv/</span><span class="va">$id</span><span class="st">/season/2/episode/8?api_key=</span><span class="va">$Token</span><span class="st">"</span> <span class="op">-</span>Method Get <span class="co"># вывести 8 эпизод</span></span></code></pre></div>
 | ||
| <h1 id="ivi">ivi</h1>
 | ||
| <p>https://ask.ivi.ru/knowledge-bases/10/articles/51697-dokumentatsiya-dlya-api-ivi</p>
 | ||
| <p><code>Invoke-RestMethod https://api.ivi.ru/mobileapi/categories</code>
 | ||
| список категорий и жанров (genres/meta_genres)<br />
 | ||
| <code>Invoke-RestMethod https://api.ivi.ru/mobileapi/collections</code>
 | ||
| подборки</p>
 | ||
| <p><code>(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.seasons.number</code>
 | ||
| кол-во сезонов<br />
 | ||
| <code>(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.seasons[1].episode_count</code>
 | ||
| кол-во серий во втором сезоне<br />
 | ||
| <code>(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.seasons[1].ivi_release_info.date_interval_min</code>
 | ||
| дата выхода следующей серии<br />
 | ||
| <code>(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.kp_rating</code>
 | ||
| рейтинг в Кинопоиск (8.04)</p>
 | ||
| <p><code>$id = (Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.kp_id</code>
 | ||
| получить id в Кинопоиск (5106881)<br />
 | ||
| <code>id=$(curl -s https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok | jq .result[].kp_id)</code>
 | ||
| получить id в Кинопоиск</p>
 | ||
| <h1 id="kinopoisk">Kinopoisk</h1>
 | ||
| <div class="sourceCode" id="cb206"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb206-1"><a href="#cb206-1" aria-hidden="true" tabindex="-1"></a><span class="va">id</span><span class="op">=</span>5106881</span>
 | ||
| <span id="cb206-2"><a href="#cb206-2" aria-hidden="true" tabindex="-1"></a><span class="va">get</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> https://www.kinopoisk.ru/film/<span class="va">$id</span>/episodes/<span class="va">)</span></span>
 | ||
| <span id="cb206-3"><a href="#cb206-3" aria-hidden="true" tabindex="-1"></a><span class="bu">printf</span> <span class="st">"%s\n"</span> <span class="st">"</span><span class="va">${get</span><span class="op">[@]</span><span class="va">}</span><span class="st">"</span> <span class="kw">|</span> <span class="fu">grep</span> <span class="at">-A</span> 1 <span class="st">"Сезон 2"</span> <span class="kw">|</span> <span class="fu">grep</span> <span class="st">"эпизодов"</span> <span class="kw">|</span> <span class="fu">sed</span> <span class="at">-r</span> <span class="st">"s/^.+\: //"</span> <span class="co"># количество эпиздовод во втором сезоне (8)</span></span></code></pre></div>
 | ||
| <h3 id="kinopoisk.dev">kinopoisk.dev</h3>
 | ||
| <p>https://t.me/kinopoiskdev_bot - получить токен<br />
 | ||
| https://kinopoisk.dev/documentation - документация по API в формате
 | ||
| OpenAPI</p>
 | ||
| <p><code>GET /v1.4/movie/{id}</code> поиск по id</p>
 | ||
| <div class="sourceCode" id="cb207"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb207-1"><a href="#cb207-1" aria-hidden="true" tabindex="-1"></a><span class="va">$id</span> <span class="op">=</span> <span class="dv">5106881</span></span>
 | ||
| <span id="cb207-2"><a href="#cb207-2" aria-hidden="true" tabindex="-1"></a><span class="va">$API_KEY</span> <span class="op">=</span> <span class="st">"ZYMNJJA-0J8MNPN-PB4N7R7-XXXXXXX"</span></span>
 | ||
| <span id="cb207-3"><a href="#cb207-3" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb207-4"><a href="#cb207-4" aria-hidden="true" tabindex="-1"></a><span class="va">$Header</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb207-5"><a href="#cb207-5" aria-hidden="true" tabindex="-1"></a>    <span class="st">"accept"</span> <span class="op">=</span> <span class="st">"application/json"</span></span>
 | ||
| <span id="cb207-6"><a href="#cb207-6" aria-hidden="true" tabindex="-1"></a>    <span class="st">"X-API-KEY"</span> <span class="op">=</span> <span class="st">"</span><span class="va">$API_KEY</span><span class="st">"</span></span>
 | ||
| <span id="cb207-7"><a href="#cb207-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb207-8"><a href="#cb207-8" aria-hidden="true" tabindex="-1"></a><span class="va">$irm</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="st">"https://api.kinopoisk.dev/v1.4/movie/</span><span class="va">$id</span><span class="st">"</span> <span class="op">-</span>Method GET <span class="op">-</span>Headers <span class="va">$Header</span></span>
 | ||
| <span id="cb207-9"><a href="#cb207-9" aria-hidden="true" tabindex="-1"></a><span class="va">$irm</span><span class="op">.</span><span class="fu">rating</span><span class="op">.</span><span class="fu">kp</span> <span class="co"># рейтинг в Кинопоиск (8,079)</span></span>
 | ||
| <span id="cb207-10"><a href="#cb207-10" aria-hidden="true" tabindex="-1"></a><span class="va">$irm</span><span class="op">.</span><span class="fu">seasonsInfo</span> <span class="co"># количество сезонов и эпизодов в них</span></span></code></pre></div>
 | ||
| <div class="sourceCode" id="cb208"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb208-1"><a href="#cb208-1" aria-hidden="true" tabindex="-1"></a><span class="va">id</span><span class="op">=</span>5106881</span>
 | ||
| <span id="cb208-2"><a href="#cb208-2" aria-hidden="true" tabindex="-1"></a><span class="va">API_KEY</span><span class="op">=</span><span class="st">"ZYMNJJA-0J8MNPN-PB4N7R7-XXXXXXX"</span></span>
 | ||
| <span id="cb208-3"><a href="#cb208-3" aria-hidden="true" tabindex="-1"></a><span class="va">get</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-X</span> GET <span class="dt">\</span></span>
 | ||
| <span id="cb208-4"><a href="#cb208-4" aria-hidden="true" tabindex="-1"></a>  <span class="st">"https://api.kinopoisk.dev/v1.4/movie/</span><span class="va">$id</span><span class="st">"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb208-5"><a href="#cb208-5" aria-hidden="true" tabindex="-1"></a>  <span class="at">-H</span> <span class="st">"accept: application/json"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb208-6"><a href="#cb208-6" aria-hidden="true" tabindex="-1"></a>  <span class="at">-H</span> <span class="st">"X-API-KEY: </span><span class="va">$API_KEY</span><span class="st">"</span><span class="va">)</span></span>
 | ||
| <span id="cb208-7"><a href="#cb208-7" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="va">$get</span> <span class="kw">|</span> <span class="ex">jq</span> .rating.kp <span class="co"># рейтинг в Кинопоиск (8,079)</span></span>
 | ||
| <span id="cb208-8"><a href="#cb208-8" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="va">$get</span> <span class="kw">|</span> <span class="ex">jq</span> .seasonsInfo<span class="pp">[</span><span class="ss">1</span><span class="pp">]</span>.episodesCount <span class="co"># количество эпизодов во втором [1] сезоне (6)</span></span></code></pre></div>
 | ||
| <p><code>GET /v1.4/movie/search</code></p>
 | ||
| <div class="sourceCode" id="cb209"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb209-1"><a href="#cb209-1" aria-hidden="true" tabindex="-1"></a><span class="va">query</span><span class="op">=</span><span class="st">"zimorodok"</span></span>
 | ||
| <span id="cb209-2"><a href="#cb209-2" aria-hidden="true" tabindex="-1"></a><span class="va">page</span><span class="op">=</span>1 <span class="co"># кол-во страниц для выборки</span></span>
 | ||
| <span id="cb209-3"><a href="#cb209-3" aria-hidden="true" tabindex="-1"></a><span class="va">limit</span><span class="op">=</span>1 <span class="co"># кол-во элементов на странице</span></span>
 | ||
| <span id="cb209-4"><a href="#cb209-4" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-X</span> GET <span class="dt">\</span></span>
 | ||
| <span id="cb209-5"><a href="#cb209-5" aria-hidden="true" tabindex="-1"></a>  <span class="st">"https://api.kinopoisk.dev/v1.4/movie/search?page=</span><span class="va">$page</span><span class="st">&limit=</span><span class="va">$limit</span><span class="st">&query=</span><span class="va">$query</span><span class="st">"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb209-6"><a href="#cb209-6" aria-hidden="true" tabindex="-1"></a>  <span class="at">-H</span> <span class="st">"accept: application/json"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb209-7"><a href="#cb209-7" aria-hidden="true" tabindex="-1"></a>  <span class="at">-H</span> <span class="st">"X-API-KEY: </span><span class="va">$API_KEY</span><span class="st">"</span> <span class="kw">|</span> <span class="ex">jq</span> .</span>
 | ||
| <span id="cb209-8"><a href="#cb209-8" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb209-9"><a href="#cb209-9" aria-hidden="true" tabindex="-1"></a><span class="va">limit</span><span class="op">=</span>5</span>
 | ||
| <span id="cb209-10"><a href="#cb209-10" aria-hidden="true" tabindex="-1"></a><span class="va">request</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-X</span> GET <span class="dt">\</span></span>
 | ||
| <span id="cb209-11"><a href="#cb209-11" aria-hidden="true" tabindex="-1"></a>  <span class="st">"https://api.kinopoisk.dev/v1.4/movie/search?page=</span><span class="va">$page</span><span class="st">&limit=</span><span class="va">$limit</span><span class="st">&query=%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb209-12"><a href="#cb209-12" aria-hidden="true" tabindex="-1"></a>  <span class="at">-H</span> <span class="st">"accept: application/json"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb209-13"><a href="#cb209-13" aria-hidden="true" tabindex="-1"></a>  <span class="at">-H</span> <span class="st">"X-API-KEY: </span><span class="va">$API_KEY</span><span class="st">"</span> <span class="kw">|</span> <span class="ex">jq</span> .<span class="va">)</span></span>
 | ||
| <span id="cb209-14"><a href="#cb209-14" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="va">$request</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="st">'.docs[] | select(.year == 2022)'</span> <span class="co"># отфильтровать вывод по году выхода</span></span></code></pre></div>
 | ||
| <div class="sourceCode" id="cb210"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb210-1"><a href="#cb210-1" aria-hidden="true" tabindex="-1"></a><span class="va">$API_KEY</span> <span class="op">=</span> <span class="st">"ZYMNJJA-0J8MNPN-PB4N7R7-XXXXXXX"</span></span>
 | ||
| <span id="cb210-2"><a href="#cb210-2" aria-hidden="true" tabindex="-1"></a><span class="va">$page</span> <span class="op">=</span> <span class="dv">1</span></span>
 | ||
| <span id="cb210-3"><a href="#cb210-3" aria-hidden="true" tabindex="-1"></a><span class="va">$limit</span> <span class="op">=</span> <span class="dv">5</span></span>
 | ||
| <span id="cb210-4"><a href="#cb210-4" aria-hidden="true" tabindex="-1"></a><span class="va">$query</span> <span class="op">=</span> <span class="st">"%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA"</span></span>
 | ||
| <span id="cb210-5"><a href="#cb210-5" aria-hidden="true" tabindex="-1"></a><span class="va">$request</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="st">"https://api.kinopoisk.dev/v1.4/movie/search?page=</span><span class="va">$page</span><span class="st">&limit=</span><span class="va">$limit</span><span class="st">&query=</span><span class="va">$query</span><span class="st">"</span> <span class="op">-</span>Headers @<span class="op">{</span><span class="st">"accept"</span><span class="op">=</span><span class="st">"application/json"</span><span class="op">;</span> <span class="st">"X-API-KEY"</span><span class="op">=</span><span class="st">"</span><span class="va">$API_KEY</span><span class="st">"</span><span class="op">}</span></span>
 | ||
| <span id="cb210-6"><a href="#cb210-6" aria-hidden="true" tabindex="-1"></a><span class="va">$request</span><span class="op">.</span><span class="fu">docs</span> <span class="op">|</span> <span class="fu">Where-Object</span> year <span class="op">-eq</span> <span class="dv">2022</span></span></code></pre></div>
 | ||
| <h3 id="urlcode">UrlCode</h3>
 | ||
| <div class="sourceCode" id="cb211"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb211-1"><a href="#cb211-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-PercentEncode <span class="op">(</span><span class="va">$str</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb211-2"><a href="#cb211-2" aria-hidden="true" tabindex="-1"></a>   <span class="va">$bytes</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Text</span><span class="op">.</span><span class="fu">Encoding</span><span class="op">]::</span>UTF8<span class="op">.</span><span class="fu">GetBytes</span><span class="op">(</span><span class="va">$str</span><span class="op">)</span></span>
 | ||
| <span id="cb211-3"><a href="#cb211-3" aria-hidden="true" tabindex="-1"></a>   <span class="op">(</span><span class="va">$bytes</span> <span class="op">|</span> <span class="fu">ForEach-Object</span> <span class="op">{</span> <span class="st">"{0:X2}"</span> <span class="op">-</span>f <span class="va">$_</span> <span class="op">})</span> <span class="op">-join</span> <span class="st">'%'</span> <span class="op">-replace</span> <span class="st">"^"</span><span class="op">,</span><span class="st">"%"</span></span>
 | ||
| <span id="cb211-4"><a href="#cb211-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb211-5"><a href="#cb211-5" aria-hidden="true" tabindex="-1"></a>Get-PercentEncode <span class="st">"зимородок"</span></span></code></pre></div>
 | ||
| <div class="sourceCode" id="cb212"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb212-1"><a href="#cb212-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-UrlEncode<span class="op">(</span><span class="va">$str</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb212-2"><a href="#cb212-2" aria-hidden="true" tabindex="-1"></a>   <span class="op">[</span>System<span class="op">.</span><span class="fu">Web</span><span class="op">.</span><span class="fu">HttpUtility</span><span class="op">]::</span>UrlEncode<span class="op">(</span><span class="va">$str</span><span class="op">)</span></span>
 | ||
| <span id="cb212-3"><a href="#cb212-3" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb212-4"><a href="#cb212-4" aria-hidden="true" tabindex="-1"></a>UrlEncode <span class="st">"зимородок"</span></span></code></pre></div>
 | ||
| <div class="sourceCode" id="cb213"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb213-1"><a href="#cb213-1" aria-hidden="true" tabindex="-1"></a><span class="fu">percent-encode()</span> <span class="kw">{</span></span>
 | ||
| <span id="cb213-2"><a href="#cb213-2" aria-hidden="true" tabindex="-1"></a>    <span class="va">str</span><span class="op">=</span><span class="va">$1</span></span>
 | ||
| <span id="cb213-3"><a href="#cb213-3" aria-hidden="true" tabindex="-1"></a>    <span class="bu">echo</span> <span class="at">-n</span> <span class="st">"</span><span class="va">$1</span><span class="st">"</span> <span class="kw">|</span> <span class="fu">iconv</span> <span class="at">-t</span> utf8 <span class="kw">|</span> <span class="fu">od</span> <span class="at">-An</span> <span class="at">-tx1</span> <span class="kw">|</span> <span class="fu">tr</span> <span class="st">' '</span> % <span class="kw">|</span> <span class="fu">tr</span> <span class="at">-d</span> <span class="st">'\n'</span></span>
 | ||
| <span id="cb213-4"><a href="#cb213-4" aria-hidden="true" tabindex="-1"></a><span class="kw">}</span></span>
 | ||
| <span id="cb213-5"><a href="#cb213-5" aria-hidden="true" tabindex="-1"></a><span class="ex">percent-encode</span> <span class="st">"зимородок"</span></span></code></pre></div>
 | ||
| <div class="sourceCode" id="cb214"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb214-1"><a href="#cb214-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-UrlDecode<span class="op">(</span><span class="va">$encoded</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb214-2"><a href="#cb214-2" aria-hidden="true" tabindex="-1"></a>    <span class="op">[</span>System<span class="op">.</span><span class="fu">Uri</span><span class="op">]::</span>UnescapeDataString<span class="op">(</span><span class="va">$encoded</span><span class="op">)</span></span>
 | ||
| <span id="cb214-3"><a href="#cb214-3" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb214-4"><a href="#cb214-4" aria-hidden="true" tabindex="-1"></a>Get-UrlDecode <span class="st">"%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA"</span></span></code></pre></div>
 | ||
| <div class="sourceCode" id="cb215"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb215-1"><a href="#cb215-1" aria-hidden="true" tabindex="-1"></a><span class="fu">percent-decode()</span> <span class="kw">{</span></span>
 | ||
| <span id="cb215-2"><a href="#cb215-2" aria-hidden="true" tabindex="-1"></a>    <span class="va">encoded</span><span class="op">=</span><span class="va">$1</span></span>
 | ||
| <span id="cb215-3"><a href="#cb215-3" aria-hidden="true" tabindex="-1"></a>    <span class="bu">local</span> <span class="va">url_encoded</span><span class="op">=</span><span class="st">"</span><span class="va">${1</span><span class="op">//</span><span class="ss">+</span><span class="op">/</span> <span class="va">}</span><span class="st">"</span></span>
 | ||
| <span id="cb215-4"><a href="#cb215-4" aria-hidden="true" tabindex="-1"></a>    <span class="bu">printf</span> <span class="st">'%b'</span> <span class="st">"</span><span class="va">${url_encoded</span><span class="op">//</span><span class="ss">%</span><span class="op">/</span><span class="dt">\\</span>x<span class="va">}</span><span class="st">"</span></span>
 | ||
| <span id="cb215-5"><a href="#cb215-5" aria-hidden="true" tabindex="-1"></a><span class="kw">}</span></span>
 | ||
| <span id="cb215-6"><a href="#cb215-6" aria-hidden="true" tabindex="-1"></a><span class="ex">percent-decode</span> <span class="st">"%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA"</span></span></code></pre></div>
 | ||
| <h1 id="videocdn">VideoCDN</h1>
 | ||
| <p>https://github.com/notssh/videocdn-api<br />
 | ||
| https://github.com/API-Movies/videocdn<br />
 | ||
| https://api-movies.github.io/videocdn/index.json</p>
 | ||
| <div class="sourceCode" id="cb216"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb216-1"><a href="#cb216-1" aria-hidden="true" tabindex="-1"></a><span class="va">$kp_id</span> <span class="op">=</span> <span class="dv">5106881</span></span>
 | ||
| <span id="cb216-2"><a href="#cb216-2" aria-hidden="true" tabindex="-1"></a><span class="va">$token</span> <span class="op">=</span> <span class="st">"YfTWH2p3Mai7ziqDoGjS3yXXXXXXXXXX"</span></span>
 | ||
| <span id="cb216-3"><a href="#cb216-3" aria-hidden="true" tabindex="-1"></a><span class="va">$ep</span> <span class="op">=</span> <span class="st">"tv-series"</span></span>
 | ||
| <span id="cb216-4"><a href="#cb216-4" aria-hidden="true" tabindex="-1"></a><span class="op">$(</span><span class="fu">Invoke-RestMethod</span> <span class="op">$(</span><span class="st">"https://videocdn.tv/api/</span><span class="va">$ep</span><span class="st">"</span><span class="op">+</span><span class="st">"?api_token=</span><span class="va">$token</span><span class="st">&field=kinopoisk_id&query=</span><span class="va">$kp_id</span><span class="st">"</span><span class="op">)).</span><span class="fu">data</span><span class="op">.</span><span class="fu">episodes</span> <span class="op">|</span> <span class="fu">Where-Object</span> season_num <span class="op">-eq</span> <span class="dv">2</span> <span class="op">|</span> <span class="fu">Select-Object</span> @<span class="op">{</span>Name<span class="op">=</span><span class="st">"Episode"</span><span class="op">;</span> Expression<span class="op">={</span><span class="va">$_</span><span class="op">.</span><span class="fu">num</span><span class="op">}},</span> @<span class="op">{</span>Name<span class="op">=</span><span class="st">"Voice"</span><span class="op">;</span> Expression<span class="op">={</span><span class="va">$_</span><span class="op">.</span><span class="fu">media</span><span class="op">.</span><span class="fu">translation</span><span class="op">.</span><span class="fu">title</span><span class="op">}}</span> <span class="co"># отфильтровать серии по второму сезону и отобразить все озвучки к сериям</span></span></code></pre></div>
 | ||
| <div class="sourceCode" id="cb217"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb217-1"><a href="#cb217-1" aria-hidden="true" tabindex="-1"></a><span class="va">kp_id</span><span class="op">=</span>5106881</span>
 | ||
| <span id="cb217-2"><a href="#cb217-2" aria-hidden="true" tabindex="-1"></a><span class="va">token</span><span class="op">=</span><span class="st">"YfTWH2p3Mai7ziqDoGjS3yXXXXXXXXXX"</span></span>
 | ||
| <span id="cb217-3"><a href="#cb217-3" aria-hidden="true" tabindex="-1"></a><span class="va">ep</span><span class="op">=</span><span class="st">"tv-series"</span></span>
 | ||
| <span id="cb217-4"><a href="#cb217-4" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="st">"https://videocdn.tv/api/</span><span class="va">$ep</span><span class="st">?api_token=</span><span class="va">$token</span><span class="st">&field=kinopoisk_id&query=</span><span class="va">$kp_id</span><span class="st">"</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="st">".data[].episodes | length"</span> <span class="co"># количество серий</span></span>
 | ||
| <span id="cb217-5"><a href="#cb217-5" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="st">"https://videocdn.tv/api/</span><span class="va">$ep</span><span class="st">?api_token=</span><span class="va">$token</span><span class="st">&field=kinopoisk_id&query=</span><span class="va">$kp_id</span><span class="st">"</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="st">".data[].episodes[] | select(.season_num == 2) | {episode: .ru_title, voice: .media[].translation.title}"</span> <span class="co"># отфильтровать параметры вывода</span></span></code></pre></div>
 | ||
| <h1 id="telegram">Telegram</h1>
 | ||
| <p><span class="citation" data-cites="BotFather">@BotFather</span>
 | ||
| (https://t.me/BotFather) /newbot</p>
 | ||
| <p>https://api.telegram.org/bot<token>/<endpoint></p>
 | ||
| <p>https://core.telegram.org/bots/api#getupdates</p>
 | ||
| <div class="sourceCode" id="cb218"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb218-1"><a href="#cb218-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-FromTelegram <span class="op">{</span></span>
 | ||
| <span id="cb218-2"><a href="#cb218-2" aria-hidden="true" tabindex="-1"></a>    <span class="kw">param</span> <span class="op">(</span></span>
 | ||
| <span id="cb218-3"><a href="#cb218-3" aria-hidden="true" tabindex="-1"></a>        <span class="va">$Token</span> <span class="op">=</span> <span class="st">"687...:AAF..."</span><span class="op">,</span></span>
 | ||
| <span id="cb218-4"><a href="#cb218-4" aria-hidden="true" tabindex="-1"></a>        <span class="op">[</span><span class="dt">switch</span><span class="op">]</span><span class="va">$Date</span><span class="op">,</span></span>
 | ||
| <span id="cb218-5"><a href="#cb218-5" aria-hidden="true" tabindex="-1"></a>        <span class="op">[</span><span class="dt">switch</span><span class="op">]</span><span class="va">$Last</span><span class="op">,</span></span>
 | ||
| <span id="cb218-6"><a href="#cb218-6" aria-hidden="true" tabindex="-1"></a>        <span class="op">[</span><span class="dt">switch</span><span class="op">]</span><span class="va">$ChatID</span></span>
 | ||
| <span id="cb218-7"><a href="#cb218-7" aria-hidden="true" tabindex="-1"></a>    <span class="op">)</span></span>
 | ||
| <span id="cb218-8"><a href="#cb218-8" aria-hidden="true" tabindex="-1"></a>    <span class="va">$endpoint</span> <span class="op">=</span> <span class="st">"getUpdates"</span></span>
 | ||
| <span id="cb218-9"><a href="#cb218-9" aria-hidden="true" tabindex="-1"></a>    <span class="va">$url</span>      <span class="op">=</span> <span class="st">"https://api.telegram.org/bot</span><span class="va">$Token</span><span class="st">/</span><span class="va">$endpoint</span><span class="st">"</span></span>
 | ||
| <span id="cb218-10"><a href="#cb218-10" aria-hidden="true" tabindex="-1"></a>    <span class="va">$result</span>   <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="va">$url</span></span>
 | ||
| <span id="cb218-11"><a href="#cb218-11" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span><span class="va">$Date</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb218-12"><a href="#cb218-12" aria-hidden="true" tabindex="-1"></a>        <span class="va">$Collections</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Collections</span><span class="op">.</span><span class="fu">Generic</span><span class="op">.</span><span class="fu">List</span><span class="op">[</span>System<span class="op">.</span><span class="fu">Object</span><span class="op">]</span></span>
 | ||
| <span id="cb218-13"><a href="#cb218-13" aria-hidden="true" tabindex="-1"></a>        <span class="cf">foreach</span> <span class="op">(</span><span class="va">$r</span> <span class="kw">in</span> <span class="op">$(</span><span class="va">$result</span><span class="op">.</span><span class="fu">result</span><span class="op">))</span> <span class="op">{</span></span>
 | ||
| <span id="cb218-14"><a href="#cb218-14" aria-hidden="true" tabindex="-1"></a>            <span class="va">$EpochTime</span> <span class="op">=</span> <span class="op">[</span>DateTime<span class="op">]</span><span class="st">"1/1/1970"</span></span>
 | ||
| <span id="cb218-15"><a href="#cb218-15" aria-hidden="true" tabindex="-1"></a>            <span class="va">$TimeZone</span> <span class="op">=</span> Get-TimeZone</span>
 | ||
| <span id="cb218-16"><a href="#cb218-16" aria-hidden="true" tabindex="-1"></a>            <span class="va">$UTCTime</span> <span class="op">=</span> <span class="va">$EpochTime</span><span class="op">.</span><span class="fu">AddSeconds</span><span class="op">(</span><span class="va">$r</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">date</span><span class="op">)</span></span>
 | ||
| <span id="cb218-17"><a href="#cb218-17" aria-hidden="true" tabindex="-1"></a>            <span class="va">$d</span> <span class="op">=</span> <span class="va">$UTCTime</span><span class="op">.</span><span class="fu">AddMinutes</span><span class="op">(</span><span class="va">$TimeZone</span><span class="op">.</span><span class="fu">BaseUtcOffset</span><span class="op">.</span><span class="fu">TotalMinutes</span><span class="op">)</span></span>
 | ||
| <span id="cb218-18"><a href="#cb218-18" aria-hidden="true" tabindex="-1"></a>            <span class="va">$Collections</span><span class="op">.</span><span class="fu">Add</span><span class="op">([</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span></span>
 | ||
| <span id="cb218-19"><a href="#cb218-19" aria-hidden="true" tabindex="-1"></a>                Message <span class="op">=</span> <span class="va">$r</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">text</span><span class="op">;</span></span>
 | ||
| <span id="cb218-20"><a href="#cb218-20" aria-hidden="true" tabindex="-1"></a>                Date    <span class="op">=</span> <span class="va">$d</span></span>
 | ||
| <span id="cb218-21"><a href="#cb218-21" aria-hidden="true" tabindex="-1"></a>            <span class="op">})</span></span>
 | ||
| <span id="cb218-22"><a href="#cb218-22" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb218-23"><a href="#cb218-23" aria-hidden="true" tabindex="-1"></a>        <span class="va">$Collections</span></span>
 | ||
| <span id="cb218-24"><a href="#cb218-24" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb218-25"><a href="#cb218-25" aria-hidden="true" tabindex="-1"></a>    <span class="cf">else</span> <span class="op">{</span></span>
 | ||
| <span id="cb218-26"><a href="#cb218-26" aria-hidden="true" tabindex="-1"></a>        <span class="cf">if</span> <span class="op">(</span><span class="va">$Last</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb218-27"><a href="#cb218-27" aria-hidden="true" tabindex="-1"></a>            <span class="va">$result</span><span class="op">.</span><span class="fu">result</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">text</span><span class="op">[</span>-1<span class="op">]</span></span>
 | ||
| <span id="cb218-28"><a href="#cb218-28" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb218-29"><a href="#cb218-29" aria-hidden="true" tabindex="-1"></a>        <span class="cf">elseif</span> <span class="op">(</span><span class="va">$ChatID</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb218-30"><a href="#cb218-30" aria-hidden="true" tabindex="-1"></a>            <span class="va">$Collections</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Collections</span><span class="op">.</span><span class="fu">Generic</span><span class="op">.</span><span class="fu">List</span><span class="op">[</span>System<span class="op">.</span><span class="fu">Object</span><span class="op">]</span></span>
 | ||
| <span id="cb218-31"><a href="#cb218-31" aria-hidden="true" tabindex="-1"></a>            <span class="cf">foreach</span> <span class="op">(</span><span class="va">$r</span> <span class="kw">in</span> <span class="op">$(</span><span class="va">$result</span><span class="op">.</span><span class="fu">result</span><span class="op">))</span> <span class="op">{</span></span>
 | ||
| <span id="cb218-32"><a href="#cb218-32" aria-hidden="true" tabindex="-1"></a>                <span class="va">$Collections</span><span class="op">.</span><span class="fu">Add</span><span class="op">([</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span></span>
 | ||
| <span id="cb218-33"><a href="#cb218-33" aria-hidden="true" tabindex="-1"></a>                    Message <span class="op">=</span> <span class="va">$r</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">text</span><span class="op">;</span></span>
 | ||
| <span id="cb218-34"><a href="#cb218-34" aria-hidden="true" tabindex="-1"></a>                    UserName <span class="op">=</span> <span class="va">$r</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">chat</span><span class="op">.</span><span class="fu">username</span><span class="op">;</span></span>
 | ||
| <span id="cb218-35"><a href="#cb218-35" aria-hidden="true" tabindex="-1"></a>                    ChatID <span class="op">=</span> <span class="va">$r</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">chat</span><span class="op">.</span><span class="fu">id</span><span class="op">;</span></span>
 | ||
| <span id="cb218-36"><a href="#cb218-36" aria-hidden="true" tabindex="-1"></a>                    ChatType <span class="op">=</span> <span class="va">$r</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">chat</span><span class="op">.</span><span class="fu">type</span></span>
 | ||
| <span id="cb218-37"><a href="#cb218-37" aria-hidden="true" tabindex="-1"></a>                <span class="op">})</span></span>
 | ||
| <span id="cb218-38"><a href="#cb218-38" aria-hidden="true" tabindex="-1"></a>            <span class="op">}</span></span>
 | ||
| <span id="cb218-39"><a href="#cb218-39" aria-hidden="true" tabindex="-1"></a>            <span class="va">$Collections</span></span>
 | ||
| <span id="cb218-40"><a href="#cb218-40" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb218-41"><a href="#cb218-41" aria-hidden="true" tabindex="-1"></a>        <span class="cf">else</span> <span class="op">{</span></span>
 | ||
| <span id="cb218-42"><a href="#cb218-42" aria-hidden="true" tabindex="-1"></a>            <span class="va">$result</span><span class="op">.</span><span class="fu">result</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">text</span></span>
 | ||
| <span id="cb218-43"><a href="#cb218-43" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb218-44"><a href="#cb218-44" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb218-45"><a href="#cb218-45" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>Get-FromTelegram</code><br />
 | ||
| <code>Get-FromTelegram -Last</code><br />
 | ||
| <code>Get-FromTelegram -Date</code><br />
 | ||
| <code>Get-FromTelegram -ChatID</code></p>
 | ||
| <p>https://core.telegram.org/bots/api#sendmessage</p>
 | ||
| <div class="sourceCode" id="cb219"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb219-1"><a href="#cb219-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Send-ToTelegram <span class="op">{</span></span>
 | ||
| <span id="cb219-2"><a href="#cb219-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span> <span class="op">(</span></span>
 | ||
| <span id="cb219-3"><a href="#cb219-3" aria-hidden="true" tabindex="-1"></a>    <span class="op">[</span>Parameter<span class="op">(</span>Mandatory <span class="op">=</span> <span class="va">$True</span><span class="op">)]</span><span class="va">$Text</span><span class="op">,</span></span>
 | ||
| <span id="cb219-4"><a href="#cb219-4" aria-hidden="true" tabindex="-1"></a>    <span class="va">$Token</span>    <span class="op">=</span> <span class="st">"687...:AAF..."</span><span class="op">,</span></span>
 | ||
| <span id="cb219-5"><a href="#cb219-5" aria-hidden="true" tabindex="-1"></a>    <span class="va">$Chat</span>     <span class="op">=</span> <span class="st">"125468108"</span><span class="op">,</span></span>
 | ||
| <span id="cb219-6"><a href="#cb219-6" aria-hidden="true" tabindex="-1"></a>    <span class="va">$Keyboard</span></span>
 | ||
| <span id="cb219-7"><a href="#cb219-7" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
 | ||
| <span id="cb219-8"><a href="#cb219-8" aria-hidden="true" tabindex="-1"></a>    <span class="va">$endpoint</span> <span class="op">=</span> <span class="st">"sendMessage"</span></span>
 | ||
| <span id="cb219-9"><a href="#cb219-9" aria-hidden="true" tabindex="-1"></a>    <span class="va">$url</span>      <span class="op">=</span> <span class="st">"https://api.telegram.org/bot</span><span class="va">$Token</span><span class="st">/</span><span class="va">$endpoint</span><span class="st">"</span></span>
 | ||
| <span id="cb219-10"><a href="#cb219-10" aria-hidden="true" tabindex="-1"></a>    <span class="va">$Body</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb219-11"><a href="#cb219-11" aria-hidden="true" tabindex="-1"></a>        chat_id <span class="op">=</span> <span class="va">$Chat</span></span>
 | ||
| <span id="cb219-12"><a href="#cb219-12" aria-hidden="true" tabindex="-1"></a>        text    <span class="op">=</span> <span class="va">$Text</span></span>
 | ||
| <span id="cb219-13"><a href="#cb219-13" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb219-14"><a href="#cb219-14" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span><span class="va">$keyboard</span> <span class="op">-ne</span> <span class="va">$null</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb219-15"><a href="#cb219-15" aria-hidden="true" tabindex="-1"></a>        <span class="va">$Body</span> <span class="op">+=</span> @<span class="op">{</span>reply_markup <span class="op">=</span> <span class="va">$keyboard</span><span class="op">}</span></span>
 | ||
| <span id="cb219-16"><a href="#cb219-16" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb219-17"><a href="#cb219-17" aria-hidden="true" tabindex="-1"></a>    <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Body <span class="va">$Body</span></span>
 | ||
| <span id="cb219-18"><a href="#cb219-18" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>Send-ToTelegram -Text "Send test from powershell"</code></p>
 | ||
| <div class="sourceCode" id="cb220"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb220-1"><a href="#cb220-1" aria-hidden="true" tabindex="-1"></a><span class="va">$LastDate</span> <span class="op">=</span> <span class="op">(</span>Get-FromTelegram <span class="op">-</span>date<span class="op">)[</span>-1<span class="op">].</span><span class="fu">Date</span></span>
 | ||
| <span id="cb220-2"><a href="#cb220-2" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(</span><span class="va">$true</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb220-3"><a href="#cb220-3" aria-hidden="true" tabindex="-1"></a>    <span class="va">$LastMessage</span>  <span class="op">=</span> <span class="op">(</span>Get-FromTelegram <span class="op">-</span>date<span class="op">)[</span>-1<span class="op">]</span></span>
 | ||
| <span id="cb220-4"><a href="#cb220-4" aria-hidden="true" tabindex="-1"></a>    <span class="fu">Start-Sleep</span> <span class="dv">1</span></span>
 | ||
| <span id="cb220-5"><a href="#cb220-5" aria-hidden="true" tabindex="-1"></a>    <span class="va">$LastDateTest</span> <span class="op">=</span> <span class="va">$LastMessage</span><span class="op">.</span><span class="fu">Date</span></span>
 | ||
| <span id="cb220-6"><a href="#cb220-6" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">((</span><span class="va">$LastMessage</span><span class="op">.</span><span class="fu">Message</span> <span class="op">-match</span> <span class="st">"/Service"</span><span class="op">)</span> <span class="op">-and</span> <span class="op">(</span><span class="va">$LastDate</span> <span class="op">-ne</span> <span class="va">$LastDateTest</span><span class="op">))</span> <span class="op">{</span></span>
 | ||
| <span id="cb220-7"><a href="#cb220-7" aria-hidden="true" tabindex="-1"></a>        <span class="va">$ServiceName</span> <span class="op">=</span> <span class="op">$(</span><span class="va">$LastMessage</span><span class="op">.</span><span class="fu">Message</span> <span class="op">-split</span> <span class="st">" "</span><span class="op">)[</span>-1<span class="op">]</span></span>
 | ||
| <span id="cb220-8"><a href="#cb220-8" aria-hidden="true" tabindex="-1"></a>        <span class="va">$Result</span> <span class="op">=</span> <span class="op">$(</span><span class="fu">Get-Service</span> <span class="va">$ServiceName</span> <span class="op">-</span>ErrorAction Ignore<span class="op">).</span><span class="fu">Status</span></span>
 | ||
| <span id="cb220-9"><a href="#cb220-9" aria-hidden="true" tabindex="-1"></a>        <span class="cf">if</span> <span class="op">(</span><span class="va">$Result</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb220-10"><a href="#cb220-10" aria-hidden="true" tabindex="-1"></a>            Send-ToTelegram <span class="op">-</span>Text <span class="va">$Result</span></span>
 | ||
| <span id="cb220-11"><a href="#cb220-11" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span> <span class="cf">else</span> <span class="op">{</span></span>
 | ||
| <span id="cb220-12"><a href="#cb220-12" aria-hidden="true" tabindex="-1"></a>            Send-ToTelegram <span class="op">-</span>Text <span class="st">"Service not found"</span></span>
 | ||
| <span id="cb220-13"><a href="#cb220-13" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb220-14"><a href="#cb220-14" aria-hidden="true" tabindex="-1"></a>        <span class="va">$LastDate</span> <span class="op">=</span> <span class="va">$LastDateTest</span></span>
 | ||
| <span id="cb220-15"><a href="#cb220-15" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb220-16"><a href="#cb220-16" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <p><code>/Service vpnagent</code><br />
 | ||
| <code>/Service WinRM</code><br />
 | ||
| <code>/Service test</code></p>
 | ||
| <h3 id="button">Button</h3>
 | ||
| <div class="sourceCode" id="cb221"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb221-1"><a href="#cb221-1" aria-hidden="true" tabindex="-1"></a><span class="va">$keyboard</span> <span class="op">=</span> <span class="st">'{</span></span>
 | ||
| <span id="cb221-2"><a href="#cb221-2" aria-hidden="true" tabindex="-1"></a><span class="st">    "inline_keyboard":[[</span></span>
 | ||
| <span id="cb221-3"><a href="#cb221-3" aria-hidden="true" tabindex="-1"></a><span class="st">        {"text":"Uptime","callback_data":"/Uptime"},</span></span>
 | ||
| <span id="cb221-4"><a href="#cb221-4" aria-hidden="true" tabindex="-1"></a><span class="st">        {"text":"Test","callback_data":"/Test"}</span></span>
 | ||
| <span id="cb221-5"><a href="#cb221-5" aria-hidden="true" tabindex="-1"></a><span class="st">    ]]</span></span>
 | ||
| <span id="cb221-6"><a href="#cb221-6" aria-hidden="true" tabindex="-1"></a><span class="st">}'</span></span>
 | ||
| <span id="cb221-7"><a href="#cb221-7" aria-hidden="true" tabindex="-1"></a>Send-ToTelegram <span class="op">-</span>Text <span class="st">"Test buttons"</span> <span class="op">-</span>Keyboard <span class="va">$keyboard</span></span>
 | ||
| <span id="cb221-8"><a href="#cb221-8" aria-hidden="true" tabindex="-1"></a><span class="va">$request</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="st">"https://api.telegram.org/bot</span><span class="va">$Token</span><span class="st">/getUpdates"</span><span class="op">).</span><span class="fu">result</span><span class="op">.</span><span class="fu">callback_query</span></span>
 | ||
| <span id="cb221-9"><a href="#cb221-9" aria-hidden="true" tabindex="-1"></a><span class="va">$request</span><span class="op">.</span><span class="fu">data</span> <span class="co"># прочитать callback_data нажатой кнопки</span></span>
 | ||
| <span id="cb221-10"><a href="#cb221-10" aria-hidden="true" tabindex="-1"></a><span class="va">$request</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">date</span></span></code></pre></div>
 | ||
| <h1 id="discord">Discord</h1>
 | ||
| <p>https://discord.com/developers/applications</p>
 | ||
| <p>Создаем Applications (General Information). В Bot привязываем к
 | ||
| Application и копируем токен авторизации. В OAuth2 - URL Generator
 | ||
| выбираем bot и права Administrator и копируем созданный URL для
 | ||
| добавления на канал. Переходим по url и добавляем бота на сервер.
 | ||
| Получаем ID канала на сервере (текстовые каналы, правой кнопкой мыши
 | ||
| копируем ссылку и забираем последний id в url).</p>
 | ||
| <h3 id="send-to-discord">Send to Discord</h3>
 | ||
| <div class="sourceCode" id="cb222"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb222-1"><a href="#cb222-1" aria-hidden="true" tabindex="-1"></a><span class="va">DISCORD_TOKEN</span><span class="op">=</span><span class="st">"MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX"</span></span>
 | ||
| <span id="cb222-2"><a href="#cb222-2" aria-hidden="true" tabindex="-1"></a><span class="va">DISCORD_CHANNEL_ID</span><span class="op">=</span><span class="st">"119403124XXXXXXXXXX"</span></span>
 | ||
| <span id="cb222-3"><a href="#cb222-3" aria-hidden="true" tabindex="-1"></a><span class="va">TEXT</span><span class="op">=</span><span class="st">"test from bash"</span></span>
 | ||
| <span id="cb222-4"><a href="#cb222-4" aria-hidden="true" tabindex="-1"></a><span class="va">URL</span><span class="op">=</span><span class="st">"https://discordapp.com/api/channels/</span><span class="va">$DISCORD_CHANNEL_ID</span><span class="st">/messages"</span></span>
 | ||
| <span id="cb222-5"><a href="#cb222-5" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-X</span> POST <span class="va">$URL</span> <span class="dt">\</span></span>
 | ||
| <span id="cb222-6"><a href="#cb222-6" aria-hidden="true" tabindex="-1"></a>  <span class="at">-H</span> <span class="st">"Authorization: Bot </span><span class="va">$DISCORD_TOKEN</span><span class="st">"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb222-7"><a href="#cb222-7" aria-hidden="true" tabindex="-1"></a>  <span class="at">-H</span> <span class="st">"Content-Type: application/json"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb222-8"><a href="#cb222-8" aria-hidden="true" tabindex="-1"></a>  <span class="at">-d</span> <span class="st">"{</span><span class="dt">\"</span><span class="st">content</span><span class="dt">\"</span><span class="st">: </span><span class="dt">\"</span><span class="va">$TEXT</span><span class="dt">\"</span><span class="st">}"</span></span></code></pre></div>
 | ||
| <div class="sourceCode" id="cb223"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb223-1"><a href="#cb223-1" aria-hidden="true" tabindex="-1"></a><span class="va">$DISCORD_TOKEN</span> <span class="op">=</span> <span class="st">"MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX"</span></span>
 | ||
| <span id="cb223-2"><a href="#cb223-2" aria-hidden="true" tabindex="-1"></a><span class="va">$DISCORD_CHANNEL_ID</span> <span class="op">=</span> <span class="st">"119403124XXXXXXXXXX"</span></span>
 | ||
| <span id="cb223-3"><a href="#cb223-3" aria-hidden="true" tabindex="-1"></a><span class="va">$TEXT</span> <span class="op">=</span> <span class="st">"test from PowerShell"</span></span>
 | ||
| <span id="cb223-4"><a href="#cb223-4" aria-hidden="true" tabindex="-1"></a><span class="va">$URL</span> <span class="op">=</span> <span class="st">"https://discordapp.com/api/channels/</span><span class="va">$DISCORD_CHANNEL_ID</span><span class="st">/messages"</span></span>
 | ||
| <span id="cb223-5"><a href="#cb223-5" aria-hidden="true" tabindex="-1"></a><span class="va">$Body</span> <span class="op">=</span> @<span class="op">{</span></span>
 | ||
| <span id="cb223-6"><a href="#cb223-6" aria-hidden="true" tabindex="-1"></a>    content <span class="op">=</span> <span class="va">$TEXT</span></span>
 | ||
| <span id="cb223-7"><a href="#cb223-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span></span>
 | ||
| <span id="cb223-8"><a href="#cb223-8" aria-hidden="true" tabindex="-1"></a><span class="fu">curl</span> <span class="op">-</span>s <span class="va">$URL</span> <span class="op">-</span>X POST <span class="op">-</span>H <span class="st">"Authorization: Bot </span><span class="va">$DISCORD_TOKEN</span><span class="st">"</span> <span class="op">-</span>H <span class="st">"Content-Type: application/json"</span> <span class="op">-</span>d <span class="va">$Body</span></span></code></pre></div>
 | ||
| <h3 id="read-from-discord">Read from Discord</h3>
 | ||
| <div class="sourceCode" id="cb224"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb224-1"><a href="#cb224-1" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-X</span> GET <span class="va">$URL</span> <span class="dt">\</span></span>
 | ||
| <span id="cb224-2"><a href="#cb224-2" aria-hidden="true" tabindex="-1"></a>  <span class="at">-H</span> <span class="st">"Authorization: Bot </span><span class="va">$DISCORD_TOKEN</span><span class="st">"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb224-3"><a href="#cb224-3" aria-hidden="true" tabindex="-1"></a>  <span class="at">-H</span> <span class="st">"Content-Type: application/json"</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .<span class="pp">[</span><span class="ss">0</span><span class="pp">]</span>.content</span></code></pre></div>
 | ||
| <div class="sourceCode" id="cb225"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb225-1"><a href="#cb225-1" aria-hidden="true" tabindex="-1"></a><span class="va">$messages</span> <span class="op">=</span> <span class="op">(</span><span class="fu">curl</span> <span class="op">-</span>s <span class="op">-</span>X GET <span class="va">$URL</span> <span class="op">-</span>H <span class="st">"Authorization: Bot </span><span class="va">$DISCORD_TOKEN</span><span class="st">"</span> <span class="op">-</span>H <span class="st">"Content-Type: application/json"</span> <span class="op">|</span> <span class="fu">ConvertFrom-Json</span><span class="op">)</span></span>
 | ||
| <span id="cb225-2"><a href="#cb225-2" aria-hidden="true" tabindex="-1"></a><span class="va">$messages</span> <span class="op">|</span> <span class="fu">Select-Object</span> content<span class="op">,</span>timestamp<span class="op">,{</span><span class="va">$_</span><span class="op">.</span><span class="fu">author</span><span class="op">.</span><span class="fu">username</span><span class="op">}</span></span></code></pre></div>
 | ||
| <h3 id="httpclient">HttpClient</h3>
 | ||
| <div class="sourceCode" id="cb226"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb226-1"><a href="#cb226-1" aria-hidden="true" tabindex="-1"></a><span class="va">$DISCORD_TOKEN</span> <span class="op">=</span> <span class="st">"MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX"</span></span>
 | ||
| <span id="cb226-2"><a href="#cb226-2" aria-hidden="true" tabindex="-1"></a><span class="va">$DISCORD_CHANNEL_ID</span> <span class="op">=</span> <span class="st">"119403124XXXXXXXXXX"</span></span>
 | ||
| <span id="cb226-3"><a href="#cb226-3" aria-hidden="true" tabindex="-1"></a><span class="va">$URL</span> <span class="op">=</span> <span class="st">"https://discordapp.com/api/channels/</span><span class="va">$DISCORD_CHANNEL_ID</span><span class="st">/messages"</span></span>
 | ||
| <span id="cb226-4"><a href="#cb226-4" aria-hidden="true" tabindex="-1"></a><span class="va">$HttpClient</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">Http</span><span class="op">.</span><span class="fu">HttpClient</span></span>
 | ||
| <span id="cb226-5"><a href="#cb226-5" aria-hidden="true" tabindex="-1"></a><span class="va">$HttpClient</span><span class="op">.</span><span class="fu">DefaultRequestHeaders</span><span class="op">.</span><span class="fu">Authorization</span> <span class="op">=</span> <span class="st">"Bot </span><span class="va">$DISCORD_TOKEN</span><span class="st">"</span></span>
 | ||
| <span id="cb226-6"><a href="#cb226-6" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span> <span class="op">=</span> <span class="va">$HttpClient</span><span class="op">.</span><span class="fu">GetAsync</span><span class="op">(</span><span class="va">$URL</span><span class="op">).</span><span class="fu">Result</span></span>
 | ||
| <span id="cb226-7"><a href="#cb226-7" aria-hidden="true" tabindex="-1"></a><span class="va">$messages</span> <span class="op">=</span> <span class="va">$response</span><span class="op">.</span><span class="fu">Content</span><span class="op">.</span><span class="fu">ReadAsStringAsync</span><span class="op">().</span><span class="fu">Result</span></span>
 | ||
| <span id="cb226-8"><a href="#cb226-8" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="va">$messages</span> <span class="op">|</span> <span class="fu">ConvertFrom-Json</span><span class="op">).</span><span class="fu">content</span></span></code></pre></div>
 | ||
| <h3 id="button-1">Button</h3>
 | ||
| <div class="sourceCode" id="cb227"><pre
 | ||
| class="sourceCode bash"><code class="sourceCode bash"><span id="cb227-1"><a href="#cb227-1" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-X</span> POST <span class="va">$URL</span> <span class="dt">\</span></span>
 | ||
| <span id="cb227-2"><a href="#cb227-2" aria-hidden="true" tabindex="-1"></a>  <span class="at">-H</span> <span class="st">"Content-Type: application/json"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb227-3"><a href="#cb227-3" aria-hidden="true" tabindex="-1"></a>  <span class="at">-H</span> <span class="st">"Authorization: Bot </span><span class="va">$DISCORD_TOKEN</span><span class="st">"</span> <span class="dt">\</span></span>
 | ||
| <span id="cb227-4"><a href="#cb227-4" aria-hidden="true" tabindex="-1"></a>  <span class="at">-d</span> <span class="st">'</span></span>
 | ||
| <span id="cb227-5"><a href="#cb227-5" aria-hidden="true" tabindex="-1"></a><span class="st">  {</span></span>
 | ||
| <span id="cb227-6"><a href="#cb227-6" aria-hidden="true" tabindex="-1"></a><span class="st">    "content": "Test text for button",</span></span>
 | ||
| <span id="cb227-7"><a href="#cb227-7" aria-hidden="true" tabindex="-1"></a><span class="st">    "components": [</span></span>
 | ||
| <span id="cb227-8"><a href="#cb227-8" aria-hidden="true" tabindex="-1"></a><span class="st">      {</span></span>
 | ||
| <span id="cb227-9"><a href="#cb227-9" aria-hidden="true" tabindex="-1"></a><span class="st">        "type": 1,</span></span>
 | ||
| <span id="cb227-10"><a href="#cb227-10" aria-hidden="true" tabindex="-1"></a><span class="st">        "components": [</span></span>
 | ||
| <span id="cb227-11"><a href="#cb227-11" aria-hidden="true" tabindex="-1"></a><span class="st">          {</span></span>
 | ||
| <span id="cb227-12"><a href="#cb227-12" aria-hidden="true" tabindex="-1"></a><span class="st">            "type": 2,</span></span>
 | ||
| <span id="cb227-13"><a href="#cb227-13" aria-hidden="true" tabindex="-1"></a><span class="st">            "label": "Button",</span></span>
 | ||
| <span id="cb227-14"><a href="#cb227-14" aria-hidden="true" tabindex="-1"></a><span class="st">            "style": 1,</span></span>
 | ||
| <span id="cb227-15"><a href="#cb227-15" aria-hidden="true" tabindex="-1"></a><span class="st">            "custom_id": "button_click"</span></span>
 | ||
| <span id="cb227-16"><a href="#cb227-16" aria-hidden="true" tabindex="-1"></a><span class="st">          }</span></span>
 | ||
| <span id="cb227-17"><a href="#cb227-17" aria-hidden="true" tabindex="-1"></a><span class="st">        ]</span></span>
 | ||
| <span id="cb227-18"><a href="#cb227-18" aria-hidden="true" tabindex="-1"></a><span class="st">      }</span></span>
 | ||
| <span id="cb227-19"><a href="#cb227-19" aria-hidden="true" tabindex="-1"></a><span class="st">    ]</span></span>
 | ||
| <span id="cb227-20"><a href="#cb227-20" aria-hidden="true" tabindex="-1"></a><span class="st">  }'</span></span></code></pre></div>
 | ||
| <h3 id="discord.net.webhook">Discord.Net.Webhook</h3>
 | ||
| <div class="sourceCode" id="cb228"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb228-1"><a href="#cb228-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Add-Type</span> <span class="op">-</span>Path <span class="op">$(</span><span class="fu">ls</span> <span class="st">"</span><span class="va">$home</span><span class="st">\Documents\Discord.NET\*.dll"</span><span class="op">).</span><span class="fu">FullName</span></span>
 | ||
| <span id="cb228-2"><a href="#cb228-2" aria-hidden="true" tabindex="-1"></a><span class="co"># https://discordapp.com/api/webhooks/<webhook_id>/<webhook_token> (Настроить канал - Интеграция)</span></span>
 | ||
| <span id="cb228-3"><a href="#cb228-3" aria-hidden="true" tabindex="-1"></a><span class="va">$webhookId</span> <span class="op">=</span> <span class="dv">1197577280000000000</span></span>
 | ||
| <span id="cb228-4"><a href="#cb228-4" aria-hidden="true" tabindex="-1"></a><span class="va">$webhookToken</span> <span class="op">=</span> <span class="st">"rs8AA-XXXXXXXXXXX_Vk5RUI4A6HuSGhpCCTepq25duwCwLXasfv6u23a7XXXXXXXXXX"</span></span>
 | ||
| <span id="cb228-5"><a href="#cb228-5" aria-hidden="true" tabindex="-1"></a><span class="va">$messageContent</span> <span class="op">=</span> <span class="st">"Test dotNET"</span></span>
 | ||
| <span id="cb228-6"><a href="#cb228-6" aria-hidden="true" tabindex="-1"></a><span class="va">$client</span> <span class="op">=</span> <span class="fu">New-Object</span> Discord<span class="op">.</span><span class="fu">Webhook</span><span class="op">.</span><span class="fu">DiscordWebhookClient</span><span class="op">(</span><span class="va">$webhookId</span><span class="op">,</span> <span class="va">$webhookToken</span><span class="op">)</span></span>
 | ||
| <span id="cb228-7"><a href="#cb228-7" aria-hidden="true" tabindex="-1"></a><span class="va">$client</span><span class="op">.</span><span class="fu">SendMessageAsync</span><span class="op">(</span><span class="va">$messageContent</span><span class="op">).</span><span class="fu">Wait</span><span class="op">()</span></span></code></pre></div>
 | ||
| <h3 id="discord.net.websocket">Discord.Net.WebSocket</h3>
 | ||
| <div class="sourceCode" id="cb229"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb229-1"><a href="#cb229-1" aria-hidden="true" tabindex="-1"></a><span class="va">$DiscordAssemblies</span> <span class="op">=</span> <span class="op">$(</span><span class="fu">ls</span> <span class="st">"</span><span class="va">$home</span><span class="st">\Documents\Discord.NET\*.dll"</span><span class="op">).</span><span class="fu">FullName</span></span>
 | ||
| <span id="cb229-2"><a href="#cb229-2" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$assembly</span> <span class="kw">in</span> <span class="va">$DiscordAssemblies</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb229-3"><a href="#cb229-3" aria-hidden="true" tabindex="-1"></a>    <span class="fu">Add-Type</span> <span class="op">-</span>Path <span class="va">$assembly</span></span>
 | ||
| <span id="cb229-4"><a href="#cb229-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb229-5"><a href="#cb229-5" aria-hidden="true" tabindex="-1"></a><span class="va">$DISCORD_TOKEN</span> <span class="op">=</span> <span class="st">"MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX"</span></span>
 | ||
| <span id="cb229-6"><a href="#cb229-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Client</span> <span class="op">=</span> <span class="fu">New-Object</span> Discord<span class="op">.</span><span class="fu">WebSocket</span><span class="op">.</span><span class="fu">DiscordSocketClient</span></span>
 | ||
| <span id="cb229-7"><a href="#cb229-7" aria-hidden="true" tabindex="-1"></a><span class="va">$Client</span><span class="op">.</span><span class="fu">Add_MessageReceived</span><span class="op">({</span></span>
 | ||
| <span id="cb229-8"><a href="#cb229-8" aria-hidden="true" tabindex="-1"></a>    <span class="kw">param</span><span class="op">(</span><span class="va">$message</span><span class="op">)</span></span>
 | ||
| <span id="cb229-9"><a href="#cb229-9" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span><span class="va">$message</span><span class="op">.</span><span class="fu">Author</span><span class="op">.</span><span class="fu">Id</span> <span class="op">-ne</span> <span class="va">$Client</span><span class="op">.</span><span class="fu">CurrentUser</span><span class="op">.</span><span class="fu">Id</span><span class="op">)</span> <span class="op">{</span></span>
 | ||
| <span id="cb229-10"><a href="#cb229-10" aria-hidden="true" tabindex="-1"></a>        <span class="fu">Write-Host</span> <span class="op">(</span><span class="st">"Received message from "</span> <span class="op">+</span> <span class="va">$message</span><span class="op">.</span><span class="fu">Author</span><span class="op">.</span><span class="fu">Username</span> <span class="op">+</span> <span class="st">": "</span> <span class="op">+</span> <span class="va">$message</span><span class="op">.</span><span class="fu">Content</span><span class="op">)</span></span>
 | ||
| <span id="cb229-11"><a href="#cb229-11" aria-hidden="true" tabindex="-1"></a>        <span class="cf">if</span> <span class="op">(</span><span class="va">$message</span><span class="op">.</span><span class="fu">Content</span><span class="op">.</span><span class="fu">Contains</span><span class="op">(</span><span class="st">"ping"</span><span class="op">))</span> <span class="op">{</span></span>
 | ||
| <span id="cb229-12"><a href="#cb229-12" aria-hidden="true" tabindex="-1"></a>            <span class="va">$message</span><span class="op">.</span><span class="fu">Channel</span><span class="op">.</span><span class="fu">SendMessageAsync</span><span class="op">(</span><span class="st">"pong"</span><span class="op">).</span><span class="fu">GetAwaiter</span><span class="op">().</span><span class="fu">GetResult</span><span class="op">()</span></span>
 | ||
| <span id="cb229-13"><a href="#cb229-13" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb229-14"><a href="#cb229-14" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb229-15"><a href="#cb229-15" aria-hidden="true" tabindex="-1"></a><span class="op">})</span></span>
 | ||
| <span id="cb229-16"><a href="#cb229-16" aria-hidden="true" tabindex="-1"></a><span class="va">$Client</span><span class="op">.</span><span class="fu">LoginAsync</span><span class="op">([</span>Discord<span class="op">.</span><span class="fu">TokenType</span><span class="op">]::</span>Bot<span class="op">,</span> <span class="va">$DISCORD_TOKEN</span><span class="op">).</span><span class="fu">GetAwaiter</span><span class="op">().</span><span class="fu">GetResult</span><span class="op">()</span></span>
 | ||
| <span id="cb229-17"><a href="#cb229-17" aria-hidden="true" tabindex="-1"></a><span class="co">#$Client.StartAsync().Wait()</span></span>
 | ||
| <span id="cb229-18"><a href="#cb229-18" aria-hidden="true" tabindex="-1"></a><span class="va">$Client</span><span class="op">.</span><span class="fu">StartAsync</span><span class="op">().</span><span class="fu">GetAwaiter</span><span class="op">().</span><span class="fu">GetResult</span><span class="op">()</span></span>
 | ||
| <span id="cb229-19"><a href="#cb229-19" aria-hidden="true" tabindex="-1"></a><span class="va">$Client</span><span class="op">.</span><span class="fu">ConnectionState</span></span>
 | ||
| <span id="cb229-20"><a href="#cb229-20" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb229-21"><a href="#cb229-21" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>console<span class="op">]::</span>ReadKey<span class="op">(</span><span class="va">$true</span><span class="op">)</span></span>
 | ||
| <span id="cb229-22"><a href="#cb229-22" aria-hidden="true" tabindex="-1"></a><span class="va">$Client</span><span class="op">.</span><span class="fu">LogoutAsync</span><span class="op">().</span><span class="fu">GetAwaiter</span><span class="op">().</span><span class="fu">GetResult</span><span class="op">()</span></span>
 | ||
| <span id="cb229-23"><a href="#cb229-23" aria-hidden="true" tabindex="-1"></a><span class="va">$Client</span><span class="op">.</span><span class="fu">Dispose</span><span class="op">()</span></span></code></pre></div>
 | ||
| <h1 id="oh-my-posh">oh-my-posh</h1>
 | ||
| <p><a
 | ||
| href="https://ohmyposh.dev/docs/installation/windows">Install</a></p>
 | ||
| <p><code>winget install JanDeDobbeleer.OhMyPosh -s winget</code><br />
 | ||
| <code>choco install oh-my-posh -y</code><br />
 | ||
| <code>scoop install https://github.com/JanDeDobbeleer/oh-my-posh/releases/latest/download/oh-my-posh.json</code><br />
 | ||
| <code>Set-ExecutionPolicy Bypass -Scope Process -Force; Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://ohmyposh.dev/install.ps1'))</code></p>
 | ||
| <p><a href="https://ohmyposh.dev/docs/themes">Themes</a></p>
 | ||
| <p><code>Get-PoshThemes</code><br />
 | ||
| <code>oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/di4am0nd.omp.json" | Invoke-Expression</code><br />
 | ||
| <code>oh-my-posh init pwsh --config "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/cert.omp.json" | Invoke-Expression</code></p>
 | ||
| <p><code>New-Item -Path $PROFILE -Type File -Force</code><br />
 | ||
| <code>notepad $PROFILE</code><br />
 | ||
| <code>oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/di4am0nd.omp.json" | Invoke-Expression</code></p>
 | ||
| <h3 id="themes-performance">themes-performance</h3>
 | ||
| <div class="sourceCode" id="cb230"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb230-1"><a href="#cb230-1" aria-hidden="true" tabindex="-1"></a>Install-Module themes-performance <span class="op">-</span>Repository NuGet</span>
 | ||
| <span id="cb230-2"><a href="#cb230-2" aria-hidden="true" tabindex="-1"></a><span class="fu">Import-Module</span> themes-performance</span>
 | ||
| <span id="cb230-3"><a href="#cb230-3" aria-hidden="true" tabindex="-1"></a>Set-PoshTheme <span class="op">-</span>Theme System-Sensors <span class="co"># -Save</span></span>
 | ||
| <span id="cb230-4"><a href="#cb230-4" aria-hidden="true" tabindex="-1"></a>Set-PoshTheme <span class="op">-</span>Theme System-Performance <span class="co"># -Save</span></span>
 | ||
| <span id="cb230-5"><a href="#cb230-5" aria-hidden="true" tabindex="-1"></a>Set-PoshTheme <span class="op">-</span>Theme Pwsh-Process-Performance <span class="co"># -Save</span></span></code></pre></div>
 | ||
| <h3 id="terminal-icons">Terminal-Icons</h3>
 | ||
| <p><code>Install-Module -Name Terminal-Icons -Repository PSGallery</code><br />
 | ||
| <code>scoop bucket add extras</code><br />
 | ||
| <code>scoop install terminal-icons</code></p>
 | ||
| <p><code>notepad $PROFILE</code><br />
 | ||
| <code>Import-Module -Name Terminal-Icons</code></p>
 | ||
| <p>Использует шрифты, которые необходимо установить и настроить в
 | ||
| параметрах профиля PowerShell: <a
 | ||
| href="https://github.com/ryanoasis/nerd-fonts">Nerd Fonts</a><br />
 | ||
| Список шрифтов: https://www.nerdfonts.com/font-downloads<br />
 | ||
| Скачать и установить шрифт похожий на Cascadia Code - <a
 | ||
| href="https://github.com/ryanoasis/nerd-fonts/releases/download/v3.1.1/CascadiaCode.zip">CaskaydiaCove</a></p>
 | ||
| <h1 id="pester">Pester</h1>
 | ||
| <p>Source: <a href="https://github.com/pester/Pester">Pester</a></p>
 | ||
| <p><code>Install-Module -Name Pester -Repository PSGallery -Force -AllowClobber</code><br />
 | ||
| <code>Import-Module Pester</code><br />
 | ||
| <code>$(Get-Module Pester -ListAvailable).Version</code></p>
 | ||
| <p><code>.Tests.ps1</code></p>
 | ||
| <div class="sourceCode" id="cb231"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb231-1"><a href="#cb231-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Add-Numbers <span class="op">{</span></span>
 | ||
| <span id="cb231-2"><a href="#cb231-2" aria-hidden="true" tabindex="-1"></a>    <span class="kw">param</span> <span class="op">(</span></span>
 | ||
| <span id="cb231-3"><a href="#cb231-3" aria-hidden="true" tabindex="-1"></a>        <span class="op">[</span><span class="dt">int</span><span class="op">]</span><span class="va">$a</span><span class="op">,</span></span>
 | ||
| <span id="cb231-4"><a href="#cb231-4" aria-hidden="true" tabindex="-1"></a>        <span class="op">[</span><span class="dt">int</span><span class="op">]</span><span class="va">$b</span></span>
 | ||
| <span id="cb231-5"><a href="#cb231-5" aria-hidden="true" tabindex="-1"></a>    <span class="op">)</span></span>
 | ||
| <span id="cb231-6"><a href="#cb231-6" aria-hidden="true" tabindex="-1"></a>    <span class="va">$a</span> <span class="op">+</span> <span class="va">$b</span></span>
 | ||
| <span id="cb231-7"><a href="#cb231-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb231-8"><a href="#cb231-8" aria-hidden="true" tabindex="-1"></a>Describe <span class="st">"Add-Numbers"</span> <span class="op">{</span></span>
 | ||
| <span id="cb231-9"><a href="#cb231-9" aria-hidden="true" tabindex="-1"></a>    Context <span class="st">"При сложении двух чисел"</span> <span class="op">{</span></span>
 | ||
| <span id="cb231-10"><a href="#cb231-10" aria-hidden="true" tabindex="-1"></a>        It <span class="st">"Должна вернуться правильная сумма"</span> <span class="op">{</span></span>
 | ||
| <span id="cb231-11"><a href="#cb231-11" aria-hidden="true" tabindex="-1"></a>            <span class="va">$result</span> <span class="op">=</span> Add-Numbers <span class="op">-</span>a <span class="dv">3</span> <span class="op">-</span>b <span class="dv">4</span></span>
 | ||
| <span id="cb231-12"><a href="#cb231-12" aria-hidden="true" tabindex="-1"></a>            <span class="va">$result</span> <span class="op">|</span> Should <span class="op">-</span>Be <span class="dv">7</span></span>
 | ||
| <span id="cb231-13"><a href="#cb231-13" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb231-14"><a href="#cb231-14" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb231-15"><a href="#cb231-15" aria-hidden="true" tabindex="-1"></a>    Context <span class="st">"При сложении двух чисел"</span> <span class="op">{</span></span>
 | ||
| <span id="cb231-16"><a href="#cb231-16" aria-hidden="true" tabindex="-1"></a>        It <span class="st">"Должна вернуться ошибка (5+0 -ne 4)"</span> <span class="op">{</span></span>
 | ||
| <span id="cb231-17"><a href="#cb231-17" aria-hidden="true" tabindex="-1"></a>            <span class="va">$result</span> <span class="op">=</span> Add-Numbers <span class="op">-</span>a <span class="dv">5</span> <span class="op">-</span>b <span class="dv">0</span></span>
 | ||
| <span id="cb231-18"><a href="#cb231-18" aria-hidden="true" tabindex="-1"></a>            <span class="va">$result</span> <span class="op">|</span> Should <span class="op">-</span>Be <span class="dv">4</span></span>
 | ||
| <span id="cb231-19"><a href="#cb231-19" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb231-20"><a href="#cb231-20" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb231-21"><a href="#cb231-21" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb231-22"><a href="#cb231-22" aria-hidden="true" tabindex="-1"></a></span>
 | ||
| <span id="cb231-23"><a href="#cb231-23" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-RunningProcess <span class="op">{</span></span>
 | ||
| <span id="cb231-24"><a href="#cb231-24" aria-hidden="true" tabindex="-1"></a>    <span class="cf">return</span> <span class="fu">Get-Process</span> <span class="op">|</span> <span class="fu">Select-Object</span> <span class="op">-</span>ExpandProperty Name</span>
 | ||
| <span id="cb231-25"><a href="#cb231-25" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
 | ||
| <span id="cb231-26"><a href="#cb231-26" aria-hidden="true" tabindex="-1"></a>Describe <span class="st">"Get-RunningProcess"</span> <span class="op">{</span></span>
 | ||
| <span id="cb231-27"><a href="#cb231-27" aria-hidden="true" tabindex="-1"></a>    Context <span class="st">"При наличии запущенных процессов"</span> <span class="op">{</span></span>
 | ||
| <span id="cb231-28"><a href="#cb231-28" aria-hidden="true" tabindex="-1"></a>        It <span class="st">"Должен возвращать список имен процессов"</span> <span class="op">{</span></span>
 | ||
| <span id="cb231-29"><a href="#cb231-29" aria-hidden="true" tabindex="-1"></a>            <span class="va">$result</span> <span class="op">=</span> Get-RunningProcess</span>
 | ||
| <span id="cb231-30"><a href="#cb231-30" aria-hidden="true" tabindex="-1"></a>            <span class="va">$result</span> <span class="op">|</span> Should <span class="op">-</span>Contain <span class="st">"svchost"</span></span>
 | ||
| <span id="cb231-31"><a href="#cb231-31" aria-hidden="true" tabindex="-1"></a>            <span class="va">$result</span> <span class="op">|</span> Should <span class="op">-</span>Contain <span class="st">"explorer"</span></span>
 | ||
| <span id="cb231-32"><a href="#cb231-32" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb231-33"><a href="#cb231-33" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb231-34"><a href="#cb231-34" aria-hidden="true" tabindex="-1"></a>    Context <span class="st">"Когда нет запущенных процессов"</span> <span class="op">{</span></span>
 | ||
| <span id="cb231-35"><a href="#cb231-35" aria-hidden="true" tabindex="-1"></a>        It <span class="st">"Должен возвращать пустой список"</span> <span class="op">{</span></span>
 | ||
| <span id="cb231-36"><a href="#cb231-36" aria-hidden="true" tabindex="-1"></a>            <span class="co"># Замокать функцию Get-Process, чтобы она всегда возвращала пустой список процессов</span></span>
 | ||
| <span id="cb231-37"><a href="#cb231-37" aria-hidden="true" tabindex="-1"></a>            Mock <span class="fu">Get-Process</span> <span class="op">{</span> <span class="cf">return</span> <span class="op">@()</span> <span class="op">}</span></span>
 | ||
| <span id="cb231-38"><a href="#cb231-38" aria-hidden="true" tabindex="-1"></a>            <span class="va">$result</span> <span class="op">=</span> Get-RunningProcess</span>
 | ||
| <span id="cb231-39"><a href="#cb231-39" aria-hidden="true" tabindex="-1"></a>            <span class="va">$result</span> <span class="op">|</span> Should <span class="op">-</span>BeEmpty</span>
 | ||
| <span id="cb231-40"><a href="#cb231-40" aria-hidden="true" tabindex="-1"></a>        <span class="op">}</span></span>
 | ||
| <span id="cb231-41"><a href="#cb231-41" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
 | ||
| <span id="cb231-42"><a href="#cb231-42" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
 | ||
| <h1 id="ffmpeg">FFmpeg</h1>
 | ||
| <div class="sourceCode" id="cb232"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb232-1"><a href="#cb232-1" aria-hidden="true" tabindex="-1"></a><span class="va">$release_latest</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="st">"https://api.github.com/repos/BtbN/FFmpeg-Builds/releases/latest"</span></span>
 | ||
| <span id="cb232-2"><a href="#cb232-2" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="op">$(</span><span class="va">$release_latest</span><span class="op">.</span><span class="fu">assets</span> <span class="op">|</span> <span class="fu">Where-Object</span> name <span class="op">-match</span> <span class="st">"ffmpeg-master-latest-win64-gpl.zip"</span><span class="op">).</span><span class="fu">browser_download_url</span></span>
 | ||
| <span id="cb232-3"><a href="#cb232-3" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-RestMethod</span> <span class="va">$url</span> <span class="op">-</span>OutFile <span class="va">$home</span>\Downloads\ffmpeg-master-latest-win64-gpl<span class="op">.</span><span class="fu">zip</span></span>
 | ||
| <span id="cb232-4"><a href="#cb232-4" aria-hidden="true" tabindex="-1"></a>Expand-Archive <span class="op">-</span>Path <span class="st">"</span><span class="va">$home</span><span class="st">\Downloads\ffmpeg-master-latest-win64-gpl.zip"</span> <span class="op">-</span>DestinationPath <span class="st">"</span><span class="va">$home</span><span class="st">\Downloads\"</span></span>
 | ||
| <span id="cb232-5"><a href="#cb232-5" aria-hidden="true" tabindex="-1"></a><span class="fu">Copy-Item</span> <span class="op">-</span>Path <span class="st">"</span><span class="va">$home</span><span class="st">\Downloads\ffmpeg-master-latest-win64-gpl\bin\ffmpeg.exe"</span> <span class="op">-</span>Destination <span class="st">"C:\Windows\System32\ffmpeg.exe"</span></span>
 | ||
| <span id="cb232-6"><a href="#cb232-6" aria-hidden="true" tabindex="-1"></a><span class="fu">Remove-Item</span> <span class="st">"</span><span class="va">$home</span><span class="st">\Downloads\ffmpeg-*"</span> <span class="op">-</span>Force <span class="op">-</span>Recurse</span></code></pre></div>
 | ||
| <p><code>ffmpeg -i input.mp4 output.gif</code> конвертировать mp4 в
 | ||
| gif<br />
 | ||
| <code>ffmpeg -i input.mp4 -filter_complex "scale=1440:-1:flags=lanczos" output.gif</code>
 | ||
| изменить разрешение на выходе<br />
 | ||
| <code>ffmpeg -i input.mp4 -filter_complex "scale=1440:-1:flags=lanczos" -r 10 output.gif</code>
 | ||
| изменить количество кадров в секунду на выходе<br />
 | ||
| <code>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</code>
 | ||
| сжатие за счет цветовой политры<br />
 | ||
| <code>ffmpeg -i input.mp4 -ss 00:00:10 -frames:v 1 -q:v 1 output.jpg</code>
 | ||
| вытащить скриншот из видео на 10 секунде<br />
 | ||
| <code>ffmpeg -i input.mp4 -ss 00:00:05 -to 00:00:10 -c copy output.mp4</code>
 | ||
| вытащить кусок видео<br />
 | ||
| <code>ffmpeg -i "%d.jpeg" -framerate 2 -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4</code>
 | ||
| создать видео из фото (1.jpeg, 2.jpeg и т.д.) с framerate (частотой
 | ||
| кадров) в создаваемом видео 2 кадра в секунду<br />
 | ||
| <code>ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -c:v copy -c:a aac -strict experimental output.mp4</code>
 | ||
| запись без перекодирования (copy) RTSP-потока с камеры видеонаблюдения
 | ||
| (+ аудио в кодеке AAC) в файл<br />
 | ||
| <code>ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -c:v copy -c:a aac -strict experimental -movflags +faststart+frag_keyframe+empty_moov output.mp4</code>
 | ||
| переместить метаданные в начало файла, что позволяет начать
 | ||
| воспроизведение файла в видеоплеере до его полной загрузки<br />
 | ||
| <code>ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -frames:v 1 -c:v mjpeg output.jpg</code>
 | ||
| сделать скриншот</p>
 | ||
| <h1 id="pandoc">Pandoc</h1>
 | ||
| <div class="sourceCode" id="cb233"><pre
 | ||
| class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb233-1"><a href="#cb233-1" aria-hidden="true" tabindex="-1"></a><span class="va">$release_latest</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="st">"https://api.github.com/repos/jgm/pandoc/releases/latest"</span></span>
 | ||
| <span id="cb233-2"><a href="#cb233-2" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="op">$(</span><span class="va">$release_latest</span><span class="op">.</span><span class="fu">assets</span> <span class="op">|</span> <span class="fu">Where-Object</span> name <span class="op">-match</span> <span class="st">"windows-x86_64.zip"</span><span class="op">).</span><span class="fu">browser_download_url</span></span>
 | ||
| <span id="cb233-3"><a href="#cb233-3" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-RestMethod</span> <span class="va">$url</span> <span class="op">-</span>OutFile <span class="va">$home</span>\Downloads\pandoc<span class="op">.</span><span class="fu">zip</span></span>
 | ||
| <span id="cb233-4"><a href="#cb233-4" aria-hidden="true" tabindex="-1"></a>Expand-Archive <span class="op">-</span>Path <span class="st">"</span><span class="va">$home</span><span class="st">\Downloads\pandoc.zip"</span> <span class="op">-</span>DestinationPath <span class="st">"</span><span class="va">$home</span><span class="st">\Downloads\"</span></span>
 | ||
| <span id="cb233-5"><a href="#cb233-5" aria-hidden="true" tabindex="-1"></a><span class="va">$path</span> <span class="op">=</span> <span class="op">$(</span><span class="fu">Get-ChildItem</span> <span class="st">"</span><span class="va">$home</span><span class="st">\Downloads\pandoc-*\*.exe"</span><span class="op">).</span><span class="fu">FullName</span></span>
 | ||
| <span id="cb233-6"><a href="#cb233-6" aria-hidden="true" tabindex="-1"></a><span class="fu">Copy-Item</span> <span class="op">-</span>Path <span class="va">$path</span> <span class="op">-</span>Destination <span class="st">"C:\Windows\System32\pandoc.exe"</span></span>
 | ||
| <span id="cb233-7"><a href="#cb233-7" aria-hidden="true" tabindex="-1"></a><span class="fu">Remove-Item</span> <span class="st">"</span><span class="va">$home</span><span class="st">\Downloads\pandoc*"</span> <span class="op">-</span>Force <span class="op">-</span>Recurse</span></code></pre></div>
 | ||
| <p><code>pandoc -s README.md -o PS-Commands.html</code> конвертировать
 | ||
| из Markdown в HTML<br />
 | ||
| <code>pandoc -s PS-Commands.html -o README.md</code> конвертировать из
 | ||
| HTML в Markdown</p>
 | ||
| </body>
 | ||
| </html>
 |