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