Удаленный вывод из Get-SmbAccess - PullRequest
       52

Удаленный вывод из Get-SmbAccess

1 голос
/ 25 сентября 2019

У меня есть этот бит кода, я пытаюсь заставить работать сценарий:

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

Я хотел бы, чтобы он возвращал AccessRights, как если бы он был запущен локально - но это возвращает числа вместо текста,Как AccessRight '0', '2' и т. Д.

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

Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Поскольку «AccessRight» определен как «ScriptProperty», понятное имя вычисляется во время доступа.То есть PowerShell ищет его только при доступе к свойству (например, при построении вывода таблицы).Используйте 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 локально, прежде чем запускать их удаленно, чтобы принудительно загрузить необходимые определения:

Get-SmbShare | Out-Null

Invoke-Command -ComputerName 'RemoteServer' -ScriptBlock {
    Get-SmbShare | Get-SmbShareAccess
}
0 голосов
/ 25 сентября 2019

Почему бы вам не попробовать:

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

Примечание: Select-Object не является обязательным.Я использовал его, чтобы показать свойство PSComputerName, чтобы определить, какой компьютер обеспечивает вывод

enter image description here

Надеюсь, это поможет!

...