Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 09.02.2015
Сообщений: 30

Узнать владельца процесса из AD

09.02.2016, 17:52. Показов 4310. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Помогите пожалуйста, не могу понять в чём ошибка.

Нужно определить владельца процесса и вывести его ФИО из AD.

Получился вот такой скрипт:

PowerShell
1
2
3
4
5
6
Import-Module ActiveDirectory
$owners = @{}
gwmi win32_process |% {$owners[$_.handle] = $_.getowner().user}
$user = get-process cmd* | select @{l="Owner";e={$owners[$_.id.tostring()]}} | Format-Table -HideTableHeaders| Out-String
Write-Host $user
Write-Host $(Get-Aduser -Filter {samaccountname -like "$user"} -properties *).Displayname
Write-Host $user выводит логин пользователя, но в следующей функции вставляется пустое значение....
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.02.2016, 17:52
Ответы с готовыми решениями:

Получить имя владельца процесса
Подскажите пожалуйста как можно узнать имя владельца процессора? Вот так я достаю сами процессы VOID PrintModuleList(HANDLE CONST...

Узнать владельца БД
Здравствуйте, уважаемые форумчане. Собственно возник вопрос: какими командами можно узнать/установить/сменить владельца БД в mysql? ...

Узнать владельца окна
Есть HWND окна. Как по этому HWND получить какой-либо уникальный идентификатор процесса это окно создавшего? Смотрел в сторону...

13
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
09.02.2016, 18:29
r1sh,

PowerShell
1
2
3
4
5
6
Import-Module ActiveDirectory
$owners = @{}
gwmi win32_process |% {$owners[$_.handle] = $_.getowner().user}
$user = (get-process calc* | select @{n="Owner";e={$owners[$_.id.tostring()]}}).Owner
Write-Host $user
Write-Host (Get-Aduser -Filter{SamAccountName -eq $user} -properties *).Displayname
0
0 / 0 / 0
Регистрация: 09.02.2015
Сообщений: 30
10.02.2016, 10:07  [ТС]
$user не имеет определения.


Немного изменил скрипт:

PowerShell
1
2
3
4
5
6
7
8
9
Import-Module ActiveDirectory
$CmdProcessWithOwners = Get-WmiObject Win32_Process -Filter 'Name LIKE "vr[0-9]%"' |Select *,@{Name="Owner";Expression={$_.GetOwner().User}}
 foreach($Process in $CmdProcessWithOwners)
 {
    $Username = $Process.Owner 
    $ADUser = Get-ADUser -Filter "SamAccountName -eq '$Username'" -properties *
    $a = new-object -comobject wscript.shell
    $b = $a.popup(“Консультант запущен с именем $($Process.Name) пользователем $($ADUser.DisplayName),0,“Внимание”,1)
 }
Но проблема в том, что рядовой пользователь не может получить владельца процесса....
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
10.02.2016, 11:08
Цитата Сообщение от r1sh Посмотреть сообщение
Но проблема в том, что рядовой пользователь не может получить владельца процесса
На клиентской машине (Win8) этот скрипт, запущенный с обычными правами, показывает владельцев процессов запущенных от имени других пользователей.

А вот если нужно найти на терминальном сервере всех владельцев запущенных Консультант+ клиентов, то да - нужны права администратора...

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$owners = @{}
gwmi win32_process |% {$owners[$_.handle] = $_.getowner().user}
 
foreach ($proc in (Get-Process -Name CONS | select ProcessName,Id,@{n="Owner";e={$owners[$_.id.tostring()]}}))
{
$user = $proc.Owner
Write-Host $proc.Id $proc.ProcessName
 
if ($proc.Owner)
{
    Write-Host 'Proccess owner:' $proc.Owner
    $ADUser = Get-Aduser -Filter{SamAccountName -eq $user} -properties *
    if ($ADUser) {Write-Host 'AD User:' $ADUser.Displayname}
    else {Write-Host 'Not found in AD'}
}
else {Write-Host 'Proccess owner not found!'}
}
Миниатюры
Узнать владельца процесса из AD  
0
0 / 0 / 0
Регистрация: 09.02.2015
Сообщений: 30
10.02.2016, 11:10  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
На клиентской машине (Win8) этот скрипт, запущенный с обычными правами, показывает владельцев процессов запущенных от имени других пользователей.
А вот если нужно найти на терминальном сервере всех владельцев запущенных Консультант+ клиентов, то да - нужны права администратора...
блин да значит дело в том что я на терминальном сервере запускаю...а там нельзя внутри скрипта выполнить команду с правами администратора вписав логин-пароль?))
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
10.02.2016, 11:14
Цитата Сообщение от r1sh Посмотреть сообщение
а там нельзя внутри скрипта выполнить команду с правами администратора вписав логин-пароль
Можно сам шелл (или в чём вы выполняете скрипт) запустить с правами администратора.
0
0 / 0 / 0
Регистрация: 09.02.2015
Сообщений: 30
10.02.2016, 11:19  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
Можно сам шелл (или в чём вы выполняете скрипт) запустить с правами администратора.
у каждого юзера?))
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
10.02.2016, 11:45
А вам надо это запускать в сессии каждого пользователя?

