ΠΠ΅Π΄Π°Π²Π½ΠΎ Ρ Π½Π°Ρ Π²ΡΡΠ°Π»Π° Π·Π°Π΄Π°ΡΠ° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ°Ρ Ρ Windows. ΠΡ ΠΊΠ°ΠΊ Π²ΡΡΠ°Π»Π°, ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π»ΠΈΡΡ Π² ΡΡΠΊΠ²Ρ, Π² ΡΠΎ ΡΠ°ΠΌΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΡΠΉ Π·Π° ΠΈΡ ΠΏΡΠΎΠ΄Π»Π΅Π½ΠΈΠ΅ Π±ΠΎΡΠΎΠ΄Π°ΡΡΠΉ ΠΊΠΎΠ»Π»Π΅Π³Π° Π½Π°Ρ ΠΎΠ΄ΠΈΠ»ΡΡ Π² ΠΎΡΠΏΡΡΠΊΠ΅. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΌΡ Ρ Π½ΠΈΠΌ ΡΡΠΎ-ΡΠΎ Π·Π°ΠΏΠΎΠ΄ΠΎΠ·ΡΠΈΠ»ΠΈ ΡΠ΅ΡΠΈΠ»ΠΈ Π½Π°Π΄ ΡΡΠΈΠΌ Π·Π°Π΄ΡΠΌΠ°ΡΡΡΡ. Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ Π½Π°Ρ Π½Π΅ ΡΠΏΠ΅ΡΠ° Π²Π½Π΅Π΄ΡΡΠ΅ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° NetXMS, ΠΎΠ½Π° ΠΈ ΡΡΠ°Π»Π° Π³Π»Π°Π²Π½ΡΠΌ ΠΈ, Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅, Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΎΠΌ Π½Π° ΡΡΡ Π·Π°Π΄Π°ΡΡ.
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π² ΠΈΡΠΎΠ³Π΅ Π±ΡΠ» ΠΏΠΎΠ»ΡΡΠ΅Π½ Π² ΡΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅:
Π ΡΠ°ΠΌ ΠΏΡΠΎΡΠ΅ΡΡ Π΄Π°Π»Π΅Π΅.
ΠΠΎΠ΅Ρ
Π°Π»ΠΈ. ΠΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΡΠ΅ΡΡΠΈΠΊΠ° Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡΠ΅Π³ΠΎΡΡ ΡΡΠΎΠΊΠ° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² Π² NetXMS Π½Π΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ²ΠΎΠΉ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΊΡΠΈΠΏΡΡ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π΅Π³ΠΎ Π΄Π°Π½Π½ΡΠΌΠΈ. ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Π½Π° Powershell, ΡΡΠΎ ΠΆΠ΅ Windows. Π‘ΠΊΡΠΈΠΏΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π²ΡΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅, Π²Π·ΡΡΡ ΠΎΡΡΡΠ΄Π° ΡΡΠΎΠΊ ΠΈΡ
ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ Π² Π΄Π½ΡΡ
ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΡΠΎ ΡΠΈΡΠ»ΠΎ Π² NetXMS. Π§Π΅ΡΠ΅Π· Π΅Π³ΠΎ Π°Π³Π΅Π½ΡΠ°. ΠΠΎΡ Ρ Π½Π΅Π³ΠΎ ΠΈ Π½Π°ΡΠ½Π΅ΠΌ.
ΠΠ°ΡΠΈΠ°Π½Ρ ΠΏΠ΅ΡΠ²ΡΠΉ, ΡΠ°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ. ΠΡΠΎΡΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π½Π΅ΠΉ Π΄ΠΎ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° Ρ Π±Π»ΠΈΠΆΠ°ΠΉΡΠ΅ΠΉ Π΄Π°ΡΠΎΠΉ.
Π§ΡΠΎΠ±Ρ ΡΠ΅ΡΠ²Π΅Ρ NetXMS ΡΠ·Π½Π°Π» ΠΎ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π°ΡΠ΅Π³ΠΎ ΠΊΠ°ΡΡΠΎΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΅Π³ΠΎ ΠΎΡ Π°Π³Π΅Π½ΡΠ°. ΠΠ½Π°ΡΠ΅ ΡΡΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ, ΠΏΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅ Π΅Π³ΠΎ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ, Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ°ΠΉΠ» Π°Π³Π΅Π½ΡΠ° nxagentd.conf ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΡΡΠΎΠΊΡ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ HTTPS.CertificateExpireDateSimple, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π·Π°ΠΏΡΡΠΊ ΡΠΊΡΠΈΠΏΡΠ°:
ExternalParameter = HTTPS.CertificateExpireDateSimple: powershell.exe -File "servershareNetXMS_CertExpireDateSimple.ps1"
Π£ΡΠΈΡΡΠ²Π°Ρ, ΡΡΠΎ ΡΠΊΡΠΈΠΏΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΏΠΎ ΡΠ΅ΡΠΈ, Π½ΡΠΆΠ½ΠΎ Π½Π΅ Π·Π°Π±ΡΡΡ ΠΏΡΠΎ
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ Π°Π³Π΅Π½ΡΠ° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ:
#
# NetXMS agent configuration file
# Created by agent installer at Thu Jun 13 11:24:43 2019
#
MasterServers = netxms.corp.testcompany.ru
ConfigIncludeDir = C:NetXMSetcnxagentd.conf.d
LogFile = {syslog}
FileStore = C:NetXMSvar
SubAgent = ecs.nsm
SubAgent = filemgr.nsm
SubAgent = ping.nsm
SubAgent = logwatch.nsm
SubAgent = portcheck.nsm
SubAgent = winperf.nsm
SubAgent = wmi.nsm
ExternalParameter = HTTPS.CertificateExpireDateSimple: powershell.exe -File "servershareNetXMS_CertExpireDateSimple.ps1"
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ ΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΡΡ Π°Π³Π΅Π½ΡΠ°. ΠΠΎΠΆΠ½ΠΎ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ NetXMS: ΠΎΡΠΊΡΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ (Edit agentβs confuguration file), ΠΎΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ, Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Save&Apply, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅. ΠΠΎΡΠΎΠΌ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ (Poll > Configuration), Π΅ΡΠ»ΠΈ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅Ρ ΡΠΈΠ» ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°ΡΡ. ΠΠΎΡΠ»Π΅ ΡΡΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΡΠ²ΠΈΡΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½Π°Ρ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ.
Π ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ NetXMS ΠΈΠ΄Π΅ΠΌ Π² Data Collection Configuration ΠΏΠΎΠ΄ΠΎΠΏΡΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΡ ΡΠΎΠ±ΡΠ°Π»ΠΈΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΡΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ ΠΈ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ°ΠΌ Π½ΠΎΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ (Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ, ΠΏΠΎΡΠ»Π΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ, Π΅ΡΡΡ ΡΠΌΡΡΠ» ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ Π΅Π³ΠΎ Π² ΡΠ°Π±Π»ΠΎΠ½Ρ). ΠΡΠ±ΠΈΡΠ°Π΅ΠΌ HTTPS.CertificateExpireDateSimple ΠΈΠ· ΡΠΏΠΈΡΠΊΠ°, Π²ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Description Ρ ΠΏΠΎΠ½ΡΡΠ½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΡΠΈΠΏ ΡΡΠ°Π²ΠΈΠΌ Integer ΠΈ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» ΠΎΠΏΡΠΎΡΠ°. ΠΠ° Π²ΡΠ΅ΠΌΡ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Π΅ΡΡΡ ΡΠΌΡΡΠ» ΡΠ΄Π΅Π»Π°ΡΡ Π΅Π³ΠΎ ΠΏΠΎΠΊΠΎΡΠΎΡΠ΅, 30 ΡΠ΅ΠΊΡΠ½Π΄, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ. ΠΡΡ, Π³ΠΎΡΠΎΠ²ΠΎ, ΠΏΠΎΠΊΠ° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ.
ΠΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡΡβ¦ Π½Π΅Ρ, Π΅ΡΠ΅ ΡΠ°Π½ΠΎ. Π‘Π΅ΠΉΡΠ°Ρ, Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, Π½ΠΈΡΠ΅Π³ΠΎ ΠΌΡ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ. ΠΡΠΎΡΡΠΎ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΡΠΊΡΠΈΠΏΡ Π΅ΡΠ΅ Π½Π΅ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ. ΠΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΡΠΎ ΡΠΏΡΡΠ΅Π½ΠΈΠ΅. Π‘ΠΊΡΠΈΠΏΡ Π±ΡΠ΄Π΅Ρ Π²ΡΠ΄Π°Π²Π°ΡΡ ΠΏΡΠΎΡΡΠΎ ΡΠΈΡΡΡ, ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π½Π΅ΠΉ, ΠΎΡΡΠ°Π²ΡΠΈΡ ΡΡ Π΄ΠΎ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°. Π‘Π°ΠΌΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΡ ΠΈΠ· Π²ΡΠ΅Ρ ΠΈΠΌΠ΅ΡΡΠΈΡ ΡΡ. ΠΡΠΈΠΌΠ΅Ρ ΡΠΊΡΠΈΠΏΡΠ°:
try {
# ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Π²ΡΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ ΠΈΠ· Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ²
$lmCertificates = @( Get-ChildItem -Recurse -path 'Cert:LocalMachineMy' -ErrorAction Stop )
# ΠΡΠ»ΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² Π½Π΅Ρ, Π²Π΅ΡΠ½ΡΡΡ "10 Π»Π΅Ρ"
if ($lmCertificates.Count -eq 0) { return 3650 }
# ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Expiration Date Π²ΡΠ΅Ρ
ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ²
$expirationDates = @( $lmCertificates | ForEach-Object { return $_.NotAfter } )
# ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π±Π»ΠΈΠ·ΠΊΠΈΠΉ Expiration Date ΠΈΠ· Π²ΡΠ΅Ρ
$minExpirationDate = ($expirationDates | Measure-Object -Minimum -ErrorAction Stop ).Minimum
# ΠΠΎΠ½Π²Π΅ΡΡΠΈΡΡΠ΅ΠΌ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π±Π»ΠΈΠ·ΠΊΠΈΠΉ Expiration Date Π² ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΡΡΠ°Π²ΡΠΈΡ
ΡΡ Π΄Π½Π΅ΠΉ Ρ ΠΎΠΊΡΡΠ³Π»Π΅Π½ΠΈΠ΅ΠΌ Π² ΠΌΠ΅Π½ΡΡΡΡ ΡΡΠΎΡΠΎΠ½Ρ
$daysLeft = [Math]::Floor( ($minExpirationDate - [DateTime]::Now).TotalDays )
# ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
return $daysLeft
}
catch {
return -1
}
ΠΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΡΠ°ΠΊ:
723 Π΄Π½Ρ, Π΄ΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° Π΅ΡΠ΅ ΠΏΠΎΡΡΠΈ Π΄Π²Π° Π³ΠΎΠ΄Π°. ΠΠΎΠ³ΠΈΡΠ½ΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ Π½Π° Exchange ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΡΠ΅Π½Π΄Π° Ρ ΠΏΠ΅ΡΠ΅Π²ΡΠΏΠΈΡΡΠ²Π°Π» ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅Π΄Π°Π²Π½ΠΎ.
ΠΡΠΎ Π±ΡΠ» ΠΏΡΠΎΡΡΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ. ΠΠ°Π²Π΅ΡΠ½ΠΎΠ΅, ΠΊΠΎΠ³ΠΎ-ΡΠΎ ΠΈ ΡΠ°ΠΊΠΎΠΉ ΡΡΡΡΠΎΠΈΡ, Π½ΠΎ Π½Π°ΠΌ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π±ΠΎΠ»ΡΡΠ΅Π³ΠΎ. ΠΠ°Π΄Π°ΡΡ ΠΌΡ ΡΠ΅Π±Π΅ ΠΏΠΎΡΡΠ°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅, ΠΏΠΎΠΈΠΌΠ΅Π½Π½ΠΎ, ΠΈ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π½Π΅ΠΉ, ΠΎΡΡΠ°Π²ΡΠΈΡ ΡΡ Π΄ΠΎ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°.
ΠΡΠΎΡΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ, Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»ΠΎΠΆΠ½Π΅Π΅.
ΠΠΏΡΡΡ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ Π°Π³Π΅Π½ΡΠ° ΠΈ ΡΠ°ΠΌ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΡΠΎΡΠΊΠΈ Ρ ExternalParameter ΠΏΠΈΡΠ΅ΠΌ Π΄Π²Π΅ Π΄ΡΡΠ³ΠΈΠ΅:
ExternalList = HTTPS.CertificateNames: powershell.exe -File "serversharenetxms_CertExternalNames.ps1"
ExternalParameter = HTTPS.CertificateExpireDate(*): powershell.exe -File "serversharenetxms_CertExternalParameter.ps1" -CertificateId "$1"
Π ExternalList ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΡΠΏΠΈΡΠΎΠΊ ΡΡΡΠΎΠΊ. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΠΏΠΈΡΠΎΠΊ ΡΡΡΠΎΠΊ Ρ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ². Π‘ΠΏΠΈΡΠΎΠΊ ΡΡΠΈΡ ΡΡΡΠΎΠΊ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠΊΡΠΈΠΏΡΠΎΠΌ. ΠΠΌΡ ΡΠΏΠΈΡΠΊΠ° β HTTPS.CertificateNames.
Π‘ΠΊΡΠΈΠΏΡ NetXMS_CertNames.ps1:
#Π‘ΠΏΠΈΡΠΎΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
ΠΈΠΌΠ΅Π½ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ²
$nameTypeList = @(
[System.Security.Cryptography.X509Certificates.X509NameType]::SimpleName,
[System.Security.Cryptography.X509Certificates.X509NameType]::DnsName,
[System.Security.Cryptography.X509Certificates.X509NameType]::DnsFromAlternativeName,
[System.Security.Cryptography.X509Certificates.X509NameType]::UrlName,
[System.Security.Cryptography.X509Certificates.X509NameType]::EmailName,
[System.Security.Cryptography.X509Certificates.X509NameType]::UpnName
)
#ΠΡΠ΅ΠΌ Π²ΡΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ, ΠΈΠΌΠ΅ΡΡΠΈΠ΅ Π·Π°ΠΊΡΡΡΡΠΉ ΠΊΠ»ΡΡ
$certList = @( Get-ChildItem -Path 'Cert:LocalMachineMy' | Where-Object { $_.HasPrivateKey -eq $true } )
#ΠΡΠΎΡ
ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ ΡΠΏΠΈΡΠΊΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ², ΡΠΎΡΠΌΠΈΡΡΠ΅ΠΌ ΡΡΡΠΎΠΊΡ "ΠΠΌΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° - ΠΠ°ΡΠ° - Thumbprint" ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π΅Ρ
foreach ($cert in $certList) {
$name = '(unknown name)'
try {
$thumbprint = $cert.Thumbprint
$dateExpire = $cert.NotAfter
foreach ($nameType in $nameTypeList) {
$name_temp = $cert.GetNameInfo( $nameType, $false)
if ($name_temp -ne $null -and $name_temp -ne '') {
$name = $name_temp;
break;
}
}
Write-Output "$($name) - $($dateExpire.ToString('dd.MM.yyyy')) - [T:$($thumbprint)]"
}
catch {
Write-Error -Message "Error processing certificate list: $($_.Exception.Message)"
}
}
Π ΡΠΆΠ΅ Π² ExternalParameter ΠΌΡ Π½Π° Π²Ρ ΠΎΠ΄ ΠΏΠΎΠ΄Π°Π΅ΠΌ ΡΡΡΠΎΠΊΠΈ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ExternalList, Π° Π½Π° Π²ΡΡ ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π²ΡΡ ΡΠΎ ΠΆΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π½Π΅ΠΉ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ. ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ ΡΠ»ΡΠΆΠΈΡ Thumbprint ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ HTTPS.CertificateExpireDate Π² ΡΡΠΎΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π·Π²Π΅Π·Π΄ΠΎΡΠΊΡ (*). ΠΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π» Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΠΊΠ°ΠΊ ΡΠ°Π· Π½Π°Ρ CertificateId.
Π‘ΠΊΡΠΈΠΏΡ NetXMS_CertExpireDate.ps1:
#ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Π²Ρ
ΠΎΠ΄ΡΡΠΈΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ $CertificateId
param (
[Parameter(Mandatory=$false)]
[String]$CertificateId
)
#ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅
if ($CertificateId -eq $null) {
Write-Error -Message "CertificateID parameter is required!"
return
}
#ΠΠΎ Thumbprint ΠΈΠ· ΡΡΡΠΎΠΊΠΈ Π² $CertificateId ΠΈΡΠ΅ΠΌ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Π΅Π³ΠΎ Expiration Date
$certId = $CertificateId;
try {
if ($certId -match '^.*[T:(?<Thumbprint>[A-Z0-9]+)]$') {
$thumbprint = $Matches['Thumbprint']
$certificatePath = "Cert:LocalMachineMy$($thumbprint)"
if (Test-Path -PathType Leaf -Path $certificatePath ) {
$certificate = Get-Item -Path $certificatePath;
$certificateExpirationDate = $certificate.NotAfter
$certificateDayToLive = [Math]::Floor( ($certificateExpirationDate - [DateTime]::Now).TotalDays )
Write-Output "$($certificateDayToLive)";
}
else {
Write-Error -Message "No certificate matching this thumbprint found on this server $($certId)"
}
}
else {
Write-Error -Message "CertificateID provided in wrong format. Must be FriendlyName [T:<thumbprint>]"
}
}
catch {
Write-Error -Message "Error while executing script: $($_.Exception.Message)"
}
Π Data Collection Configuration ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ. Π Parameter Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ Π½Π°Ρ HTTPS.CertificateExpireDate(*) ΠΈΠ· ΡΠΏΠΈΡΠΊΠ°, ΠΈ, (Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅!) ΠΌΠ΅Π½ΡΠ΅ΠΌ Π·Π²Π΅Π·Π΄ΠΎΡΠΊΡ Π½Π° {instance}. ΠΡΠΎΡ Π²Π°ΠΆΠ½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΡΠ΅ΡΡΠΈΠΊ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ½ΡΡΠ°Π½ΡΠ° (ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°). ΠΡΡΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ, ΠΊΠ°ΠΊ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅:
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΡΠ΅ΡΡΠΈΠΊΠΈ Π±ΡΠ»ΠΎ ΠΈΠ· ΡΠ΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ, Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Instance Discovery Π½ΡΠΆΠ½ΠΎ Π²ΡΠ±ΡΠ°ΡΡ Agent List ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΈ Π² ΠΏΠΎΠ»Π΅ List Name Π²ΠΏΠΈΡΠ°ΡΡ ΠΈΠΌΡ Π½Π°ΡΠ΅Π³ΠΎ ExternalList ΠΈΠ· ΡΠΊΡΠΈΠΏΡΠ° β HTTPS.CertificateNames.
ΠΠΎΡΡΠΈ Π³ΠΎΡΠΎΠ²ΠΎ, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°ΡΡ ΠΈΠ»ΠΈ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Poll > Configuration ΠΈ Poll > Instance Discovery, Π΅ΡΠ»ΠΈ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΆΠ΄Π°ΡΡ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π²ΡΠ΅ Π½Π°ΡΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ ΡΠΎ ΡΡΠΎΠΊΠ°ΠΌΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ:
Π’ΠΎ, ΡΡΠΎ Π½Π°Π΄ΠΎ? ΠΡ Π΄Π°, ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ²ΡΡΠΎΠΊ ΠΏΠ΅ΡΡΠ΅ΠΊΡΠΈΠΎΠ½ΠΈΠ·ΠΌΠ° ΡΠΌΠΎΡΡΠΈΡ Π½Π° ΡΡΠΎΡ Π½Π΅Π½ΡΠΆΠ½ΡΠΉ Thumbprint Π² ΠΈΠΌΠ΅Π½ΠΈ ΡΡΠ΅ΡΡΠΈΠΊΠ° ΠΏΠ΅ΡΠ°Π»ΡΠ½ΡΠΌΠΈ Π³Π»Π°Π·Π°ΠΌΠΈ ΠΈ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π΄Π°Π΅Ρ Π·Π°ΠΊΠΎΠ½ΡΠΈΡΡ ΡΡΠ°ΡΡΡ. Π§ΡΠΎΠ±Ρ Π΅Π³ΠΎ Π½Π°ΠΊΠΎΡΠΌΠΈΡΡ, ΡΠ½ΠΎΠ²Π° ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΡΠ΅ΡΡΠΈΠΊΠ° ΠΈ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Instance Discovery Π² ΠΏΠΎΠ»Π΅ Β«Instance discovery filter scriptΒ» Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΉ Π½Π°
instance = $1;
if (instance ~= "^(.*)s-s[T:[a-zA-Z0-9]+]$")
{
return %(true, instance, $1);
}
return true;
ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²ΡΠ²Π°ΡΡ Thumbprint:
Π ΡΡΠΎΠ±Ρ Π΅Π³ΠΎ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²Π°Π½Π½ΡΠΌ, Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ General Π² ΠΏΠΎΠ»Π΅ Description ΠΌΠ΅Π½ΡΠ΅ΠΌ CertificateExpireDate: {instance} Π½Π° CertificateExpireDate: {instance-name}:
ΠΡΡ, Π½Π°ΠΊΠΎΠ½Π΅Ρ-ΡΠΎ ΡΠΈΠ½ΠΈΡ ΠΈΠ· ΠΠΠΠ:
ΠΡΠ°ΡΠΎΡΠ° ΠΆΠ΅?
ΠΡΡΠ°Π»ΠΎΡΡ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΎΠΏΠΎΠ²Π΅ΡΠ΅Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠ»ΠΈ Π½Π° ΠΏΠΎΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΡΠΎΠΊ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ ΠΊ ΡΠ²ΠΎΠ΅ΠΌΡ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠΌΡ ΠΊΠΎΠ½ΡΡ.
1. Π‘Π½Π°ΡΠ°Π»Π° Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°Π±Π»ΠΎΠ½ ΡΠΎΠ±ΡΡΠΈΡ (Event Template) Π΄Π»Ρ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΈ Π΅Π³ΠΎ ΠΏΡΠΈ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠ΅ΡΡΠΈΠΊΠ° Π΄ΠΎ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°ΠΌΠΈ ΠΏΠΎΡΠΎΠ³Π°. Π Event Configuration ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π²Π° Π½ΠΎΠ²ΡΡ ΡΠ°Π±Π»ΠΎΠ½Π° Ρ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, ΡΠΊΠ°ΠΆΠ΅ΠΌ CertificateExpireDate_Threshold_Activate ΡΠΎ ΡΡΠ°ΡΡΡΠΎΠΌ Warning:
ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΉ CertificateExpireDate_Threshold_Deactivate ΡΠΎ ΡΡΠ°ΡΡΡΠΎΠΌ Normal.
2. ΠΠ°Π»ΡΡΠ΅ ΠΈΠ΄Π΅ΠΌ Π² ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΡΠ΅ΡΡΠΈΠΊΠ° ΠΈ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Tresholds Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΡΠΎΠ³:
Π³Π΄Π΅ Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ Π½Π°ΡΠΈ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΡΠ²Π΅Π½ΡΡ CertificateExpireDate_Threshold_Activate ΠΈ CertificateExpireDate_Threshold_Deactivate, ΡΡΠ°Π²ΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΌΠ΅ΡΠΎΠ² (Samples) 1 (ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΠ΅ΡΡΠΈΠΊΠ° Π±ΠΎΠ»ΡΡΠ΅ ΡΡΠ°Π²ΠΈΡΡ ΡΠΌΡΡΠ»Π° Π½Π΅Ρ), Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² 30 (Π΄Π½Π΅ΠΉ), ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΈ, ΡΡΠΎ Π²Π°ΠΆΠ½ΠΎ, Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ΠΈΡ ΡΠ²Π΅Π½ΡΠ°. ΠΠ»Ρ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅ Ρ ΡΡΠ°Π²Π»Ρ ΡΠ°Π· Π² ΡΡΡΠΊΠΈ (86400 ΡΠ΅ΠΊΡΠ½Π΄), ΠΈΠ½Π°ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΎΠ½ΡΡΡ Π² ΠΎΠΏΠΎΠ²Π΅ΡΠ΅Π½ΠΈΡΡ
(ΡΡΠΎ, ΠΊΡΡΠ°ΡΠΈ ΠΈ ΡΠ»ΡΡΠΈΠ»ΠΎΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, ΠΏΡΠΈΡΠ΅ΠΌ ΡΠ°ΠΊ, ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½ΠΈΠ»ΡΡ ΠΏΠΎΡΡΠΎΠ²ΡΠΉ ΡΡΠΈΠΊ Π·Π° Π²ΡΡ
ΠΎΠ΄Π½ΡΠ΅). ΠΠ° Π²ΡΠ΅ΠΌΡ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Π΅ΡΡΡ ΡΠΌΡΡΠ» ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΠΏΠΎΠΌΠ΅Π½ΡΡΠ΅, 60 ΡΠ΅ΠΊΡΠ½Π΄, ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ.
3. Π Action Configuration ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ°Π±Π»ΠΎΠ½ ΠΏΠΈΡΡΠΌΠ° ΠΎΠΏΠΎΠ²Π΅ΡΠ΅Π½ΠΈΡ, ΡΠΈΠΏΠ° ΡΠ°ΠΊΠΎΠ³ΠΎ:
ΠΡΠ΅ ΡΡΠΈ %m, %S ΠΈ Ρ.ΠΏ. β ΠΌΠ°ΠΊΡΠΎΡΡ, Π² ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»Π΅Π½Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· Π½Π°ΡΠ΅Π³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°. ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΎΠ½ΠΈ ΠΎΠΏΠΈΡΠ°Π½Ρ Π²
4. Π, Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ ΠΏΡΠ½ΠΊΡΡ, Π² Event Processing Policy ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡΡΡ Alarm ΠΈ ΠΎΠΏΡΠ°Π²Π»ΡΡΡΡΡ ΠΏΠΈΡΡΠΌΠΎ:
Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΡ, Π²ΡΡ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ. ΠΠΎΡΡΠ°Π²ΠΈΠΌ ΠΏΠΎΡΠΎΠ³ ΠΏΠΎΠ²ΡΡΠ΅, Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ. Π£ ΠΌΠ΅Π½Ρ Π±Π»ΠΈΠΆΠ°ΠΉΡΠΈΠΉ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΠΈΡΡΠ΅ΠΊΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π· 723 Π΄Π½Ρ, Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΠΎΡΡΠ°Π²ΠΈΠ» 724. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ°ΠΊΠΎΠΉ Π°Π»Π°ΡΠΌ:
ΠΈ ΡΠ°ΠΊΠΎΠ΅ ΠΎΠΏΠΎΠ²Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΡΡΠ΅:
ΠΠΎΡ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΎΡΠ½ΠΎ Π²ΡΡ. ΠΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π½Π°ΡΡΡΠΎΠΈΡΡ Π΄Π°ΡΠ±ΠΎΡΠ΄, ΠΏΠΎΡΡΡΠΎΠΈΡΡ Π³ΡΠ°ΡΠΈΠΊΠΈ, Π½ΠΎ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² ΡΡΠΎ Π±ΡΠ΄ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½ΡΠ΅ ΠΈ ΡΠΊΡΡΠ½ΡΠ΅ ΠΏΡΡΠΌΡΠ΅ Π»ΠΈΠ½ΠΈΠΈ, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π³ΡΠ°ΡΠΈΠΊΠΎΠ² Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° ΠΈΠ»ΠΈ ΠΏΠ°ΠΌΡΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ. ΠΠΎ, ΠΎΠ± ΡΡΠΎΠΌ ΠΊΠ°ΠΊ-Π½ΠΈΠ±ΡΠ΄Ρ Π² Π΄ΡΡΠ³ΠΎΠΉ ΡΠ°Π·.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com