我正在尝试将混合使用 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 上搜索任何遇到同样问题的人,但似乎没有人遇到这种情况,所以我有点迷失。任何建议都会很有帮助,谢谢!
$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 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
报告的虚假错误原则上具有提升(作为管理员)。
启动类型,直接修改底层注册表定义即可。