У Get-WmiObject есть ключ -Credential, но он не действует для локальной машины.

Вот например скрипт, который с рабочей станции пользователя, спросив пароль администратора терминального сервера, выведет информацию о всех cons.exe процессах:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$server = 'ts.mydomain.ru'
$cred = Get-Credential -Message "Введите пароль Администратора от $server" -UserName 'mydomain\admin'
 
foreach ($proc in (Get-WmiObject -Class win32_process -Filter{Caption='cons.exe'} -Credential $cred -ComputerName $server))
{
$user = $proc.getowner().user
Write-Host $proc.ProcessId $proc.ProcessName
 
if ($user)
{
    Write-Host 'Proccess owner:' $user
    $ADUser = Get-Aduser -Filter{SamAccountName -eq $user} -properties *
    if ($ADUser) {Write-Host 'AD User:' $ADUser.Displayname}
    else {Write-Host 'Not found in AD'}
}
else {Write-Host 'Proccess owner not found!'}
 
}
0
0 / 0 / 0
Регистрация: 09.02.2015
Сообщений: 30
10.02.2016, 13:48  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
Можно сам шелл (или в чём вы выполняете скрипт) запустить с правами администратора.
у каждого юзера?))
Цитата Сообщение от KDE777 Посмотреть сообщение
А вам надо это запускать в сессии каждого пользователя?
У Get-WmiObject есть ключ -Credential, но он не действует для локальной машины.
Вот например скрипт, который с рабочей станции пользователя, спросив пароль администратора терминального сервера, выведет информацию о всех cons.exe процессах:

блин...я хотел этот скрипт поставить на запуск вместо экзешника консультанта на терминале. Чтобы его запускали, он проверял запущен ли консультант у кого-то, если нет то запускал, если запущен то говорил бы название процесса и ФИО человека у которого запущен.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
10.02.2016, 13:55
Цитата Сообщение от r1sh Посмотреть сообщение
Чтобы его запускали, он проверял запущен ли консультант у кого-то, если нет то запускал, если запущен то говорил бы название процесса и ФИО человека у которого запущен.
А зачем это нужно? Терминальный сервер разве не для того и нужен, чтобы несколько пользователей могли работать с приложениями этого сервера - Консультант+, 1C, Word, Excel...
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
11.02.2016, 17:25
Цитата Сообщение от r1sh Посмотреть сообщение
Чтобы его запускали, он проверял запущен ли консультант у кого-то, если нет то запускал, если запущен то говорил бы название процесса и ФИО человека у которого запущен.
Нашёл способ, как на терминальном сервере с правами обычного пользователя, узнать владельца процесса из другого сеанса.

Поможет в этом консольная команда Query

1. Узнаём в какой сессии запущен процесс. При этом имя владельца обычному пользователю не покажут, но мы узнаем Id его сессии:

query process cons.exe

2. Через Id сессии узнаём её владельца:

query session 2

Вот набросок PS скрипта, как из этого получить имя AD пользователя:

PowerShell
1
2
3
4
5
$QueryProcess = query process cons.exe
$Id = ($QueryProcess[1] -replace ' +',' ').Trim().Split(' ')[3]
$QueryUser = query session $Id
$user = ($QueryUser[1] -replace ' +',' ').Trim().Split(' ')[1]
(Get-ADUser -Identity $user -Properties *).DisplayName
Миниатюры
Узнать владельца процесса из AD  
1
0 / 0 / 0
Регистрация: 09.02.2015
Сообщений: 30
09.03.2016, 18:04  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
Нашёл способ, как на терминальном сервере с правами обычного пользователя, узнать владельца процесса из другого сеанса.
Поможет в этом консольная команда Query
1. Узнаём в какой сессии запущен процесс. При этом имя владельца обычному пользователю не покажут, но мы узнаем Id его сессии:
query process cons.exe
2. Через Id сессии узнаём её владельца:
query session 2
Вот набросок PS скрипта, как из этого получить имя AD пользователя:
круто, то что нужно!!!

