【发布时间】:2019-07-12 21:52:16
【问题描述】:
我正在尝试构建一个简单的“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}}
预期结果应该是进程列表及其相关信息,它在我的本地计算机上运行,并且在通过 Kansa.ps1 中的 Invoke-Command 远程运行时不返回任何数据(只是错误)
有人可以为我指明正确的方向吗?这里到底发生了什么,以及我该如何解决这个问题?
*请注意,此脚本是通过远程主机上的 WinRM(Invoke-Command)运行的,因此询问凭据是不可能的,硬编码凭据也是如此。
【问题讨论】:
-
你试过直接
Get-CimInstance -ComputerName吗?无需通过Invoke-Command参与 PowerShell 远程处理。 -
我会尝试使用明确指定的凭据在另一个作业中运行您的代码:
Invoke-Command { Start-Job { Get-WmiObject ... } -Credential ... } -Credential ...
标签: powershell invoke-command get-wmiobject