- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试构建一个简单的“get-ProcessInfo.ps1”模块,以与名为 Kansa 的 PowerShell(取证/IR)框架一起使用。该命令是一个简单的单行程序,它调用 Get-WMIObject win32_process 并将其通过管道传递给 Select-Object。然后 Kansa 应该通过 Export-Csv cmdlet 将数据导出到 Csv。该脚本在我的本地主机上运行没有问题,但是在通过 Kansa 中的 Invoke-Command cmdlet 远程运行(在 Windows 上)时失败。对于每个 processID,我的错误日志显示 get-ProcessInfo.ps1“找不到具有进程标识符 #### 的进程”。其他模块在远程主机上运行没有问题,所以我知道我正在以管理员身份进行身份验证。因此,我认为我遇到了权限错误,或者可能是 Wmi 的身份验证问题。我通过域管理员帐户从 Windows 框在 Windows 域中运行它。
堪萨 GitHub:https://github.com/davehull/Kansa
堪萨斯谈话:https://www.youtube.com/watch?v=cQmsT9D0kKI
我试图复制另一个 Kansa 模块中看到的 WmiObject 调用,但这仍然没有从远程主机生成数据。 - https://github.com/davehull/Kansa/blob/master/Modules/Process/Get-ProcsWMI.ps1
我试图了解 InjectedThreads.ps1 脚本中发生了什么,因为它远程使用 WmiObject 没有问题,但它有点超出我的想象。据我所知,听起来 WmiObject 是“非托管的”(未经身份验证?/没有从 PowerShell 继承 Kerberos?) - https://github.com/davehull/Kansa/blob/master/Modules/Process/Get-InjectedThreads.ps1
我尝试了 Wmi 身份验证、模拟和权限的多种变体。不幸的是,仍然没有产生远程数据。 - https://blogs.msmvps.com/richardsiddaway/2011/08/04/authentication-impersonation-and-privileges/
最后,由于 get-WmiObject 在技术上已被弃用,为了支持 Get-CIMInstance,我尝试了 Get-CIMInstance cmdlet 的多种变体。
这是我正在尝试制作的模块中的代码,get-ProcessInfo.ps1
Get-WmiObject win32_process | Select-Object creationdate,ws,ProcessName,ProcessID,ParentProcessID, @{Name = 'ParentProcessName';Expression = {(Get-Process -Id $_.ParentProcessId).Name}},Path,CommandLine,@{Name = 'ParentProcessPath';Expression = {(Get-Process -Id $_.ParentProcessId).Path}}
最佳答案
在您的计算属性中,您假设 ParentProcessId
始终是有效的 id:
@{Name = 'ParentProcessPath';Expression = {(Get-Process -Id $_.ParentProcessId).Path}
It is possible that the process identified by ParentProcessId is terminated, so ParentProcessId may not refer to a running process. It is also possible that ParentProcessId incorrectly refers to a process that reuses a process identifier.
ParentProcessId
可能指向一个已经终止的进程。在那种情况下
(Get-Process -Id $_.ParentProcessId).Path
将触发错误(因为没有找到例如 528 的进程,因此
(Get-Process -Id $_.ParentProcessId)
将是
$null
并且您正在尝试调用
$null.Name
)。
$Job = Invoke-Command -Session $PSSessions -FilePath $Module -ArgumentList $Arguments -AsJob -ThrottleLimit $ThrottleLimit
-AsJob
开关)。我问自己,通过后台调用脚本 block 时,错误处理是否会有所不同。我发现了这个有趣的 StackOverflow
answer说明:
Using throw will change the job object's State property to "Failed". ...
$job =start-job -ScriptBlock { Get-WmiObject win32_process | Select-Object creationdate,ws,ProcessName,ProcessID,ParentProcessID, @{Name = 'ParentProcessName';Expression = {(Get-Process -Id $_.ParentProcessId).Name}},Path,CommandLine,@{Name = 'ParentProcessPath';Expression = {(Get-Process -Id $_.ParentProcessId).Path}} }
Wait-Job $job
$result =Receive-Job $job
Receive-Job
时我在命令行上看到以下错误:
Cannot find a process with the process identifier 528. At line:1 char:1 + $result =Receive-Job $job + ~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (528:Int32) [Get-Process], ProcessCommandException + FullyQualifiedErrorId : NoProcessFoundForGivenId,Microsoft.PowerShell.Commands.GetProcessCommand + PSComputerName : localhost
$result
对于
$null
:
> $null -eq $result
True
NoProcessFoundForGivenId
,这是不言自明的。如您所见,错误处理取决于您的代码如何被调用(作为 Job 或在 PowerShell 主机上)。
ParentProcessId
是否有效。因此,您必须将代码更改为:
Get-WmiObject win32_process | ForEach-Object {
# Create a custom object with the given properties. If Select-Object doesn't find given property it'll create an empty `NoteProperty` with the given name
$processInfo = $_ | Select-Object creationdate,ws,ProcessName,ProcessID,ParentProcessID, ParentProcessPath, ParentProcessName
$p = (Get-Process -Id $_.ParentProcessId -ErrorAction SilentlyContinue)
if ($null -ne $p){
# Parent process exists lets fill up the empty properties
$processInfo.ParentProcessName = $p.Name
$processInfo.ParentProcessPath = $p.Path
}
$processInfo # Return this value to the pipeline
}
$null
检入
Select-Object
的计算属性,不幸的是,我不知道。
$job = start-job -ScriptBlock { Get-WmiObject win32_process | ForEach-Object {
$processInfo = $_ | Select-Object creationdate,ws,ProcessName,ProcessID,ParentProcessID, ParentProcessPath, ParentProcessName
$p = (Get-Process -Id $_.ParentProcessId -ErrorAction SilentlyContinue)
if ($null -ne $p){
$processInfo.ParentProcessName = $p.Name
$processInfo.ParentProcessPath = $p.Path
}
$processInfo # Return this value to the pipeline
}
}
Wait-Job $job
$result = Receive-Job $job
if ($null -ne $result){
$result
}
else {
Write-Error "Job with id $($job.Id) failed"
}
关于powershell - 为什么通过 Invoke-Command 远程运行 Get-WmiObject 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57014402/
在我们的其中一台生产服务器上,我在运行脚本时开始出现错误。剥离代码,我在 PowerShell 提示符下运行此命令时收到错误: Get-WmiObject -Class win32_volume 结果
我有一个包含以下行的 Powershell 脚本: $package = Get-WmiObject -Class Win32_Product -ComputerName $TargetServer
我有以下代码行... get-wmiobject -class win32_computersystem | select-object username 它返回(用占位符编辑)...... @{us
在 PowerShell 中,您可以使用 Get-WmiObject cmdlet 来获取 WMI 类。 我注意到我只能访问 win32 classes ,我可以在 PowerShell 中访问除 w
下面的脚本成功地从我在 hostnames.txt 中提供的每台计算机上获取了制造商、型号、序列号和操作系统。但是,它很慢,因为它必须连接到每台计算机上的 WMI 三次。 $OS = Get-WmiO
我在Powershell中运行它 PS C:\>Get-WmiObject -query "select * from Win32_OptionalFeature where name = 'Rem
我正在尝试将计算机上已安装的应用程序列表放入列表框,到目前为止,我有以下内容: function programsinstalled_current { $prog = get-wmiobject w
我有一个PowerShell脚本,该脚本将从API中提取保修信息并将其保存到自定义WMI类。 然后,我会将这些数据带入RMM工具中,以便将其与我们的PSA解决方案同步,从而自动/更新保修终止日期以进行
我正在尝试使用Get-WmiObject检索特定驱动器的FreeSpace。 在我的计算机上使用Get-WmiObject Win32_logicaldisk返回以下内容: PS C:\Users\J
我运行一个执行许多 WMI 查询的脚本 - 但如果服务器不应答,则 cmdlet 会挂起。有什么办法可以让这个(或任何其他与此相关的 cmdlet)超时并在 X 秒过去后退出? 编辑 感谢 mjoli
我正在编写一个需要查询WMI的Windows python程序。我计划通过使用子进程模块使用我需要的参数调用 WMIC 来实现此目的。 我在网上看到很多通过 PowerShell 使用 WMI 的示例
我正在编写一个脚本来提取 RAM 信息。它当前导出接受的最大 Ram、Ram 插槽、安装的 Ram 棒、安装的总 RAM、计算机名称和登录用户。 我正在尝试将 speed 属性添加到输出文件中,但出于
我有一个命名空间,我想在代码中进一步针对它运行 Get-WmiObject 之前使用它来验证 WMI 对象的存在。例如,我想将 SSRS 2012 的命名空间扔给它,如果它在机器上不存在,那么我将尝试
我想将“GB”添加到“Size”的每个实例,以便每个输出显示“8GB”。我不确定如何将字符串添加或连接到表中的整数... 我试过简单地添加 +"GB",将 "GB"分配给变量,然后添加 + $GB。但
阅读后,我对这些之间的关系感到困惑。我不相信gwmi是 Get-WmiObject 的纯别名,因为它们在我见过的示例中似乎共享相似但不相同的语法。 有趣的是,当我自己用谷歌搜索“gwmi”时,所有 H
所以这是 powershell: $app = Get-WmiObject -Class SMS_UserApplicationRequest -Namespace root/SMS/site_sit
我知道 -List 获取 WMI 存储库命名空间中 WMI 类的名称,但我不太明白它在以下上下文中的含义: (Get-WmiObject -list Win32_ShadowCopy).Create(
可能是个愚蠢的问题,但我只是好奇。 在为 Win32_Product 类下的应用程序调用卸载时,Get-CIMInstance 和 Get-WMIObject 之间有区别吗?我问的唯一原因是因为: 使
Get-WMIObject Win32_CDROMdrive | Select MediaLoaded 告诉我CD驱动器中是否装有CD,做得非常好。它返回以下内容: 媒体加载 -----------
有没有办法指定 -Filter使用 WMI 查询语言 (WQL) 的 Get-WmiObject cmdlet 的参数,以根据用于调用进程的“命令行”进行过滤? “命令行”是指 Windows 任务管
我是一名优秀的程序员,十分优秀!