0

我非常急于尝试找到一种方法来查询公司域中的所有 Windows 7 计算机,并确定他们最后一次使用 Microsoft Office 的时间。我们正在接受审核,明天需要完成(是的),我想看看我们是否可以在支付我们不需要的许可证之前卸载 Office。

我有一段时间没有使用 PowerShell,坦率地说,这是我昨晚开始使用此代码后发现的 - 即 newb。也许,有更好或更简单的方法?昨晚我尝试搜索预先完成的脚本或程序,但找不到任何说明上次使用 Office 的时间。

我可以使用以下代码和函数获取最新的“LastUse”,但我需要知道该号码与哪个计算机名称相关联。现在它只返回最新的数字:20170928

function Measure-Latest {
BEGIN { $latest = $null }
PROCESS {
        if (($_ -ne $null) -and (($latest -eq $null) -or ($_ -gt $latest))) {
            $latest = $_ 

        }
}
END { $latest }
} 

$Software = Get-WmiObject -Class win32_softwarefeature | Select Caption,LastUse
$ComputerName = $env:COMPUTERNAME

$(foreach ($item in $Software) 
{
$Name = $Item.Caption
$LastUsedString = $Item.Lastuse.Substring(0,8)
$LastUsed = [int]$LastUsedString



    if ($Name -like 'Microsoft Office*' -or $Name -like 'Microsoft Outlook')  
       { 

        $LastUsed
            }   }) | Measure-Latest 
4

2 回答 2

1

输出实际上只是$LastUsed | 最新测量

将其更改为

$LastUsed = $LastUsed | Measure-Latest
If ($LastUsed -eq "19800000"){
    $LastUsed = "Never"
}
"$ComputerName : $Name : $LastUsed"

下面的完整脚本将为您单独提供所有 Microsoft Office 产品的最后一次使用

function Measure-Latest {
    BEGIN { 
        $latest = $null 
    }
    PROCESS {
        if (($_ -ne $null) -and (($latest -eq $null) -or ($_ -gt $latest))) {
            $latest = $_ 
        }
    }
    END {
        $latest
    }
} 

$Software = Get-WmiObject -Class win32_softwarefeature | Select Caption,LastUse
$ComputerName = $env:COMPUTERNAME
foreach ($item in $Software) {
    $Name = $Item.Caption
    $LastUsedString = $Item.Lastuse.Substring(0,8)
    $LastUsed = [int]$LastUsedString
    if ($Name -like 'Microsoft Office*' -or $Name -like 'Microsoft Outlook') { 
        $LastUsed = $LastUsed | Measure-Latest
        If ($LastUsed -eq "19800000"){
            $LastUsed = "Never"
        }
        "$ComputerName : $Name : $LastUsed"
    }   
}

如果您只想最后一次使用任何 Office 产品,则将 for each 的输出存储在一个变量中,并使用 $Computername 变量调用它

function Measure-Latest {
    BEGIN { 
        $latest = $null 
    }
    PROCESS {
        if (($_ -ne $null) -and (($latest -eq $null) -or ($_ -gt $latest))) {
            $latest = $_ 
        }
    }
    END {
        $latest
    }
} 

$Software = Get-WmiObject -Class win32_softwarefeature | Select Caption,LastUse
$ComputerName = $env:COMPUTERNAME
$LastRun = $(foreach ($item in $Software) {
    $Name = $Item.Caption
    $LastUsedString = $Item.Lastuse.Substring(0,8)
    $LastUsed = [int]$LastUsedString
    if ($Name -like 'Microsoft Office*' -or $Name -like 'Microsoft Outlook') { 
        $LastUsed
    }   
}) | Measure-Latest

"$ComputerName : $LastRun"
于 2017-09-28T19:35:58.967 回答
1

如果您在每台机器上本地运行它,我认为这可能是您正在寻找的:

Get-WmiObject -Class Win32_SoftwareFeature |
    Where-Object {$_.Caption -match 'Microsoft\sOffice|Microsoft\sOutlook'} |
    Select-Object Caption, @{n='LastUse';e={[int]($_.Lastuse.Substring(0, 8))}},@{n='ComputerName';e={$env:COMPUTERNAME}} |
    Sort-Object LastUse |
    Select-Object -Last 1

如果您针对远程计算机列表运行它

$ComputerNames = Get-Content C:\example\list.txt
Get-WmiObject -Class win32_softwarefeature -ComputerName $ComputerNames |
    Where-Object {$_.Caption -match 'Microsoft\sOffice|Microsoft\sOutlook'} |
    Select-Object Caption, @{n='LastUse';e={[int]($_.Lastuse.Substring(0, 8))}},PSComputername |
    Group-Object PSComputername |
    ForEach-Object {
        $Group = $_.Group |
            Sort-Object LastUse |
            Select-Object -Last 1
        [PSCustomObject]@{
            ComputerName = $_.Name
            Caption = $Group.Caption
            LastUse = $Group.LastUse
        }
    }
于 2017-09-28T19:40:34.143 回答