2016-02-09 2 views
0

Я использую Powershell в Windows Server 2008 R2, и мне нужен постоянный пользователь, который получит владельца процесса с именем и фамилией от AD.Получить владельца процесса от AD

Вот сценарий написал с помощью Mathias R. Йессена

Import-Module ActiveDirectory 
$ProcessWithOwners = Get-WmiObject Win32_Process -Filter 'Name LIKE "vr[0-9]%"' |Select *,@{Name="Owner";Expression={$_.GetOwner().User}} 
foreach($Process in $ProcessWithOwners) 
{ 
    $Username = $Process.Owner 
    $ADUser = Get-ADUser -Filter "SamAccountName -eq '$Username'" -properties * 
    $a = new-object -comobject wscript.shell 
    $b = $a.popup(“Process name $($Process.Name) is run by user $($ADUser.DisplayName)“,0,“Warning”,1) 
} 

Но обычный пользователь не может получить доступ к владельцу процесса.

Есть ли способ решить эту проблему?

* Final Update *

Для выполнения этого сценария в качестве обычного пользователя, я сделал некоторые изменения:

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) 
 
{ 
 

 
$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

Извините, я забыл об этом)) Проблема в том, что Out-String возвращает массив и последний Write-Host возвращает пустую строку ... – user3301252

+0

'$ (Get-ADUser -Filter" SamAccountName -eq '$ user' "). DisplayName' –

ответ

0

Там нет оснований называть как gwmi Win32_ProcessиGet-Process когда все, что вам нужно, это просто Владелец.

можно сделать только с:

$CmdProcessWithOwners = Get-WmiObject Win32_Process -Filter 'Name LIKE "cmd%"' |Select *,@{Name="Owner";Expression={$_.GetOwner()}} 

Поскольку вы могли бы потенциально найти более одного процесса по вашим критериям, вы можете перебрать в цикле процесса (ов):

foreach($Process in $CmdProcessWithOwners) 
{ 
    # Grab the user name we added earlier 
    $Username = $Process.Owner.User 
    $Domain = $Process.Owner.Domain 

    $DisplayName = switch($Domain) 
    { 
     'DOMAINNAME' { 
      # Process owned by AD User, grab name from AD 
      Get-ADUser -Filter "SamAccountName -eq '$Username'" -Properties DisplayName |Select-Object -ExpandProperty DisplayName 
     } 
     $env:ComputerName { 
      # Process owned by local user, look up local account full name 
      [adsi]"WinNT://$($env:ComputerName)/$Username,user" |Select-Object -ExpandProperty FullName 
     } 
     default { 
      # Likely system or virtual account, default to DOMAIN\Username 
      "$Domain\$Username" 
     } 
    } 

    # Print it 
    Write-Host "Process $($Process.Name) with ID $($Process.Id) belongs to $DisplayName" 
} 
+0

Отлично, спасибо большое! Также должно быть «-properties *» в Get-ADuser – user3301252

+0

@ user3301252 Просто убедитесь, что вы выполняете '-Properties DisplayName', а не' * '. Вы не используете все свойства. Вам просто нужен тот, который вы не получите по умолчанию. – Matt

+0

Будьте осторожны, поскольку владелец процесса может быть локальной учетной записью - в этом случае Get-ADUser вернет (в лучшем случае) ничто или (в худшем случае) неправильное имя учетной записи (в случае, когда локальное имя пользователя совпадает с доменом имя пользователя). –