【问题标题】:Property is empty when run through Invoke-Command通过 Invoke-Command 运行时属性为空
【发布时间】:2015-10-28 05:36:06
【问题描述】:

我正在尝试通过过滤掉在进程的CommandLine 属性中找到的字符串来单独监视具有多个自身实例的进程 (w3wp.exe) 的内存使用情况。

当我在本地运行此脚本时它可以工作:

$proc = (WmiObject Win32_Process -Filter "Name = 'w3wp.exe'" | Where-Object {$_.CommandLine -like "*SomeTextFromCl*"})
$id = $proc.ProcessId 
$ws = [math]::round((Get-Process -Id $id).WS/1MB)
Write-Host $ws

但是,当我尝试通过Invoke-Command 远程运行它时,我收到一条错误消息,指出Id 属性的值为空:

Cannot bind argument to parameter 'Id' because it is null.
+ CategoryInfo          : InvalidData: (:) [Get-Process], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.GetProcessCommand
+ PSComputerName        : RemoteServerName

我的Invoke-Command 语法是:

Invoke-Command -ComputerName RemoteServerName -FilePath script.ps1 -Credential $mycredential

我确信这很简单,但我在离开了很久之后又回到了 PS,我环顾四周,但找不到任何真正有用的东西。

【问题讨论】:

  • 您是否检查过远程计算机上的 WMI 调用实际上会导致返回任何内容?
  • 是的,它实际上返回了正确 w3wp.exe 实例的工作集。
  • 您是否正在运行 PowerShell v2 并且返回了多个进程? PowerShell v2 不支持使用语法 <array-var>.<property> 访问数组成员的属性。如果你只回显$proc,检查你得到什么输出。
  • 您连接的凭据与您在本地运行它时使用的用户相同吗?
  • 普通用户只能查看自己进程的CommandLine属性。此行为是设计使然。但是,作为远程​​主机上管理员组的成员,用户应该能够在远程主机上获取该信息。也许安全事件日志包含有关访问被拒绝/失败的原因的信息。

标签: powershell scripting monitoring invoke-command


【解决方案1】:

您正在将答案写入控制台。你使用 ps1 作为一个函数,所以你应该使用:

return $ws

而不是

write-host $ws

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多