PDA

Показать полную графическую версию : [решено] Список процессов на удаленной машине


tarasov.evgeny
14-10-2010, 16:45
Добрый день.
Есть такой скрипт.

Add-PSSnapin Quest.ActiveRoles.ADManagement
$pslist = Get-QADComputer -name cl-ru-cla*
foreach ($1 in $pslist) {Write-host $1.name; Get-WmiObject -Class win32_process -ComputerName $1.name |
Select-Object path,name | Where-Object -FilterScript {$_.path -notlike "c:\windows*"} | Where-Object -FilterScript {$_.path -notlike "c:\Program files\*"}}

В результате получаем:

CL-RU-CL*(#имя компьютера)
System Idle Process
System
C:\AdminSMSecr\Scripts\BlockProcess.exe BlockProcess.exe
C:\Documents and Settings\petrova.olga\Application Data\QipGuard\QipGuard.exe QipGuard.exe
C:\PROGRA~1\MICROS~2\Office12\OUTLOOK.EXE OUTLOOK.EXE
C:\Office\MSACCESS.EXE MSACCESS.EXE


Не могу передать по конвейру в out-file

amel27
15-10-2010, 10:19
Не могу передать по конвейру в out-file »
foreach ($1 in $pslist) {
Write-host $1.name; Get-WmiObject -Class win32_process -ComputerName $1.name |
Select-Object path,name |
Where-Object -FilterScript {$_.path -notlike "c:\windows*"} |
Where-Object -FilterScript {$_.path -notlike "c:\Program files\*"} |
Out-File -FilePath "C:\out.txt" -Append
}

tarasov.evgeny
15-10-2010, 18:40
Пытаюсь написать функцию
Function Mytest {
$pslist = Read-Host "Введите переменную\имя компьютера:"
Get-QADComputer -Name $pslist | Select-Object name}
Далее хочу передать вывод в другую часть кода:
Function Mytest2 {
$pslist = Read-Host "Введите переменную\имя компьютера:"
$a = Get-QADComputer -Name $pslist | Select-Object name}
И эту переменную подставить в:
foreach ($1 in $a) {
Write-host $1.name; Get-WmiObject -Class win32_process -ComputerName $1.name |
Select-Object path,name |
Where-Object -FilterScript {$_.path -notlike "c:\windows*"} |
Where-Object -FilterScript {$_.path -notlike "c:\Program files\*"} |
Out-File -FilePath "C:\out.txt" -Append
}
Но переменная $a (на втором этапе) пустая
т.е. мне нужно полученный результат передать в другой массив, чтобы его перебрать командой foreach

amel27
16-10-2010, 11:20
переменная $a (на втором этапе) пустая »
потому что она в фигурных скобках - локальная, определена только в пределах блока:
$pslist = Read-Host "Введите переменную\имя компьютера:"
$a = Get-QADComputer -Name $pslist
foreach ($1 in $a) {
...
}

tarasov.evgeny
19-10-2010, 13:39
Пытаюсь сделать две вещи.
Проверить включен ли компьютер, если выключен - скинуть информацию в файл , что компьютер такой-то выключен.

Пытаюсь показать каждого пользователя на компьютере.
Вот такой скрипт показывает пользователей

Function GetProgramFiles {
$pslist = Read-Host "Введите имя компьютера"
$a = Get-QADComputer -Name $pslist
#foreach ($1 in $a) {Get-WmiObject -Class Win32_ComputerSystem -ComputerName $1.name | Select-Object Username};
foreach ($1 in $a) {$1.name;Get-WmiObject -Class Win32_ComputerSystem -ComputerName $1.name | Select-Object Username;
Get-WmiObject -Class win32_process -ComputerName $1.name |
Select-Object path,name |
Where-Object -FilterScript {$_.path -notlike "c:\windows*"} |
Where-Object -FilterScript {$_.path -notlike "c:\Program Files*"} |
Where-Object -FilterScript {$_.path -notlike "c:\PROGRA~1\*"} |
Format-Table -wrap }
Write-Host "Done"}

Вот результат. Как видите информация есть, но сначала отображается список пользователей, а затем список процессов, на компьютерах.
Хотелось бы перенести данные за имя компьютера и получить только имя пользователя без домена и скобок.
Странно в функции foreach идет сначала имя компьютера - $1.name, затем значение Username и потом уже показывается список процессов. А в выводе получается:
список пользователей, затем имя и список процессов.

PS > GetProgramFiles
@{Username=domen\fedya}
@{Username=domen\natasha}
...
computer1
Path name
---- ----
System Idle Process
System


computer2
Path name
---- ----
System Idle Process
System
...


вторая функция запихнута в if, но не работает с массивом, а только с одним значением:

Function GetProgramFiles2 {
$pslist = Read-Host "Введите имя компьютера. "
IF (Test-Connection $pslist -Count 2 -Delay 2 -Quiet)
{
$a = Get-QADComputer -Name $pslist
foreach ($1 in $a) {$1.name; Get-WmiObject -Class win32_process -ComputerName $1.name |
Select-Object path,name |
Where-Object -FilterScript {$_.path -notlike "c:\windows*"} |
Where-Object -FilterScript {$_.path -notlike "c:\Program Files*"} |
Where-Object -FilterScript {$_.path -notlike "c:\PROGRA~1\*"} |
Where-Object -FilterScript {$_.path -notlike "C:\CRMCatpro\Office\MSACCESS.EXE"} |
Where-Object -FilterScript {$_.path -notlike "C:\AdminSMSecr\Scripts\BlockProcess.exe"} | Format-Table -wrap }
Write-Host "Done"}
Else {"Компьютер выключен"}}

amel27
20-10-2010, 08:55
Хотелось бы перенести данные за имя компьютера и получить только имя пользователя без домена и скобок. »как-то так:
Function GetProgramFiles{
$pslist = Read-Host "Введите имя компьютера:"
$a = Get-QADComputer -Name $pslist

ForEach ($1 in $a) {
"---------------------"
"Computer: " + $1.name
Get-WmiObject Win32_ComputerSystem -ComputerName $1.name |
ForEach-Object {"UserName: " + [regex]::replace($_.UserName,".*\\","")}
"---------------------"
Get-WmiObject Win32_Process -ComputerName $1.name |
Where-Object {($_.path -notlike "c:\windows\*")`
-and ($_.path -notlike "c:\Program Files\*")`
-and ($_.path -notlike "c:\PROGRA~1\*")} |
ForEach-Object {$_.Name}
}
}
вторая функция запихнута в if, но не работает с массивом, а только с одним значением »потому что Test-Connection (у меня такого нет, равно как и Get-QADComputer) проверяет один хост, а не список $pslist, поэтому он должен выполняться внутри блока ForEach (для каждого имени)

tarasov.evgeny
20-10-2010, 13:10
amel27, спасибо огромное
Ваш скрипт не работает пока у меня, но в нем есть информация как можно форматировать вывод. Чуть позже буду совмещать ваш скрипт, со скриптом ниже. Ошибку тоже скину...
по поводу того, что test-connection нужно запихнуть во внутрь - меня сегодня ночью осенило, но не успел написать.

Function GetProgramFiles2 {
$pslist = Read-Host "Введите имя компьютера."
$a = Get-QADComputer -Name $pslist
foreach ($1 in $a)
{IF (Test-Connection $1.name -Count 2 -Delay 2 -Quiet)
{
"---------------------------------"
"Computer: " + $1.name
Get-WmiObject Win32_ComputerSystem -ComputerName $1.name |
ForEach-Object {"UserName: " + [regex]::replace($_.UserName,".*\\","")}
"---------------------------------"
Get-WmiObject -Class win32_process -ComputerName $1.name |
Select-Object path,name |
Where-Object -FilterScript {$_.path -notlike "c:\windows*"} |
Where-Object -FilterScript {$_.path -notlike "c:\Program Files*"} |
Where-Object -FilterScript {$_.path -notlike "c:\PROGRA~1\*"} |
Where-Object -FilterScript {$_.Name -ne "System Idle Process"} |
Where-Object -FilterScript {$_.Name -ne "System"} |
Format-Table -wrap }
Else {
"---------------------------------"
"Computer " + $1.name + " turn off:"
"---------------------------------"}}}

Я понимаю, почему у вас нет QADComputer - это не стандартная штука. Вот ссылка:
http://www.quest.com/powershell/activeroles-server.aspx
Странно, что у вас нет Test-Connection. Я думал это стандартная функция. У меня Windows XP стоит и она есть. Дома есть Win7 - там тоже есть

tarasov.evgeny
20-10-2010, 15:44
Function GetProgramFiles{
$pslist = Read-Host "Введите имя компьютера:"
$a = Get-QADComputer -Name $pslist

ForEach-Object ($1 in $a) {
"---------------------"
.....

Поскольку мы ничего не передаем по конвейру то нужна команда foreach




© OSzone.net 2001-2012