【问题标题】:PowerShell Last Time MS Office was UsedPowerShell 上次使用 MS Office 的时间
【发布时间】:2017-09-28 19:22:52
【问题描述】:

我非常急于尝试找到一种方法来查询公司域中的所有 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 

【问题讨论】:

    标签: function powershell get-wmiobject


    【解决方案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
            }
        }
    

    【讨论】:

    • 在尝试对远程 Windows 7 计算机运行上述脚本时,我不断收到此错误消息。我尝试添加管理员凭据和 -impersonation 3,但没有成功。有什么想法吗? Get-WmiObject:一般故障
    • 尽管每次连接到远程计算机时都会出现 Generic failure 错误,但该脚本最终会生成正确的输出。非常感谢 BenH,你真的救了我!
    【解决方案2】:

    输出真的只是 $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"
    

    【讨论】:

    • 非常感谢 ArcSet,你和 BenH 真的救了我!不幸的是,去年我们只有 5 台电脑没有使用过 Office,但至少我们知道! :)
    猜你喜欢
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多