我需要检查是否只有管理员组(sid:S-1-5-32-544)有权拥有文件或文件夹的所有权(SeTakeOwnershipPrivilege)。
如何获得具有此权限的所有用户/组的概览?
我已经找到并尝试了以下命令:
secedit /export /areas USER_RIGHTS /cfg output.txt
文件中的输出看起来非常有用:
[Unicode]
Unicode=yes
[特权]
SeNetworkLogonRight = *S-1-5-32-544
...
SeTakeOwnershipPrivilege = *S-1-5-32-544
...
[版本]
signature="$CHICAGO$"
Revision=1
使用上述方法,我必须将文件读入我的 Powershell 脚本,搜索权限,然后删除该文件。
有没有其他方法可以在 Powershell 中执行此操作而无需外部模块或可执行文件?
谢谢你的供应。
干杯
大卫
答案1
还有另一种方法,使用枚举帐户WithUserRightWin32 API 函数。这必须用 C# 进行编码(调用) 在您的脚本中,代码定义会非常长且混乱。
我会避免上述情况,而是包装可执行文件。为什么要重新发明轮子呢?
# Check this priviledge.
$privilege = 'SeDenyInteractiveLogonRight'
# Create temp file for executable output.
$tempFile = [System.IO.Path]::GetTempFileName()
# Run the executable and wait for it to finish.
Start-Process -FilePath secedit.exe -ArgumentList "/export /areas USER_RIGHTS /cfg $tempFile" -Wait -WindowStyle Hidden
# Run through lines in the output file.
Get-Content $tempFile -Encoding Unicode | Where-Object {
# Where the privilege is listed.
$_ -match $privilege } | ForEach-Object {
# Seperate the key and values.
$_.split('=')[1].split(',') | ForEach-Object {
# Ouput the user/SID values
$_.trim()
}
}
答案2
虽然不是一个纯粹的 PS 解决方案,但仍然是一个选择。:)
您可以使用 Microsoft 的 AccessChk 实用程序(点击下载) 而不是 SecEdit。
与 SecEdit 不同,AccessChk 输出到标准输出,因此您可以轻松地将其输出捕获到 PS 变量中,然后检查该变量(无需中间文件)。
就像是:
$privToCheckFor = "SeTakeOwnershipPrivilege"
$groupPrivs = .\accesschk -a administrators *
if ((Out-String -InputObject $groupPrivs).IndexOf($privToCheckFor) -ge 0) {
Write-Host "Has Privilege"
} else {
Write-Host "Doesn't Have Privilege"
}
答案3
答案4
解决方案如下:
(Get-WmiObject -Namespace root\rsop\computer -Class RSOP_UserPrivilegeRight | Where-Object {$_.UserRight -eq "SeTakeOwnershipPrivilege"}).AccountList