能够快速识别软件是安装在您的服务器上有价值的原因。管理软件许可成本和福利、计划升级预算,确定候选人服务器整合,甚至应对安全事故都是常见原因执行软件目录。
当然企业库存跟踪软件的工具。但是这些工具可以是昂贵和复杂,或者可以访问限制在特定团体或个人在你的组织中。幸运PowerShell可以帮助腿的工作分析软件在你的系统,以帮助推动你的计划和事件反应。
有时你也需要进一步不仅仅是清单安装软件。收购细节服务或启动应用程序、文件共享,甚至重要的开放端口可以完全回答您的业务问题。
确定安装的软件
理论上获取安装软件列表的一个简单的命题。使用Get-WmiObjectcmdlet查询Win32_Product类生产安装的软件列表,但在许多情况下,你会发现这个清单是不完整的。一个更好的选择是包装cmdlet,提供一些方便的功能。
运行包装不带参数将返回一个列表,安装的软件包括Windows更新,可能比你更详细。到已安装的应用程序只关注你要排除包根据密歇根州立大学(微软更新)提供者类型使用包装-ProviderName项目,MSI。包装给你的软件名称和版本默认情况下,以及一些其他领域你可能不在乎,与附加字段默认隐藏。其他关键字段你可能关心的包括FullPath性质,应用程序安装到何处,FromTrustedSource标志,表明该软件是否安装的软件资源库所信赖的企业。
有一些有用的数据不容易使用包装,但它们有时访问如果你愿意挖表面下一点。SwidTagText属性包含XML数据,包括软件的信息就像一个帮助的电话号码,URL的引用,甚至安装日期。访问这些属性需要一点点的体操,但你可以让它是如何工作的:
包装-ProviderName项目,MSI | ForEach-Object {
xml = (xml) _.SwidTagText美元
元= xml.SoftwareIdentity.Meta美元
$ _ |添加成员-MemberType NoteProperty - name HelpTelephone价值元美元。HelpTelephone passthru
$ _ |添加成员-MemberType NoteProperty - name UrlInfoAbout价值元美元。UrlInfoAbout passthru
}| Format-Table名称、版本、HelpTelephone UrlInfoAbout -AutoSize
有不少,所以让我们分解发生了什么。
第一行运行包装cmdlet和管道的结果ForEach-Object,然后遍历每个元素和执行的代码包含在括号歪歪扭扭。
内循环代码,第一步是解析XML字符串中包含SwidTagText财产。
向后的工作在第一行循环,美元_references当前元素在ForEach循环,所以$ _。SwidTagText是指,为每个软件来自XML文本包装。前缀$ _。SwidTagText与(xml)表明,我们不希望把它作为字符串的文本,而是一个xml对象。一旦我们所做的工作得到的XML对象,我们分配给一个变量,让它更容易参考前进。
之后我们有一个XML对象一起工作我们要浏览该对象的元数据,这是我们所做的与xml.SoftwareIdentity美元。元语法,我们指定组件的XML对象$元变量。
下两行几乎是相同的,所以我们只支付概念。从$ _变量引用当前实例从包装,我们管的添加成员cmdlet。添加成员让我们添加一个新属性指定成员类型,名称,和价值。passthru标志仅仅保留的输出添加成员cmdlet。最后,我们管中包含的神奇的结果ForEach-Object代码块的Format-Tablecmdlet,它给了我们一个表格视图指定的列。这最后一个组件可以使用Export-CSVcmdlet保存输出进行进一步分析。
确定应用程序服务和安排任务
是一回事能够确定在您的服务器上安装了什么软件,但它也有助于知道服务或计划任务一个软件包使您的系统。当然同时使用两种方法来执行代码无需用户干预,两者是截然不同的和执行这段代码时以及他们是如何管理的。
深入与PowerShell服务是相对简单的,因为有一个得到服务cmdlet。但作为一个反复出现的主题,得到服务有一些局限性。一个更好的选择是使用Win32_Service WMI类和(Windows管理规范)Get-WmiObjectcmdlet。
执行类似Get-WmiObject Win32_Service |都的名字——“名*”| Select-Object *将返回所有属性从服务目标。这些属性包括名称、描述和显示名称,以及现状和启动类型。此外,路径名属性识别过程和参数用于启动该服务,和ProcessId属性标识当前进程在内存中如果服务运行状态。
查询计划任务更加困难。Win32_ScheduledJob的WMI类允许您创建的查询工作或通过脚本。exe,但不是那些创建计划任务控制面板。您还可以选择使用一整套TaskScheduler命名空间中的类如果你想疯了。你可以得到一个列表,这些类使用Get-WmiObject附些根/微软/ Windows / TaskScheduler名称空间。一个更简单的选择是Get-ScheduledTask cmdlet,一堆埋下表面细节。
首先,Get-ScheduledTask返回TaskName, TaskPath和状态没有任何挖掘。这些属性给友好的名称在计划任务控制面板,你看到任务的路径在导航窗格中,和任务的状态。
细节像正在执行的应用程序或命令需要更多的挖掘。计划任务存储这些信息在执行中的行为属性和参数属性。以下代码片段查询任务列表没有禁用状态,提取操作细节,并将其组成一个新的属性命名命令,并滴输出到控制台。
Get-ScheduledTask |都禁用状态- ne | ForEach-Object {
$ _ |添加成员-MemberType NoteProperty - name命令值(_.Actions美元。+ ' ' + _.Actions.Arguments美元)passthru执行
}| Select-Object TaskName、州命令,TaskPath
的计划任务的关键信息这是一个很好的开始,但是如果你想要一些日程安排的细节。在预定的任务控制面板下运行时间和运行时,为总结目的是完美的,但Get-ScheduledTask不直接提供这些细节。好消息是我们不需要挖太远了运行时的细节,如Get-ScheduledTaskInfocmdlet给我们我们需要的。
将运行时细节添加到我们的代码上面剪掉我们首先需要得到每个任务的任务信息细节我们循环ForEach-Object。最简单的方法就是简单地管目前的任务实例Get-ScheduledTaskInfocmdlet使用$ _变量造成的。一旦我们做了,我们会将其分配给$ taskInfo变量,然后运行时细节添加到输出。
Get-ScheduledTask |都禁用状态- ne | ForEach-Object {
$ taskInfo = $ _ | Get-ScheduledTaskInfo
$ _ |添加成员-MemberType NoteProperty - name命令值(_.Actions美元。+ ' ' + _.Actions.Arguments美元)passthru执行
$ _ |添加成员-MemberType NoteProperty - name LastStart taskInfo美元价值。LastRunTime passthru
$ _ |添加成员-MemberType NoteProperty - name NextStart taskInfo美元价值。NextRunTime passthru
}| Select-Object TaskName,状态,命令,TaskPath, LastStart NextStart
既然我们已经建立的关键细节怎么去我们的任务,让我们圆回到最初的目标是收集数据在特定任务相关的软件工具。
有少量的属性,用于关联到一个应用程序可以包含细节。其中一些属性可以作为参数Get-ScheduledTask,而其他人只能用于过滤任务已经查询后的结果。-TaskName和-TaskPath参数可能杠杆来查询这些属性,甚至可以使用通配符搜索匹配不准确。
可能有用的其他一些信息搜索下执行价值的行为,也有可能包含一个文件路径或至少一个可执行的。查询执行的基础上我们可以使用价值都是这样的:
Get-ScheduledTask |都{_.Actions美元。执行——‘* Adobe *}
从那里,结果可以输送到其余的代码片段上面我们为了充分开发的数据集和产生有用的结果。