PS - 获取所有具有权限的 SMB 共享

问题描述 投票:0回答:2

我正在尝试获取 Windows 服务器上的所有 smb 共享及其所有用户权限,以进行库存检查。

这就是我所拥有的:

$Shares = Get-SmbShare

foreach($Share in $Shares)
{
    Get-SmbShareAccess -Name $Share.Name | Where-Object {$_.AccountName -Match "DOMAINNAME"} 
}

这让我获得所有域用户的共享以及他们拥有的访问权限。

但它只显示文件夹名称。我希望它能显示服务器上的完整路径(不是 UNC)

并且可以以 csv 格式导出。

当我这样做时:

$Shares = Get-SmbShare

foreach($Share in $Shares)
{
    Get-SmbShareAccess -Name $Share.Name | Where-Object {$_.AccountName -Match "PRAGUELOFTS"} | Export-Csv -Path C:\perms.csv
}

它仅导出最后一个用户。

windows powershell server acl
2个回答
2
投票

当您传递给

Select-Object
以下格式的哈希数组时,您可以非常精确地定义输出列:
@{name="xyz"; expr={ calculated value }}

通过这种方式,您可以将多个来源的值(例如“共享”和“共享访问”)以及手动计算的值统一为一个自定义结果。

Get-SmbShare | Where-Object Special -eq $false | ForEach-Object {
    $share = $_
    $share | Get-SmbShareAccess | Where-Object AccountName -Match "DOMAINNAME" | Select-Object @(
        @{name="UncPath";   expr={ "\\" + $env:COMPUTERNAME + "\" + $share.Name }}
        @{name="LocalPath"; expr={ $share.Path }}
        @{name="Account";   expr={ $_.AccountName }}
        @{name="Type";      expr={ $_.AccessControlType }}
        @{name="Right";     expr={ $_.AccessRight }}
    )
}

然后您可以继续将其通过管道传输到

Export-Csv -Path C:\perms.csv


至于你的第二个问题——这个

foreach ($Share in $Shares)
{
    Get-SmbShareAccess -Name $Share.Name | Export-Csv -Path C:\perms.csv
}

仅提供 CSV 文件中的最后结果,因为它的字面意思是“对于每个共享,编写一个 CSV 文件”。您在每次循环迭代中不断覆盖相同的文件。

先将所有结果收集到一个变量中

$results = foreach ($Share in $Shares) {
    # ...
}

然后然后创建输出文件

$results | Export-Csv -Path C:\perms.csv

0
投票

我的单服务器方法:

$daBears = "SERVERNAMEHERE"
$smbShares = Get-SMBShare -CimSession $daBears 
foreach($Share in $smbShares)
{
    Get-SmbShareAccess -Name $Share.Name -CimSession $daBears 
}
© www.soinside.com 2019 - 2024. All rights reserved.