在PowerShell脚本中运行quser.exe在IDE中有效,但在作为服务运行时无效

在PowerShell脚本中运行quser.exe在IDE中有效,但在作为服务运行时无效,powershell,cmd,windows-services,windows-console,Powershell,Cmd,Windows Services,Windows Console,如果我在控制台窗口或ISE中运行以下代码段,它将按预期工作,列出本地计算机上的活动用户会话: (调用表达式“$env:windir\system32\quser.exe”)-替换“\s{2,}”,“convertfromcsv” 不幸的是,这不是控制台应用程序,而是作为服务安装的PowerShell脚本。该服务作为LocalSystem(而不是LocalService)运行。当服务尝试运行此代码时,会输出以下错误: 术语“C:\Windows\system32\quser.exe”无法识别为cm

如果我在控制台窗口或ISE中运行以下代码段,它将按预期工作,列出本地计算机上的活动用户会话:

(调用表达式“$env:windir\system32\quser.exe”)-替换“\s{2,}”,“convertfromcsv”

不幸的是,这不是控制台应用程序,而是作为服务安装的PowerShell脚本。该服务作为LocalSystem(而不是LocalService)运行。当服务尝试运行此代码时,会输出以下错误:

术语“C:\Windows\system32\quser.exe”无法识别为cmdlet、函数、脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。

我联系了Sapien支持部门,得知服务运行时没有配置文件,并且没有对系统文件夹的执行权限。您需要授予服务帐户对exe及其支持DLL的执行权限,并使用exe的完整路径

我已经证明(我认为)安全负责人可以访问quser。我使用PSExen打开了一个作为LocalSystem运行的PowerShell控制台,并成功运行了quser应用程序:

问题一定是我是作为服务运行的。有人知道我如何在服务中访问/使用QUser吗


我想真正的问题是,作为LocalSystem运行的服务如何执行系统文件夹中的应用程序?

我的猜测是,作为服务运行PowerShell脚本所使用的任何工具都是32位的,并且
C:\Windows\SysWOW64
中没有
quser.exe

如果是这种情况,您可以在64位操作系统上运行
C:\Windows\Sysnative\quser.exe
(有关详细信息,请参阅文档中的)


如果是这样的话,我会说您得到的信息(“服务运行时没有配置文件,并且没有对系统文件夹的执行访问权限”)是不正确的。

我猜,无论您使用什么工具作为服务运行PowerShell脚本,都是32位的,而且
C:\Windows\SysWOW64
中没有
quser.exe

如果是这种情况,您可以在64位操作系统上运行
C:\Windows\Sysnative\quser.exe
(有关详细信息,请参阅文档中的)


如果是这种情况,我会说您获得的信息(“服务运行时没有配置文件,并且没有对系统文件夹的执行访问权限”)根本不正确。

cmdlet“New-ServiceEvent”从何而来?我怀疑它没有运行quser命令,或者在服务凭据下找不到指向它的路径。我将向函数中添加一个转录本(开始转录本/停止转录本),以便您可以看到它出错的地方。
New ServiceEvent
是脚本中其他地方的一个日志函数,它工作正常并记录错误
无法将参数绑定到参数“Message”,因为它是一个空字符串。
。问题是,
$QUserToStringOutput
为空。这意味着这不起作用:
$QUserToStringOutput=cmd.exe/C$Env:SystemRoot\System32\quser.exe 2>$null
如果您添加一个成绩单,它会告诉您在尝试“$QUserToStringOutput=”行时发生了什么,就像您在控制台中运行它一样。你也试过“$QUserToStringOutput=&quser.exe”吗?很抱歉,我应该说,这是一个很好的建议:)我刚刚在做。我试过
&quser.exe
,它说找不到。然后我尝试了
$QUserToStringOutput=&$ENV:SystemRoot\System32\quser.exe 2>$null
,返回
术语“C:\Windows\System32\quser.exe”无法识别为cmdlet、函数、脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。
。我有点不明白为什么这在服务中不起作用,但在ISE/console中起作用?cmdlet“New-ServiceEvent”从何而来?我怀疑它没有运行quser命令,或者在服务凭据下找不到指向它的路径。我将向函数中添加一个转录本(开始转录本/停止转录本),以便您可以看到它出错的地方。
New ServiceEvent
是脚本中其他地方的一个日志函数,它工作正常并记录错误
无法将参数绑定到参数“Message”,因为它是一个空字符串。
。问题是,
$QUserToStringOutput
为空。这意味着这不起作用:
$QUserToStringOutput=cmd.exe/C$Env:SystemRoot\System32\quser.exe 2>$null
如果您添加一个成绩单,它会告诉您在尝试“$QUserToStringOutput=”行时发生了什么,就像您在控制台中运行它一样。你也试过“$QUserToStringOutput=&quser.exe”吗?很抱歉,我应该说,这是一个很好的建议:)我刚刚在做。我试过
&quser.exe
,它说找不到。然后我尝试了
$QUserToStringOutput=&$ENV:SystemRoot\System32\quser.exe 2>$null
,返回
术语“C:\Windows\System32\quser.exe”无法识别为cmdlet、函数、脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。
。我有点不明白为什么这在服务中不起作用,但在ISE/控制台中起作用?我感到非常尴尬。。。我不知道这是一件事(我只在注册表中识别出32/64分离)。我的服务是32位的(按设计),我正在测试/开发的系统是64位的;所以你可能是对的。有趣的是,我可以在System32中找到quser,但在SysWOW64中找不到
Sysnative
对我来说不存在。我正在阅读您现在提供的链接,
Sysnative
名称在WoW中是“虚拟的”(64位Windows中的32位仿真器)。试试openin