Подсчет дней с момента последней установки программы с помощью PowerShell - PullRequest
0 голосов
/ 04 ноября 2019

Как найти все недавно установленное / отремонтированное / модифицированное программное обеспечение?

Я пытался получить список из реестра, затем отфильтровать его, чтобы найти только соответствующие программы, и затем попробоватьчтобы вычислить, какой из них был установлен до определенного порога.

Это то, что я делал:

$Installed_Software=Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate
$SoftwareInstall_Days = 40
$TheDate = (([datetime]::Now))

$Installed_recently= @()
$Installed_recently=($Installed_Software |
Where-Object {($_.DisplayName -match ('Something') -or $_.Publisher -match ('SomeOtherThing'))} |
where (($TheDate - $_.InstallDate) -le $SoftwareInstall_Days)

if ($Installed_recently) {
    Write-Output "Relevant software was recently installed and/or repaired / modified.`nThese are the items:`n$Installed_recently"
}
else {
    Write-Output "No relevant software was recently installed and/or repaired / modified."
}

Конечно, следующее условие является лишь иллюстрацией того, что мне не удаетсясделать:

where (($TheDate - $_.InstallDate) -le $SoftwareInstall_Days)

Как это можно сделать?

Я даже здесь в правильном направлении?

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Существуют методы для объекта datetime для добавления или удаления минут, часов, дней, лет с даты и времени, см. Скрипт ниже. Для вашего текущего примера получения программного обеспечения из реестра, InstallDate необходимо преобразовать в формат даты и времени, а затем сравнить с необходимой датой из отчета.

#Report date 40 days
$SoftwareInstall_Days = (([datetime]::Now)).AddDays(-40)
#Getting installed software and filtering based on report date
$Installed_recently=Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, @{Name = "InstalledDate" ; Expression = {[DateTime]::ParseExact($_.InstallDate, 'yyyyMMdd', [Globalization.CultureInfo]::InvariantCulture) } }| where {$_.installeddate -ge $SoftwareInstall_Days}
#Output
$Installed_recently

Установленное программное обеспечение также можно собирать из разных мест:

#Using WMI
Get-WmiObject -Class Win32_Product

#Using PS Software provider
Get-Package
1 голос
/ 04 ноября 2019

Чтобы иметь возможность сравнивать даты, вам нужно проанализировать строку InstallDate, полученную из реестра, а затем вычесть ее из текущей даты.

Существует несколько форматов, в которых эта строка можетбыть. На моей машине, английской Win10 x86, я вижу 2 формата даты: yyyyMMdd и MM/dd/yyyy. В приведенном ниже коде я создал массив, в который можно добавлять дополнительные форматы для разбора.

Вот модифицированный код - для проверки я использовал строку «Microsoft»:

# Add additional property InstallDateObj that will hold the parsed DateTime object
$Installed_Software=Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object  DisplayName, DisplayVersion, Publisher, InstallDate, InstallDateObj
$SoftwareInstall_Days = 40
$TheDate = (([datetime]::Now))

# Try to parse dates.
$Installed_Software.ForEach({

    # add more formats if you need
    [string[]] $formats = @("yyyyMMdd","MM/dd/yyyy")

    $installDate = $_.InstallDate
    $installedDateObj = $null;    
    $formats.ForEach({ [DateTime] $dt = New-Object DateTime; if([datetime]::TryParseExact($installDate, $_, [System.Globalization.CultureInfo]::InvariantCulture, [System.Globalization.DateTimeStyles]::None, [ref]$dt)) {  $installedDateObj = $dt} }); 
    $_.InstallDateObj = $installedDateObj
})

$Installed_recently= @()
$Installed_recently=($Installed_Software |
Where-Object {($_.DisplayName -match ('Microsoft') -or $_.Publisher -match ('Microsoft') -and ($_.InstallDateObj -ne $null) -and ($TheDate - $_.InstallDateObj).Days -le $SoftwareInstall_Days)})

if($Installed_recently.Count -gt 0) {
    Write-Output "Relevant software was recently installed and/or repaired / modified.`nThese are the items:`n"
    Write-Output $Installed_recently
}
else {
    Write-Output "No relevant software was recently installed and/or repaired / modified."
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...