You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法内联编写这段PowerShell脚本?

问题描述

以下代码可正常运行:

$rule = new-object security.accesscontrol.filesystemaccessrule "LOCAL SERVICE", "read", allow
$path = "$($ENV:ALLUSERSPROFILE)\Microsoft\Crypto\Keys\$(([System.Security.Cryptography.X509Certificates.RSACertificateExtensions]::GetRSAPrivateKey($selfCert)).key.UniqueName)"
$permissions = Get-Acl -Path $path
$permissions.AddAccessRule($rule)
Set-Acl -Path $path -AclObject $permissions

以下代码无法运行:

$rule = new-object security.accesscontrol.filesystemaccessrule "LOCAL SERVICE", "read", allow
$path = "$($ENV:ALLUSERSPROFILE)\Microsoft\Crypto\Keys\$(([System.Security.Cryptography.X509Certificates.RSACertificateExtensions]::GetRSAPrivateKey($selfCert)).key.UniqueName)"
Set-Acl -Path $path -AclObject (Get-Acl -Path $path).AddAccessRule($rule)

报错信息:

Set-Acl : Cannot bind argument to parameter 'AclObject' because it is null. At C:\Users\me\Downloads\Self Signed Cert.ps1:64 char:32
+ ... Acl -Path $path -AclObject (Get-Acl -Path $path).AddAccessRule($rule)
+                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Set-Acl], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.SetAclCommand

请问为何不能像这样内联编写代码?


原因解释

问题核心在于AddAccessRule方法的特性:

  • AddAccessRule是.NET的无返回值(void)方法,它只会直接修改调用它的那个ACL对象本身,不会返回任何有效内容,在PowerShell中这类方法的执行结果为$null。
  • 内联写法里,你把(Get-Acl -Path $path).AddAccessRule($rule)的执行结果传给-AclObject参数,而这个结果是$null,不符合Set-Acl对该参数的非空要求,因此触发报错。

反观正常运行的写法:先将ACL对象存入变量$permissions,调用AddAccessRule修改变量内的对象(方法在原对象上执行修改操作),最后把修改后的完整ACL对象传给Set-Acl,完全符合参数要求。


内容的提问来源于stack exchange,提问作者Appleoddity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:37:39