У меня странное поведение с форматным списком. Когда я вставляю следующий код прямо в оболочку - все работает как шарм:
@("Administrator","SomeUser","SomeOtherUser") |% {
$uname = $_;
$u = gwmi win32_useraccount |? { $_.Name –eq $uname }
if (-not $u) {
write-host ("[-] "+ $uname + " does not exist!")
} else {
write-host ("[+] "+ $uname + ":")
$u
}
}
@("Administrator","SomeUser","SomeOtherUser") |% {
$uname = $_;
gwmi win32_groupuser -computer . | select GroupComponent,PartComponent |? { $_.PartComponent -match ",Name=`""+$uname+"`""} | fl *
}
Однако, когда я помещаю один и тот же код в функцию, скажем, test и call test, PowerShell выдает ошибку о списке форматов. Не могу понять почему - может, искал не с того конца, но ничего не нашел.
function test {
@("Administrator","SomeUser","SomeOtherUser") |% {
$uname = $_;
$u = gwmi win32_useraccount |? { $_.Name –eq $uname }
if (-not $u) {
write-host ("[-] "+ $uname + " does not exist!")
} else {
write-host ("[+] "+ $uname + ":")
$u
}
}
@("Administrator","SomeUser","SomeOtherUser") |% {
$uname = $_;
gwmi win32_groupuser -computer . | select GroupComponent,PartComponent |? { $_.PartComponent -match ",Name=`""+$uname+"`""} | fl *
}
}
Отображаемое сообщение об ошибке:
out-lineoutput: объект типа «Microsoft.PowerShell.Commands.Internal.Format.FormatStartData» недействителен или находится в неправильной последовательности. Вероятно, это вызвано
указанная пользователем команда "список-форматов", которая конфликтует с форматированием по умолчанию.
+ CategoryInfo: InvalidData: (:) [out-lineoutput], InvalidOperationException
+ FullyQualifiedErrorId: ConsoleLineOutputOutOfSequencePacket, Microsoft.PowerShell.Commands.OutLineOutputCommand
Скриншот проблемы:
Предполагается, что функция возвращает один или несколько объектов, а не форматированные выходные данные (которые предназначены для хоста / экрана).
Другими словами, не используйте командлеты Format- * внутри функции
Просто удалить |fl *
из последнего оператора и перетащите вывод из test
вызов функции Format-List
вместо:
function test {
@("Administrator","SomeUser","SomeOtherUser") |% {
$uname = $_;
$u = gwmi win32_useraccount |? { $_.Name –eq $uname }
if (-not $u) {
write-host ("[-] "+ $uname + " does not exist!")
} else {
write-host ("[+] "+ $uname + ":")
$u
}
}
@("Administrator","SomeUser","SomeOtherUser") |% {
$uname = $_;
gwmi win32_groupuser -computer . | select GroupComponent,PartComponent |? { $_.PartComponent -match ",Name=`""+$uname+"`""}
}
}
test |fl *
В том же духе, по крайней мере, для написания повторно используемых функций:
%
, select
, gwmi
)Вам также может быть полезно использовать -Query
параметр с Get-WmiObject
, и пусть WMI выполняет фильтрацию вместо того, чтобы возвращать всех пользователей в PowerShell и затем фильтруя их
Get-WmiObject -Query "SELECT * FROM Win32_UserAccount WHERE Name = '$uname'"