管理员:Windows PowerShell Set-Service生成拒绝访问,但sc.exe配置工作正常

sr4lhrrt  于 2023-11-21  发布在  Windows
关注(0)|答案(1)|浏览(159)

我正在尝试将一个混合使用PowerShell和本机Windows可执行文件(如net.exesc.exe)的脚本转换为只使用PowerShell命令,因为这样做似乎很简单,可以使脚本更一致,并允许幂等。
我遇到了一个问题。在以前版本的脚本中,它会执行以下操作:

sc.exe config "LxssManager" type= auto

字符串
这会将LxssManager服务设置为Automatic的启动类型。
但是,当将其更改为使用本机PowerShell cmdlet时,它将如下所示:

Set-Service -Name "LxssManager" -StartupType Automatic
# Same results with...
# Get-Service -Name "LxssManager" | Set-Service -StartupType Automatic


太好了
在脚本的两个迭代中,都需要管理权限,因为它涉及到启用/禁用服务;以下所有命令都使用提升的/Administrator PowerShell终端/会话运行。但是,我遇到了一个问题,使用sc.exe的上一个版本可以正常工作,而新的PowerShell版本(Set-Service)失败,并出现以下错误:

Set-Service : Service 'LxssManager (LxssManager)' description cannot be configured due to the following error: Access is denied
At line:1 char:35
+ Get-Service -Name "LxssManager" | Set-Service -StartupType Automatic
+                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (System.ServiceProcess.ServiceController:ServiceController) [Set-Service], ServiceCommandException
    + FullyQualifiedErrorId : CouldNotSetServiceDescription,Microsoft.PowerShell.Commands.SetServiceCommand


不过,在同一个PowerShell会话中,我可以毫无问题地执行以下操作:

> sc.exe config "LxssManager" start= auto
[SC] ChangeServiceConfig SUCCESS


我不明白,在相同的上下文中,执行或多或少应该是完全相同的操作时,我怎么会得到一个拒绝访问的错误,而且它也会成功。
我将脚本中的错误隔离到了这一行,但我不知道还能做些什么。我试着在SO/Google上搜索遇到同样问题的人,但似乎没有人遇到过这种情况,所以我有点困惑。任何建议都会很有帮助,谢谢!

环境数据

超级shell

$PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.22621.2428
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.22621.2428
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

操作系统信息

Microsoft Windows 11 Enterprise Version 10.0.22621 Build 22621, x64-based

7gcisfzg

7gcisfzg1#

注意事项:这并不是一个完整的解释,提供的解决方法可能对你有用,也可能不适用;下面的所有命令都假设从一个 * 提升的 *(以管理员身份运行)会话执行:

  • 我在我的Windows 11 22 H2机器上也看到了症状。
  • sc.exe config "LxssManager" start=auto * 仅 * 在auto作为start=值时工作-任何其他值也会导致访问拒绝错误。
  • Set-Service也是如此,但是,尽管Automatic值 * 成功 *,它还是报告了一个 * 虚假错误 *。(所有其他启动类型都会导致 true 访问被拒绝的错误,就像sc.exe一样)
    • 通过services.msc进行交互 *,尝试更改为 * 任何 * 不同的启动类型(包括Automatic)会导致(真正的)访问拒绝错误。
  • 奇怪的是,在与底层注册表项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LxssManager相关联的 * 权限 * 中没有任何明显的内容,并且检查Administrators组的有效访问权限表示 * 完全访问权限 *。
  • 同样奇怪的是,直接修改决定启动类型的注册表值Start * 是允许的。

通常,值得注意的是,某些服务的权限配置甚至拒绝了提升会话中管理员通过Get-Service进行的 * 读 * 访问。

解决方法

注意:我不清楚其他服务是否也会受到影响;解决方法只关注LsxxManager服务。

  • 如果将启动类型设置为Automatic是您需要对LsxxManager服务进行的唯一修改,那么您可以简单地忽略Set-Service报告的虚假错误,只要您确保脚本原则上以管理员身份运行。
  • 如果您需要设置一个 * 不同的 * 启动类型,请直接修改底层注册表定义。
  • 注意:我不清楚服务管理器是否动态地接收这样的更改,或者是否需要注销/重新启动。
  • Start注册表值的可能值为:0( Boot )、1(系统)、2(自动)、3(手动,也称为对sc.exe的要求)、4(禁用)、每the docs
  • 例如,以下命令将启动类型设置为4(禁用):
# Requires elevation
Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\LxssManager Start 4

字符串

相关问题