Get-SmbAccess 的远程输出

Remote output from Get-SmbAccess

我有这个代码位,我正在尝试在脚本中工作:

$computers = Get-ADComputer -Filter *  | Select-Object -ExpandProperty Name
$results = Invoke-Command -ComputerName $computers -ScriptBlock {Get-SmbShare | Get-SmbShareAccess}

我希望 return AccessRights 就好像是 运行 本地一样 - 但是这个 return 数字而不是文本。如访问权限'0'、'2'等

Name     AccountName                      AccessRight
----     -----------                      -----------
IPC$     BUILTIN\Administrators                     0
IPC$     BUILTIN\Backup Operators                   0
IPC$     NT AUTHORITY\INTERACTIVE                   0

我该如何解决这个问题?

你为什么不试试:

$computers = (Get-ADComputer -Filter *).Name
$result = Get-SmbShare -CimSession $computers | Get-SmbShareAccess | Select-Object -Property Name, AccountName, AccessControlType, AccessRight, PSComputerName

注意:Select-对象是可选的。我用它来显示 PSComputerName 属性,以便识别哪台计算机提供输出

希望对您有所帮助!

由于 'AccessRight' 被定义为 'ScriptProperty',因此在访问时计算友好名称。也就是说,PowerShell 仅在您访问 属性 时查找它(例如,在构建 table 输出时)。使用Get-Member看定义:

Get-SmbShare | Get-SmbShareAccess | Get-Member | Format-List *

TypeName   : Microsoft.Management.Infrastructure.CimInstance#ROOT/Microsoft/Windows/Smb/MSFT_SmbShareAccessControlEntry
Name       : AccessRight
MemberType : ScriptProperty
Definition : System.Object AccessRight {get=[Microsoft.PowerShell.Cmdletization.GeneratedTypes.SmbShare.ShareAccessRight] 
             ($this.PSBase.CimInstanceProperties['AccessRight'].Value);}

由于进行远程调用时默认情况下不会在本地加载转换它所需的信息,PowerShell 只能显示原始整数值:

TypeName   : Microsoft.Management.Infrastructure.CimInstance#ROOT/Microsoft/Windows/SMB/MSFT_SmbShareAccessControlEntry
Name       : AccessRight
MemberType : Property
Definition : uint32 AccessRight {get;}

您可以自己编写一些代码来转换它(比如另一个计算的 属性),或者快速修改 运行 SMB cmdlet 在 运行 之前本地化它们远程强制加载必要的定义:

Get-SmbShare | Out-Null

Invoke-Command -ComputerName 'RemoteServer' -ScriptBlock {
    Get-SmbShare | Get-SmbShareAccess
}