Powershell 测试帐户是否具有对路径的写访问权限

Powershell 测试帐户是否具有对路径的写访问权限,powershell,acl,Powershell,Acl,是否有可靠的方法来测试帐户(用户或计算机广告帐户)是否可以使用不依赖第三方二进制文件的PowerShell访问文件夹 AccessChk正是我所需要的。 我可以在它周围放一个PS包装器函数,但我希望有一个不需要捆绑二进制文件的解决方案 它还报告文件夹的内容权限,而不是给定目录的权限。这很容易解决,但并不理想 我见过使用获取ACL然后比较标识引用值的解决方案。。。但是 仅当帐户具有显式权限时才有效;如果是通过团体成员身份,就不会 您还必须考虑继承的权限,allowvsdeny,并确保文件系

是否有可靠的方法来测试帐户(用户或计算机广告帐户)是否可以使用不依赖第三方二进制文件的PowerShell访问文件夹

  • AccessChk
    正是我所需要的。
    • 我可以在它周围放一个PS包装器函数,但我希望有一个不需要捆绑二进制文件的解决方案
    • 它还报告文件夹的内容权限,而不是给定目录的权限。这很容易解决,但并不理想
  • 我见过使用
    获取ACL
    然后比较
    标识引用
    值的解决方案。。。但是
    • 仅当帐户具有显式权限时才有效;如果是通过团体成员身份,就不会
    • 您还必须考虑继承的权限,
      allow
      vs
      deny
      ,并确保文件系统权限与所需的访问权限相匹配
  • 这些包括NTFS权限,但不考虑共享权限;尽管两者都会影响访问
  • 一个常见的方法是尝试执行您正在测试权限的操作,并说如果它工作正常;但这需要有账户的凭证

AccessChk的示例包装器
功能测试文件访问{
[CmdletBinding()]
Param(
[参数()]
[string]$Account=“$($env:USERDOMAIN)\$($env:USERNAME)”
,
[参数()]
[字符串]$Path='。'
,
[参数(必需=$true)]
[string]$ItemName#必需,因为AccessChk列出内容权限,而不是根路径权限
,
[参数()]
[string]$PathToAccessChk='AccessChk.exe'#如果AccessChk位于$env:Path中,则一切正常;如果不是,则提供exe的完整路径
,
[参数()]
[开关]$Read
,
[参数()]
[开关]$Write
)
过程{
$result=$false
$accessTest='*'+('R'|?{$Read.IsPresent})+('W'|?{$Write.IsPresent})+'*'
$pth=(解析路径$Path).Path
$itemPth=连接路径-Path$pth-ChildPath$ItemName
$rgx='^(?\S*)\S*{0}\S*$'-f[System.Text.RegularExpressions.Regex]::转义($itemPth)
foreach((.$PathToAccessChk-accepteula-q$Account$Path)中的行)拆分“[\r\n]+\s*”){
如果($line-匹配$rgx){
$result=($matches['permission']-如$accessTest)
打破
}
}
$result
}
}

什么。。。你的问题是什么?:)您已经确定
accesschk.exe
可以执行此任务,并且您有一个工作包装器。他们正在询问是否存在用于此任务的本机Powershell方法,而不依赖于可执行文件。谢谢大家-正如@BendertheGreatest所说,我希望得到的东西不依赖于第三方exe。我已经更新了这个问题,让它更清晰;然而,这似乎使用了
IdentityReference
方法,这对于显式访问很好,但是如果用户由于是组的成员而被授予访问权限,或者因为他们的SIDHistory包含具有访问权限的帐户的SID等等,那么这就不起作用了。。。你的问题是什么?:)您已经确定
accesschk.exe
可以执行此任务,并且您有一个工作包装器。他们正在询问是否存在用于此任务的本机Powershell方法,而不依赖于可执行文件。谢谢大家-正如@BendertheGreatest所说,我希望得到的东西不依赖于第三方exe。我已经更新了这个问题,让它更清晰;但是,这似乎使用了
IdentityReference
方法,这对于显式访问很好,但是如果用户由于是组的成员而被授予访问权限,或者因为他们的SIDHistory包含具有访问权限的帐户的SID等,则不起作用。
Function Test-FileAccess {
    [CmdletBinding()]
    Param (
        [Parameter()]
        [string]$Account = "$($env:USERDOMAIN)\$($env:USERNAME)"
        ,
        [Parameter()]
        [string]$Path = '.'
        ,
        [Parameter(Mandatory = $true)]
        [string]$ItemName # required since AccessChk lists permissions on contents, not on the root path
        ,
        [Parameter()]
        [string]$PathToAccessChk = 'AccessChk.exe' # if AccessChk is in $env:Path all's good; if not provide the full path to the exe
        ,
        [Parameter()]
        [switch]$Read
        ,
        [Parameter()]
        [switch]$Write
    )
    Process {
        $result = $false
        $accessTest = '*' + ('R' | ?{$Read.IsPresent}) + ('W' | ?{$Write.IsPresent}) + '*'
        $pth = (Resolve-Path $Path).Path 
        $itemPth = Join-Path -Path $pth -ChildPath $ItemName
        $rgx = '^(?<permission>\S*)\s*{0}\s*$' -f [System.Text.RegularExpressions.Regex]::Escape($itemPth)
        foreach($line in (. $PathToAccessChk -accepteula -q $Account $Path) -split '[\r\n]+\s*') {
            if ($line -match $rgx) {
                $result = ($matches['permission'] -like $accessTest)
                break;
            }
        }
        $result
    }
}