我正在尝试将一个混合使用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
型
太好了
在脚本的两个迭代中,都需要管理权限,因为它涉及到启用/禁用服务;以下所有命令都使用提升的/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
型
1条答案
按热度按时间7gcisfzg1#
注意事项:这并不是一个完整的解释,提供的解决方法可能对你有用,也可能不适用;下面的所有命令都假设从一个 * 提升的 *(以管理员身份运行)会话执行:
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 docs4
(禁用):字符串