Nuper ante faciem sumus cum munere vigilantiae validitatis tempus libellorum in Fenestra servientibus. Bene, quomodo surrexi post libellos aliquotiens in cucurbitam conversus, eo ipso tempore quo collega barbatus auctor suae renovationis ferias agit. deinde ipse et suspicatus sum aliquid et de eo cogitandum decrevi. Cum tardius exsequentes systema vigilantia NetXMS sumus, principalis facta est et, in principio, unico ad hoc negotium candidatus.
Quo factum est, ut in hac forma tandem impetraretur;
Et ipse processus prosequitur.
Vade. Nulla in re-constructa ad exspirandas libellos in NetXMS, ideo opus est tua creare et scripta utere ut ea cum notitia praebeas. Nempe in Powershell, hoc est Fenestra. Scriptum omnes libellos in systemate operante legere debet, in diebus inde expletis diem suum capiat et hunc numerum ad NetXMS transeat. Per procuratorem suum. Hic incipiemus.
optio unussimplicissimus. Simpliciter habe numerum dierum usque ad expletum diem certificamenti cum proximis date.
Pro servo NetXMS cognoscere consuetudinem consuetudinis nostrae parametri esse, eam ab agente accipere debet. Alioquin modulus iste ob absentiam suam addi non potest. Ergo in configuration file agente nxagentd.conf addimus externum parametri linea dicta HTTPS.CertificateExpireDateSimple, in quo scriptionis enucleandae subcriptio:
ExternalParameter = HTTPS.CertificateExpireDateSimple: powershell.exe -File "servershareNetXMS_CertExpireDateSimple.ps1"
Cum scriptum sit per retiaculum induci, debes meminisse de eo
Quam ob rem agens config aliquid simile hoc spectat;
#
# 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"
Postea debes config salvare ac sileo procuratorem. Hoc facere potes e console NetXMS: config aperi (informatio lima agentis Edit), eam edit, fac Serva & Applica, ex quo re vera idem fiet. Deinde re-legere configurationem (Poll > configurationis), si vis omnino exspectare non habes. Post hos gradus consuetudini nostrae modulum addere possis.
In NetXMS console ire ad Data Collectio configurationis experimentalis ministrator in quo sumus monitores libellos adeundos atque novum ibi parametrum (in futuro, post configurationem, sensum ad exempla transferre facit). HTTPS. CertificateExpireDateSimple e indice, Descriptionem clari nominis inire, typum ad Integer pone et spatium suffragium configurare. Ad proposita debugging, sensum breviorem facit, ut 30 secundis. Omnia parata sunt, iam satis est.
Inhibere potes... Immo immaturum est. Nunc certe nihil obtinemus. Simpliciter quia scriptura nondum scripta est. Corripiamus hanc omissionem. Scriptum simpliciter numerum ostendet, numerum dierum remanentium usque ad libellum exspirat. Minima maxime omnis consectetur. Exemplum script:
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
}
Sic evenit;
723 dies, duo fere anni supersunt usque ad libellum exspirat. Consentaneum est, quod libellos de Exchange test scamnum satis recens re-edisti.
Facilis optio erat. Probabiliter aliquis contentus erit hoc, sed voluimus plura. Negotium nobis constituimus obtinendi indicem omnium libellorum in calculonis servi nominatim et pro singulis ad numerum dierum usquedum certificatorium exspirat.
Secundum optionemaliquanto crassius.
Iterum recensimus config agentem, et ibi pro linea cum Externo parametro scribimus duos alios;
ExternalList = HTTPS.CertificateNames: powershell.exe -File "serversharenetxms_CertExternalNames.ps1"
ExternalParameter = HTTPS.CertificateExpireDate(*): powershell.exe -File "serversharenetxms_CertExternalParameter.ps1" -CertificateId "$1"
Π ExternalList nos iustus a album chordarum. In nobis, index chordarum cum nominibus certificatorium. Indicem harum linearum scripturi accipiemus. Nomen album - HTTPS.CertificateNames.
Script 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)"
}
}
Et iam in ExternalParameter Ordines inputamus ab externo indicem, et in output totidem dies pro singulis accipimus. Identifier est Thumbprint certificatorium. Nota quod HTTPS.CertificateExpireDate asteriscum continet (*) in hoc variante. Hoc necessarium est ut variabiles externas accipiat, sicut nostri CertificateId.
Script 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)"
}
In Data Collectione configurationis servientis novum parametrum creamus. In Parametro eligamus nostrum HTTPS.CertificateExpireDate (*) e indice, et (attentio!) asterisco mutatur in {exempli gratia}. Hoc magni momenti punctum sineret te singularem calculi rationem creare pro singulis instantia (testimonium). Reliqua ut in priori versione referta sunt;
Ut aliquid ex calculis creare possit, in Instantia Inventionis tab, debes eligere Agentem Indicem e indice et in nomine Agri Nomen intrant nomen nostri ExternalList ex scripto - HTTPS.CertificateNames.
Paene paratus, paululum vel vim Poll > Configurationis et Poll > Instantia Inventionis si expectare omnino impossibile est. Quam ob rem omnes nostras testimoniales cum validitate periodos colligimus;
Quod requires? Bene, ita, solus vermis perfectionismi hunc superfluum Thumbprint aspicit in nomine calculi tristibus oculis et articulum non permitto. Ad eam nutriendam, proprietates contrahendas iterum aperite et in Instantia Inventionis tab, in "Instantia inveniendae scripturae filtri" campi, adde unum scriptum in
instance = $1;
if (instance ~= "^(.*)s-s[T:[a-zA-Z0-9]+]$")
{
return %(true, instance, $1);
}
return true;
quae Colum Thumbprint:
Et ut eam eliquatam exhibeas, tab in agro Generali in Descriptione, muta CertificateExpireDate: {instantia} ad CertificateExpireDate: {exempli nomine}:
Id denique metam ex KDPV;
Nonne pulchritudo?
Reliquum est ut in summis montibus erigantur ut per electronicam perveniant cum libellum exspirat.
1. Primum opus est ut eventus Formulae ad excitandum illud efficiendum, cum valor contrarius decrescit ad aliquod limen quod constituimus. IN' Event configurationis Duo nova exempla in nominibus ut faciamus creare CertificateExpireDate_Threshold_Activate Admonitio ad statum:
et similia CertificateExpireDate_Threshold_Deactivate per normalem statum.
2. Deinde in abacum proprietates adi et pone limen in Tresholdis tab;
ubi eligimus res nostras creatas CertificateExpireDate_Threshold_Activate et CertificateExpireDate_Threshold_Deactivate, pone numerum exemplorum (Samples) ad 1 (specialiter huic calculo nullum punctum est in occasu plus), valor est 30 (dies), exempli gratia, ac potius pone. eventus, repetitio temporis. Pro libellorum in productione semel in die (86400 secundo) constitui, aliter in notificationibus mergere potes (quod obiter semel factum est, adeo ut mailbox super volutpat vestibulum plena esset). Pro tempore debugging, sensum facit ad inferiorem, LX secundis, pro exemplo.
3. Quod Actio configurationis template notificationem creare litterae, sic:
Omnes hi %m, %S, etc. β macros in quos valores ex parametro nostro substituentur. Describuntur planius in
4. Ac tandem, puncta coniungens in praecedentibus Res Processing Policy regulam crea secundum quam Terror creabitur et litterae mittentur;
Servamus consilium, omnia probentur. Limen altiore statuamus sisto. Proximum testimonium meum in 723 diebus exspirat, 724 ad reprimendum constituo. Quo fit, ut terrorem insequentes obtineamus:
et haec inscriptio notificatio:
Id nunc certe omnia. Fieri quidem posset, ut ashboardday et graphes construeret, sed testimonia haec aliquantum inane essent lineas rectas et taediosam, dissimiles graphes processus vel oneris memoriae, exempli gratia. Sed auctor tempus aliquam.
Source: www.habr.com