Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Список процессов на удаленной машине (http://forum.oszone.net/showthread.php?t=188363)

tarasov.evgeny 14-10-2010 16:45 1518854

Список процессов на удаленной машине
 
Добрый день.
Есть такой скрипт.
Код:

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 1519344

Цитата:

Цитата tarasov.evgeny
Не могу передать по конвейру в 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 1519662

Пытаюсь написать функцию
Код:

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 1519987

Цитата:

Цитата tarasov.evgeny
переменная $a (на втором этапе) пустая »

потому что она в фигурных скобках - локальная, определена только в пределах блока:
Код:

$pslist = Read-Host "Введите переменную\имя компьютера:"
$a = Get-QADComputer -Name $pslist
foreach ($1 in $a) {
...
}


tarasov.evgeny 19-10-2010 13:39 1522237

Пытаюсь сделать две вещи.
Проверить включен ли компьютер, если выключен - скинуть информацию в файл , что компьютер такой-то выключен.

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

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 1522834

Цитата:

Цитата tarasov.evgeny
Хотелось бы перенести данные за имя компьютера и получить только имя пользователя без домена и скобок. »

как-то так:
Код:

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}
  }
}

Цитата:

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

потому что Test-Connection (у меня такого нет, равно как и Get-QADComputer) проверяет один хост, а не список $pslist, поэтому он должен выполняться внутри блока ForEach (для каждого имени)

tarasov.evgeny 20-10-2010 13:10 1523043

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 1523184

Код:

Function GetProgramFiles{
  $pslist = Read-Host "Введите имя компьютера:"
  $a = Get-QADComputer -Name $pslist

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

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


Время: 22:30.

Время: 22:30.
© OSzone.net 2001-