为何无法内联编写这段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
相关产品推荐
相关产品推荐

