diff --git a/README.md b/README.md index 7dada1a..3c3ddba 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,11 @@ - [Object](#Object) - [Regex](#Regex) -- [Items](#Items) +- [Files](#Files) - [Credential](#Credential) -- [Event](#Event) +- [WinEvent](#WinEvent) - [Firewall](#Firewall) +- [Defender](#Defender) - [Performance](#Performance) - [Regedit](#Regedit) - [Scheduled](#Scheduled) @@ -15,8 +16,8 @@ - [WMI](#WMI) - [ActiveDirectory](#ActiveDirectory) - [ServerManager](#ServerManager) -- [DNS](#DNS) -- [DHCP](#DHCP) +- [DNS](#DNSServer) +- [DHCP](#DHCPServer) - [DFS](#DFS) - [PackageManagement](#PackageManagement) - [Jobs](#Jobs) @@ -37,6 +38,7 @@ - [SQLite](#SQLite) - [MySQL](#MySQL) - [MSSQL](#MSSQL) +- [SNMP](#SNMP) - [DSC](#DSC) - [Ansible](#Ansible) @@ -220,19 +222,19 @@ ps | Sort-Object -Descending CPU | select -first 10 ProcessName, # сортир # NPP -`pwsh -NoExit -ExecutionPolicy Unrestricted -File "$(FULL_CURRENT_PATH)"` +`pwsh -NoExit -ExecutionPolicy Unrestricted -WindowStyle Maximized -File "$(FULL_CURRENT_PATH)"` ``` -. # Точка. Обозначает любой символ +. # Обозначает любой символ \ # Экранирующий символ. Символы которые экранируются: ^, [, ., $, {, *, (, ), \, +, |, ?, <, > -^ # Крышка. Начало строки +^ # Начало строки $ # Конец строки +\n # Новая строка \d # Любая цифра \D # Не цифра -\s # Пробел, табуляция, перенос строки -\S # Не пробел \w # Любая буква латиницы, цифра, или знак подчёркивания \W # Не латиница, не цифра, не подчёркивание -| # Или. Соединяет несколько вариантов +\s # Пробел, табуляция, перенос строки +\S # Не пробел \b # Граница слова. Применяется когда нужно выделить, что искомые символы являются словом, а не частью другого слова \B # Не граница слова \< # Начало слова @@ -242,11 +244,14 @@ $ # Конец строки * # Повторитель. Означает что предшествующий символ может работать 0 и более раз + # Количество предшествующего не менее 1-го. ? # Ограничитель. Не более одного раза -[ ] # В квадратных скобках задаются символы к поиску, например [a-яА-Я], или [0-9] -[^ ] # Исключает из поиска символы указанные в квадратных скобках +| # Или. Соединяет несколько вариантов () # В круглые скобки заключаются все комбинации с "или" и поиск начала и конца строк -{ } # В фигурных скобках указывается точное количество вхождений, например если надо две цифры, то \d{2}, если две или четыре, то \d{2,4}, если четыре и более, то {4,} -\n # Новая строка +[ ] # В квадратных скобках задаются символы к поиску, например [a-яА-Я], или [0-9] +[^ ] # Исключает из поиска символы указанные в квадратных скобках +{ } # В фигурных скобках указывается точное количество вхождений +\d{2} # Найти две цифры +\d{2,4} # Найти две или четыре +{4,} # Найти четыре и более ``` # Regex @@ -429,8 +434,15 @@ finally {$out = "End"} # выполняется в конце в любом сл `$LASTEXITCODE` результат выполнения последней команды (0 - успех) \ `exit 1` код завершения, который возвращается $LASTEXITCODE -# Items +# Files +`$file = [System.IO.File]::Create("$home\desktop\test.txt")` создать файл \ +`$file.Close()` закрыть файл \ +`[System.IO.File]::ReadAllLines("$home\desktop\test.txt")` прочитать файл \ +`$file = New-Object System.IO.StreamReader("$home\desktop\test.txt")` \ +`$file.ReadToEnd()` + +`Get-Content $home/desktop\test.txt -Wait` аналог tail \ `Test-Path $path` проверить доступность пути \ `Get-ChildItem $path -Filter *.txt -Recurse` # отобразить содержимое каталога (Alias: ls/gci/dir) и дочерних каталогов (-Recurse) и отфильтровать вывод \ `Get-Location` отобразить текущие месторасположение (Alias: pwd/gl) \ @@ -511,44 +523,73 @@ finally {$out = "End"} # выполняется в конце в любом сл `$Cred.Password | ConvertFrom-SecureString -Key (Get-Content "C:\password.key") | Set-Content "C:\password.txt"` сохранить пароль в файл используя внешний ключ \ `$pass = Get-Content "C:\password.txt" | ConvertTo-SecureString -Key (Get-Content "\\Server\Share\password.key")` расшифровать пароль на втором компьютере -# Event +# WinEvent -### EventLog -`Get-EventLog -List` отобразить все корневые журналы логов и их размер \ -`Clear-EventLog Application` очистить логи указанного журнала \ -`Get-EventLog -LogName Security -InstanceId 4624` найти логи по ID в журнале Security +`Get-WinEvent -ListLog *` отобразить все доступные журналы логов \ +`Get-WinEvent -ListLog * | where RecordCount -ne 0 | where RecordCount -ne $null | sort -Descending RecordCount` отобразить не пустые журналы с сортировкой по кол-ву записей \ +`Get-WinEvent -ListProvider * | ft` отобразить всех провайдеров приложений \ +`Get-WinEvent -ListProvider GroupPolicy` найти в какой журнал LogLinks {Application} пишутся логи приложения \ +`Get-WinEvent -ListProvider *smb*` \ +`Get-WinEvent -ListLog * | where logname -match SMB | sort -Descending RecordCount` найти все журналы по имени \ +`Get-WinEvent -LogName "Microsoft-Windows-SmbClient/Connectivity"` \ +`Get-WinEvent -ListProvider *firewall*` + +### Filter XPath/Hashtable + +`Get-WinEvent -FilterHashtable @{LogName="Security";ID=4624}` найти логи по ID в журнале Security \ +`Get-WinEvent -FilterHashtable @{LogName="System";Level=2}` найти все записи ошибки (1 - критический, 3 - предупреждение, 4 - сведения) \ +`Get-WinEvent -FilterHashtable @{LogName="System";Level=2;ProviderName="Service Control Manager"}` отфильтровать по имени провайдера + +`([xml](Get-WinEvent -FilterHashtable @{LogName="Security";ID=4688} -MaxEvents 1).ToXml()).Event.EventData.Data` отобразить все свойства, хранимые в EventData (Message) \ +`Get-WinEvent -FilterHashtable @{logname="security";ID=4688} -MaxEvents 1 | select timecreated,{$_.Properties[5].value}` отфильтровать время события и имя запущенного процесса ``` -function Get-Log { -Param( -[Parameter(Mandatory = $true, ValueFromPipeline = $true)][int]$Count, -$Hour -) -if ($Hour -ne $null) { -Get-EventLog -LogName Application -Newest $Count | ? TimeWritten -ge (Get-Date).AddHours($Hour) -} else { -Get-EventLog -LogName Application -Newest $Count -} -} -10 | Get-Log -Get-Log 100 -2 +$query = ' + + + + + +' + +Get-WinEvent -LogName Security -FilterXPath $query ``` -### WinEvent -`Get-WinEvent -ListLog * | where logname -match SMB | sort -Descending RecordCount` отобразить все доступные журналы логов \ -`Get-WinEvent -LogName "Microsoft-Windows-SmbClient/Connectivity" | where` \ -`Get-WinEvent -LogName Security -MaxEvents 100` отобразить последние 100 событий \ -`Get-WinEvent -FilterHashtable @{LogName="Security";ID=4624}` найти логи по ID в журнале Security +### Reboot ``` -$obj = @() -$fw = Get-WinEvent "Microsoft-Windows-Windows Firewall With Advanced Security/Firewall" -foreach ($temp_fw in $fw) { -if ($temp_fw.id -eq 2004) {$type = "Added Rule"} elseif ($id -eq 2006) {$type = "Deleted Rule"} -$port = $temp_fw.Properties[7] | select -ExpandProperty value -$name = $temp_fw.Properties[1] | select -ExpandProperty value -$obj += [PSCustomObject]@{Time = $temp_fw.TimeCreated; Type = $type; Port = $port; Name = $name} -} -$obj +$query = ' + + + + + +' +Get-WinEvent -LogName System -FilterXPath $query + +41 # Система была перезагружена без корректного завершения работы. +1074 # Система была корректного выключена пользователем или процессом. +1076 # Следует за Event ID 6008 и означает, что первый пользователь (с правом выключения системы) подключившийся к серверу после неожиданной перезагрузки или выключения, указал причину этого события. +6005 # Запуск "Журнала событий Windows" (Event Log). Указывает на включение системы. +6006 # Остановка «Журнала событий Windows». Указывает на выключение системы. +6008 # Предыдущее выключение системы было неожиданным. +6009 # Версия операционной системы, зафиксированная при загрузке системы. +6013 # Время работы системы (system uptime) в секундах. ``` -### XPath +### Logon ``` $srv = "localhost" $FilterXPath = '' @@ -564,8 +605,24 @@ New-Object PSObject -Property @{ }} $EventData | ft ``` -# Firewall +### EventLog +`Get-EventLog -List` отобразить все корневые журналы логов и их размер \ +`Clear-EventLog Application` очистить логи указанного журнала \ +`Get-EventLog -LogName Security -InstanceId 4624` найти логи по ID в журнале Security + +# Firewall +``` +$obj = @() +$fw = Get-WinEvent "Microsoft-Windows-Windows Firewall With Advanced Security/Firewall" +foreach ($temp_fw in $fw) { +if ($temp_fw.id -eq 2004) {$type = "Added Rule"} elseif ($id -eq 2006) {$type = "Deleted Rule"} +$port = $temp_fw.Properties[7] | select -ExpandProperty value +$name = $temp_fw.Properties[1] | select -ExpandProperty value +$obj += [PSCustomObject]@{Time = $temp_fw.TimeCreated; Type = $type; Port = $port; Name = $name} +} +$obj +``` `New-NetFirewallRule -Profile Any -DisplayName "Open Port 135 RPC" -Direction Inbound -Protocol TCP -LocalPort 135` открыть in-порт \ `Get-NetFirewallRule | Where-Object {$_.DisplayName -match "135"}` найти правило по имени \ `Get-NetFirewallPortFilter | where LocalPort -like 80` найти действующие правило по номеру порта @@ -578,10 +635,53 @@ $EventData | ft `Enabled,Profile` ### Firewall-Manager + `Install-Module Firewall-Manager` \ `Export-FirewallRules -Name * -CSVFile $home\documents\fw.csv` -Inbound -Outbound -Enabled -Disabled -Allow -Block (фильтр правил для экспорта) \ `Import-FirewallRules -CSVFile $home\documents\fw.csv` +# Defender + +`Import-Module Defender` \ +`Get-Command -Module Defender` \ +`Get-MpComputerStatus` \ +`(Get-MpComputerStatus).AntivirusEnabled` статус работы антивируса + +`$session = NewCimSession -ComputerName hostname` подключиться к удаленному компьютеру, используется WinRM \ +`Get-MpComputerStatus -CimSession $session | fl fullscan*` узнать дату последнего сканирования на удаленном компьютере + +`Get-MpPreference` настройки \ +`(Get-MpPreference).ScanPurgeItemsAfterDelay` время хранения записей журнала защитника в днях \ +`Set-MpPreference -ScanPurgeItemsAfterDelay 30` изменить время хранения \ +`ls "C:\ProgramData\Microsoft\Windows Defender\Scans\History"` \ +`Get-MpPreference | select disable*` отобразить статус всех видов проверок/сканирований \ +`Set-MpPreference -DisableRealtimeMonitoring $true` отключить защиту Defender в реальном времени (использовать только ручное сканирование) \ +`Set-MpPreference -DisableRemovableDriveScanning $false` включить сканирование USB накопителей \ +`Get-MpPreference | select excl*` отобразить список всех исключений \ +`Add-MpPreference -ExclusionPath C:\install` добавить директорию в исключение \ +`Remove-MpPreference -ExclusionPath C:\install` удалить из исключения \ +`New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name DisableAntiSpyware -Value 1 -PropertyType DWORD -Force` полностью отключить Windows Defender + +`Set-MpPreference -SignatureDefinitionUpdateFileSharesSources \\FileShare1\Updates` для обновления из сетевой папки нужно предварительно скачать файлы с сигнатурами баз с сайта https://www.microsoft.com/security/portal/definitions/adl.aspx и поместить в сетевой каталог +`Update-MpSignature -UpdateSource FileShares` изменить источник обновлений (MicrosoftUpdateServer – сервера обновлений MS в интернете, InternalDefinitionUpdateServer — внутренний WSUS сервер) \ +`Update-MpSignature` обновить сигнатуры + +`Start-MpScan -ScanType QuickScan` быстрая проверка или FullScan \ +`Start-MpScan -ScanType FullScan -AsJob` \ +`Set-MpPreference -RemediationScheduleDay 1-7` выбрать дни, начиная с воскресенья или 0 каждый день, 8 - сбросить \ +`Set-MpPreference -ScanScheduleQuickScanTime 14:00:00` \ +`Start-MpScan -ScanType CustomScan -ScanPath "C:\Program Files"` сканировать выбранную директорию + +`Get-MpThreat` история угроз и тип угрозы (ThreatName: HackTool/Trojan) \ +`Get-MpThreatCatalog` список известных видов угроз \ +`Get-MpThreatDetection` история защиты (активных и прошлые) и ID угрозы \ +`Get-MpThreat -ThreatID 2147760253` + +`ls "C:\ProgramData\Microsoft\Windows Defender\Quarantine\"` директория хранения файлов в карантине \ +`cd "C:\Program Files\Windows Defender\"` \ +`.\MpCmdRun.exe -restore -name $ThreatName` восстановить файл из карантина \ +`.\MpCmdRun.exe -restore -filepath $path_file` + # Performance `(Get-Counter -ListSet *).CounterSetName` вывести список всех доступных счетчиков производительности в системе \ @@ -691,6 +791,10 @@ $ping = New-Object System.Net.Networkinformation.Ping `Get-DNSClientServerAddress` \ `Set-DNSClientServerAddress -InterfaceIndex 14 -ServerAddresses 8.8.8.8` +### DNSCache +`Get-DnsClientCache` отобразить кэшированные записи клиента DNS \ +`Clear-DnsClientCache` очистить кэш + ### Binding `Get-NetAdapterBinding -Name Ethernet -IncludeHidden -AllBindings` \ `Get-NetAdapterBinding -Name "Беспроводная сеть" -DisplayName "IP версии 6 (TCP/IPv6)" | Set-NetAdapterBinding -Enabled $false` отключить IPv6 на адаптере @@ -1263,7 +1367,14 @@ Invoke-Expression $WBadmin_cmd `(Get-RDSessionCollectionConfiguration -ConnectionBroker $broker -CollectionName C03 | select *).CustomRdpProperty` use redirection server name:i:1 \ `Get-RDConnectionBrokerHighAvailability` -# DNS +# DNSServer + +`Get-Command -Module DnsServer` \ +`Show-DnsServerCache` отобразить весь кэш DNS-сервера \ +`Show-DnsServerCache | where HostName -match ru` \ +`Clear-DnsServerCache` \ +`Get-DnsServerCache` \ +`Get-DnsServerDiagnostics` ``` $zone = icm $srv {Get-DnsServerZone} | select ZoneName,ZoneType,DynamicUpdate,ReplicationScope,SecureSecondaries, DirectoryPartitionName | Out-GridView -Title "DNS Server: $srv" –PassThru @@ -1296,7 +1407,9 @@ $TextA = "$FQDN IN A $IP" [Void]$DNSRR.CreateInstanceFromTextRepresentation($DNSServer,$DNSFZone,$TextA) } ``` -# DHCP +# DHCPServer + +`Get-Command -Module DhcpServer` ``` $mac = icm $srv -ScriptBlock {Get-DhcpServerv4Scope | Get-DhcpServerv4Lease} | select AddressState, HostName,IPAddress,ClientId,DnsRegistration,DnsRR,ScopeId,ServerIP | Out-GridView -Title "HDCP Server: $srv" –PassThru @@ -3475,26 +3588,120 @@ MODIFY FILE (NAME = temp2, FILENAME = 'F:\tempdb_mssql_2.ndf' , SIZE = 1048576KB - Проверка целостности базы данных -DBCC CHECKDB +`DBCC CHECKDB` - Индексы. Индексы используются для быстрого поиска данных без необходимости поиска/просмотра всех строк в таблице базы данных при каждом обращении к таблице базы данных. Индекс ускоряет процесс запроса, предоставляя быстрый доступ к строкам данных в таблице, аналогично тому, как указатель в книге помогает вам быстро найти необходимую информацию. Индексы предоставляют путь для быстрого поиска данных на основе значений в этих столбцах. Для каждого индекса обязательно хранится его статистика. MS SQL Server самостоятельно создает и изменяет индексы при работе с базой. С течением времени данные в индексе становятся фрагментированными, т.е. разбросанными по базе данных, что серьезно снижает производительность запросов. Если фрагментация составляет от 5 до 30% (стандартно в задании 15%), то рекомендуется ее устранить с помощью реорганизации, при фрагментации выше 30% (по умолчанию в задаче > 30% фрагментации и число страниц > 1000) необходимо полное перестроение индексов. После перестроения планово используется только реорганизация. - Реорганизация (Reorganize) или дефрагментация индекса — это серия небольших локальных перемещений страниц так, чтобы индекс не был фрагментирован. После реорганизации статистика не обновляется. Во время выполнения почти все данные доступны, пользователи смогут работать. -sp_msforeachtable N'DBCC INDEXDEFRAG (<имя базы данных>, ''?'')' +`sp_msforeachtable N'DBCC INDEXDEFRAG (<имя базы данных>, ''?'')'` - Перестроение (Rebuild) индексов (или задача в мастере планов обслуживания: Восстановить индекс) запускает процесс полного построения индексов. В версии MS SQL Server Standard происходит отключение всех клиентов от базы на время выполнения операции. После перестроения обязательно обновляется статистика. -sp_msforeachtable N'DBCC DBREINDEX (''?'')' +`sp_msforeachtable N'DBCC DBREINDEX (''?'')'` - Обновление статистики. Статистика — небольшая таблица (обычно до 200 строк), в которой хранится обобщенная информация о том, какие значения и как часто встречаются в таблице. На основании статистики сервер принимает решение, как лучше построить запрос. Когда происходят запросы к БД (например, SELECT) вы получаете данные, но не описываете то, как эти данные должны быть извлечены. В получении и обработке данных помогает статистика. Во время выполнения процедуры обновления статистики данные не блокируются. -exec sp_msforeachtable N'UPDATE STATISTICS ? WITH FULLSCAN' +`exec sp_msforeachtable N'UPDATE STATISTICS ? WITH FULLSCAN'` - Очистка процедурного кэша, выполняется после обновления статистики. Оптимизатор MS SQL Server кэширует планы запросов для их повторного выполнения. Это делается для того, чтобы экономить время, затрачиваемое на компиляцию запроса в том случае, если такой же запрос уже выполнялся и его план известен. После обновия статистики, не будет очищен процедурный кэш, то SQL Server может выбрать старый (неоптимальный) план запроса из кэша вместо того, чтобы построить новый (более оптимальный) план. -DBCC FREEPROCCACHE +`DBCC FREEPROCCACHE` +# SNMP + +### Setup SNMP Service + +`Install-WindowsFeature SNMP-Service,SNMP-WMI-Provider -IncludeManagementTools` установить роль SNMP и WMI провайдер через Server Manager \ +`Get-WindowsFeature SNMP*` \ +`Add-WindowsCapability -Online -Name SNMP.Client~~~~0.0.1.0 # установить компонент Feature On Demand для Windows 10/11` \ +`Get-Service SNMP*` \ +`Get-NetFirewallrule -DisplayName *snmp* | ft` \ +`Get-NetFirewallrule -DisplayName *snmp* | Enable-NetFirewallRule` + +### Setting SNMP Service via Regedit + +Agent: \ +`New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\RFC1156Agent" -Name "sysContact" -Value "lifailon-user"` создать (New) или изменить (Set) \ +`New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\RFC1156Agent" -Name "sysLocation" -Value "plex-server"` + +Security: \ +`New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\public"` создать новый community string \ +`New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\ValidCommunities" -Name "public" -Value 16` назначить права на public \ +`1 — NONE` \ +`2 — NOTIFY` позволяет получать SNMP ловушки \ +`4 — READ ONLY` позволяет получать данные с устройства \ +`8 — READ WRITE` позволяет получать данные и изменять конфигурацию устройства \ +`16 — READ CREATE` позволяет читать данные, изменять и создавать объекты \ +`New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\PermittedManagers" -Name "1" -Value "192.168.3.99"` от кого разрешено принимать запросы \ +`Get-Service SNMP | Restart-Service` + +### snmpwalk +`snmpwalk -v 2c -c public 192.168.3.100` +`snmpwalk -v 2c -c public -O e 192.168.3.100` + +### Modules + +`Install-Module -Name SNMP` \ +`Get-SnmpData -IP 192.168.3.100 -OID 1.3.6.1.2.1.1.4.0 -UDPport 161 -Community public` \ +`(Get-SnmpData -IP 192.168.3.100 -OID 1.3.6.1.2.1.1.4.0).Data` \ +`Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.1` пройтись по дереву OID \ +`Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.25.6.3.1.2` список установленного ПО \ +`Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.25.2.3.1` список разделов и памяти (C: D: Virtual Memory и Physical Memory) \ +`Set-SnmpData` изменение данных на удаленном устройстве + +`Install-Module -Name SNMPv3 \ +`Invoke-SNMPv3Get` получение данных по одному OID \ +`Invoke-SNMPv3Set` изменение данных \ +`Invoke-SNMPv3Walk` обход по дереву OID \ +`Invoke-SNMPv3Walk -UserName lifailon -Target 192.168.3.100 -AuthSecret password -PrivSecret password -OID 1.3.6.1.2.1.1 -AuthType MD5 -PrivType AES128` + +### Lextm.SharpSnmpLib + +https://api.nuget.org/v3-flatcontainer/lextm.sharpsnmplib/12.5.2/lextm.sharpsnmplib.12.5.2.nupkg \ +`Add-Type -LiteralPath "$home\Desktop\lextm.sharpsnmplib-12.5.2\net471\SharpSnmpLib.dll"` +``` +$port = 161 +$OID = "1.3.6.1.2.1.1.4.0" +$variableList = New-Object Collections.Generic.List[Lextm.SharpSnmpLib.Variable] +$variableList.Add([Lextm.SharpSnmpLib.Variable]::new([Lextm.SharpSnmpLib.ObjectIdentifier]::new($OID))) +$timeout = 3000 +[Net.IPAddress]$ip = "192.168.3.100" +$endpoint = New-Object Net.IpEndPoint $ip, $port +$Community = "public" +[Lextm.SharpSnmpLib.VersionCode]$Version = "V2" + +$message = [Lextm.SharpSnmpLib.Messaging.Messenger]::Get( +$Version, +$endpoint, +$Community, +$variableList, +$TimeOut +) +$message.Data.ToString() +``` +### Walk +``` +[Lextm.SharpSnmpLib.ObjectIdentifier]$OID = "1.3.6.1.2.1.1" # дерево или конечный OID +$WalkMode = [Lextm.SharpSnmpLib.Messaging.WalkMode]::WithinSubtree # режим обхода по дереву +$results = New-Object Collections.Generic.List[Lextm.SharpSnmpLib.Variable] +$message = [Lextm.SharpSnmpLib.Messaging.Messenger]::Walk( + $Version, + $endpoint, + $Community, + $OID, + $results, + $TimeOut, + $WalkMode +) +$results + +$results2 = @() +foreach ($d in $results) { +$results2 +=[PSCustomObject]@{'ID'=$d.id.ToString();'Data'=$d.Data.ToString()} # перекодировать вывод построчно в строку +} +$results2 +``` # DSC `Import-Module PSDesiredStateConfiguration` \ @@ -3507,33 +3714,45 @@ DBCC FREEPROCCACHE `Ensure = Present` настройка должна быть включена (каталог должен присутствовать, процесс должен быть запущен, если нет – создать, запустить) \ `Ensure = Absent` настройка должна быть выключена (каталога быть не должно, процесс не должен быть запущен, если нет – удалить, остановить) ``` -Configuration DSConfigurationProxy { - Node vproxy-01 { - File CreateDir { +Configuration TestConfiguraion +{ + Ctrl+Space +} + +Configuration DSConfigurationProxy +{ + Node vproxy-01 + { + File CreateDir + { Ensure = "Present" Type = "Directory" DestinationPath = "C:\Temp" } - Service StopW32time { + Service StopW32time + { Name = "w32time" State = "Stopped" # Running } - WindowsProcess RunCalc { + WindowsProcess RunCalc + { Ensure = "Present" Path = "C:\WINDOWS\system32\calc.exe" Arguments = "" } - Registry RegSettings { + Registry RegSettings + { Ensure = "Present" Key = "HKEY_LOCAL_MACHINE\SOFTWARE\MySoft" ValueName = "TestName" ValueData = "TestValue" ValueType = "String" } -# WindowsFeature IIS { +# WindowsFeature IIS +# { # Ensure = "Present" # Name = "Web-Server" -# } +# } } } ``` @@ -3548,6 +3767,7 @@ Configuration DSConfigurationProxy { # Ansible +`apt-get update && apt-get upgrade` \ `apt-get install ansible` `nano /etc/ansible/ansible.cfg` \