мой нынешний скрипт выглядит вот так:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Import-Module ActiveDirectory
#
# Скрытие окна консоли
#
Add-Type -Name win -MemberDefinition '[DllImport("user32.dll")] public static extern bool ShowWindow(int handle, int state);' -Namespace native
[native.win]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle,0)
#
# Получаем список процессов консультанта
#
$CmdProcessWithOwners = Get-WmiObject Win32_Process -Filter 'Name LIKE "vr[0-9]%"' |Select *,@{Name="Owner";Expression={$_.GetOwner().User}}
write-host $CmdProcessWithOwners
#
# Если хотя бы один процесс найден, то выводим его имя и владельца
#
if ($CmdProcessWithOwners -ne $null) {
 foreach($Process in $CmdProcessWithOwners)
 {
    $Username = $Process.Owner 
    Write-Host $Process.Owner 
    $ADUser = Get-ADUser -Filter "SamAccountName -eq '$Username'" -properties *
    $a = new-object -comobject wscript.shell
    $b = $a.popup(“Консультант запущен с именем $($Process.Name) пользователем $($ADUser.DisplayName),0,“Внимание”,1)
    Write-Host "Консультант запущен с именем $($Process.Name) пользователем $($ADUser.DisplayName)"
 }
}
#
# Если таких процессов нет, то запускаем консультанта
#
else
{
& 'D:\consultantplus\cons.exe' /adm /inet
}
Но сегодня столкнулся с проблемой, что процесс запущен, а имя владельца скрипт выводит пустое.....

Добавлено через 48 минут
Подредактировал скрипт, получается вот так:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Import-Module ActiveDirectory
#
# Скрытие окна консоли
#
Add-Type -Name win -MemberDefinition '[DllImport("user32.dll")] public static extern bool ShowWindow(int handle, int state);' -Namespace native
[native.win]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle,0)
#
# Получаем список процессов консультанта
#
$ConsProcess = Get-WmiObject Win32_Process -Filter 'Name LIKE "vr[0-9]%"' | Select *,@{Name="Owner";Expression={$_.GetOwner().User}}
#
# Если хотя бы один процесс найден, то выводим его имя и владельца
#
if ($ConsProcess -ne $null) {
 foreach($Process in $ConsProcess)
 {
#
# Получаем имя процесса, ID сессии, по нему ллогин владельца и его ищем в AD
#
$QueryProcess = query process $Process.ProcessName
$Id = ($QueryProcess[1] -replace ' +',' ').Trim().Split(' ')[2]
$QueryUser = query session $Id
$User = ($QueryUser[1] -replace ' +',' ').Trim().Split(' ')[1]
$ADUser = (Get-ADUser -Identity $User -Properties *).DisplayName
#
# Выдаём всплывающее окно с ответом
#
$a = new-object -comobject wscript.shell
$b = $a.popup(“Консультант запущен с именем $($Process.Name) пользователем $($ADUser),0,“Внимание”,1)
 }
}
#
# Если таких процессов нет, то запускаем консультанта
#
else
{
& 'D:\consultantplus\cons.exe' /adm /inet
}
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
09.03.2016, 18:13
Цитата Сообщение от r1sh Посмотреть сообщение
Но сегодня столкнулся с проблемой, что процесс запущен, а имя владельца скрипт выводит пустое....
Так мы уже выяснили, что без прав администратора на RDS-сервере, с помощью (Get-WmiObject Win32_Process) - владельца не узнать...

И я вам уже показал способ, как можно узнать владельца с обычными правами - для этого нужно парсить вывод (query process) + (query session):

PowerShell
1
2
3
4
5
6
7
8
9
10
11
if (gps | ? name -eq cons)
{
$QueryProcess = query process cons.exe
foreach ($str in $QueryProcess | ?{$_ -Like '*cons.exe'})
    {
    $Id = ($str -replace ' +',' ').Trim().Split(' ')[3]
    $QueryUser = query session $Id
    $user = ($QueryUser[1] -replace ' +',' ').Trim().Split(' ')[1]
    (Get-ADUser -Identity $user -Properties *).DisplayName
    }
}
1
0 / 0 / 0
Регистрация: 09.02.2015
Сообщений: 30
18.03.2016, 13:52  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
Так мы уже выяснили, что без прав администратора на RDS-сервере, с помощью (Get-WmiObject Win32_Process) - владельца не узнать...
И я вам уже показал способ, как можно узнать владельца с обычными правами - для этого нужно парсить вывод (query process) + (query session):
ааа точно)) совсем забыл, да теперь работает даже быстрее)) спасибо вам!)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.03.2016, 13:52
Помогаю со студенческими работами здесь

Узнать объекты владельца
Приветствую всех. Как получить список объектов, которыми владеет какой-то объект? TPanel Panel1 = new TPanel(this); TButton *btn1 = new...

Как узнать владельца файла?
Необходимо написать модуль для программы, который определяет владельца файла и если есть возможность историю кто работал с этим файлом?...

Как узнать IP владельца ящика?
Надо узнать ip где зарегистрировали почту. Ситуация такова - на одном сайте какая-то гнида завела анкету-клон анкеты моего друга и...

как узнать владельца почтовой базы?
Собственно сабж... не могу найти, видимо плохо ищу... :blink: зы: на Lotus Script

Как узнать контактные данные владельца сайта?
Добрый день уважаемые пользователи. У меня такая проблема: хочу зарегистрировать домен никах.рф. Но он уже занят, но сайт на данном домене...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru