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

问题描述 投票:0回答:1

我正在尝试将混合使用 PowerShell 和本机 Windows 可执行文件(例如

net.exe
sc.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

太棒了。

在脚本的两次迭代中,都需要管理权限,因为它涉及启用/禁用服务;以下所有命令均使用提升的/管理员 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 上搜索任何遇到同样问题的人,但似乎没有人遇到这种情况,所以我有点迷失。任何建议都会很有帮助,谢谢!

环境数据

PowerShell

$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
windows powershell service
1个回答
0
投票

注意:这不是完整的解释,提供的解决方法可能适合您,也可能不适合您:

  • 我在我的 Windows 11 22H2 机器上也看到了该症状。

  • sc.exe config "LxssManager" start=auto
    only 使用
    auto
    作为
    start=
    值 - 任何其他值也会导致访问被拒绝错误。

    • Set-Service
      同上,然而,尽管成功且值
      Automatic
      - 报告了一个虚假错误。 (所有其他启动类型都会导致 true 访问被拒绝错误,与
      sc.exe
      一样)
  • 交互式,通过

    services.msc
    ,尝试更改为任何不同的启动类型(包括
    Automatic
    )会导致(真正的)访问被拒绝错误。

  • 奇怪的是,与底层注册表项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LxssManager关联的

    权限
    中没有任何明显的内容,并且检查
    Administrators
    组的有效访问权限表明完全访问

    • 同样好奇的是,直接修改决定启动类型的注册表值,
      Start
      允许的。

通常,值得注意的是,某些服务的权限配置甚至不允许管理员进行“读取”访问。


解决方法

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

LsxxManager

服务。


    如果将启动类型设置为
  • Automatic

    是您需要的

    LsxxManager
    服务的唯一修改,则只要您确保脚本运行,您就可以简单地
    忽略
    Set-Service 报告的虚假错误原则上
    具有提升
    (作为管理员)。

  • 如果需要设置
  • 不同

    启动类型,直接修改底层注册表定义即可。

      注意:我不清楚服务管理器是否动态地接受此类更改,或者是否需要注销/重新启动。
    • Start

      注册表值的可能值为:

      0
      (启动)、
      1
      (系统)、
      2
      (自动)、
      3
      (手动,又名要求
      sc.exe
      )、
       4
      (已禁用),根据
      文档

    • 例如,以下命令将启动类型设置为
    • 4

      (禁用):

      # Requires elevation
      Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\LxssManager Start 4
      

      
      
© www.soinside.com 2019 - 2024. All rights reserved.