2014-02-04 2 views
0

Я пытаюсь получить членов группы безопасности AD и перечислить их имя учетной записи, имя, фамилию и дату последнего входа.Получение вложенных элементов группы безопасности AD

Это сценарий, я в настоящее время

# Function get-NestedMembers 
# List the members of a group including all nested members of subgroups 

function get-NestedMembers ($group){ 
    if ($group.objectclass[1] -eq 'group') { 
     write-verbose "Group $($group.cn)" 
    $Group.member |% { 
     $de = new-object directoryservices.directoryentry("LDAP://$_") 
     if ($de.objectclass[1] -eq 'group') { 
     get-NestedMembers $de 
     } 
     Else { 
     $de.sAMAccountName 
     } 
    } 
    } 
    Else { 
    Throw "$group is not a group" 
    } 
} 

# get-NestedMembers usage examples : 

# get a group 

$group = new-object directoryservices.directoryentry("LDAP://CN="group name",OU=folder,OU=Citrix,OU=Applications,DC=xx,DC=xx,DC=xx,DC=com") 

# Get all nested members 

get-NestedMembers $group 

Как изменить его, чтобы получить также фамилия, имя и дата последнего входа в систему? В настоящее время он отображает только имя учетной записи (sAMAccountName).

Большое спасибо за любую помощь.

Редактировать

Этот скрипт работает для меня. Просто отредактируйте строку 26 с адресом LDAP группы, которую вы хотите отсканировать.

# Function get-NestedMembers 
# List the members of a group including all nested members of subgroups 

Import-Module ActiveDirectory 

function get-NestedMembers ($group){ 
    if ($group.objectclass[1] -eq 'group') { 
     write-verbose "Group $($group.cn)" 
    $Group.member |% { 
     $de = new-object directoryservices.directoryentry("LDAP://$_") 
     if ($de.objectclass[1] -eq 'group') { 
     get-NestedMembers $de 
     } 
     Else { 
     $de 
     } 
    } 
    } 
    Else { 
    Throw "$group is not a group" 
    } 
} 

# get a group 

$group = new-object directoryservices.directoryentry("LDAP://CN=GroupName,OU=Groups,OU=File Servers,OU=Applications,DC=contoso,DC=com") 

# Get all nested members 

get-NestedMembers $group|FT @{l="First Name";e={$_.givenName}},@{l="Last Name";e={$_.sn}},@{l="Last Logon";e={[datetime]::FromFileTime($_.ConvertLargeIntegerToInt64($_.lastLogonTimestamp[0]))}},sAMAccountName 

Выход выглядит следующим образом:

First Name   Last Name   Last Logon    sAMAccountName 
----------   ---------   ----------    -------------- 
Name     Surname    10.11.2014 14:58:02  {accname} 
Name     Surname    17.11.2014 19:11:15  {accname} 
Name     Surname    07.11.2014 15:38:57  {accname} 
Name     Surname    14.11.2014 03:50:03  {accname} 
Name     Surname    16.11.2014 21:30:15  {accname} 

ответ

1

Посмотрите, как это поражает ваше воображение ...

function get-NestedMembers ($group){ 
    if ($group.objectclass[1] -eq 'group') { 
     write-verbose "Group $($group.cn)" 
    $Group.member |% { 
     $de = new-object directoryservices.directoryentry("LDAP://$_") 
     if ($de.objectclass[1] -eq 'group') { 
     "get-NestedMembers $de" 
     } 
     Else { 
     $de 
     } 
    } 
    } 
    Else { 
    Throw "$group is not a group" 
    } 
} 

# get-NestedMembers usage examples : 

# get a group 

$group = new-object directoryservices.directoryentry("LDAP://CN="group name",OU=folder,OU=Citrix,OU=Applications,DC=xx,DC=xx,DC=xx,DC=com") 

# Get all nested members 

get-NestedMembers $group|FT @{l="First Name";e={$_.givenName}},@{l="Last Name";e={$_.sn}},@{l="Last Logon";e={[datetime]::FromFileTime($_.ConvertLargeIntegerToInt64($_.lastLogonTimestamp[0]))}},sAMAccountName 

Волшебное форматирование является FT в последней строке наряду с некоторыми импровизированных хэш-таблиц, чтобы сделать его более удобным для чтения. Чтобы получить LastLogonTimestamp powershell, вы можете прыгать через обручи. Тип объекта, который вы используете, сохраняет его как LargeInteger, который он просто возвращает в виде System .__ ComObject или некоторых таких. К счастью, объект также содержит способ преобразования этого значения в полезное значение, которое я вызываю в этой последней строке.

Чтобы иметь возможность получить доступ к этой ценности в одиночку вы должны действительно преобразовать его в тип Int64, и из этого извлечь значение DateTime, поэтому нам нужно:

[datetime]::FromFileTime($_.ConvertLargeIntegerToInt64($_.lastLogonTimestamp[0])) 
+0

Замечательно, это делает именно то, что я хотел! Большое спасибо, вы спасли мне часы ручной работы :) –

1

первое имя и фамилия тривиальны. Вы, кажется, чтобы получить объект уже, так что вы можете просто добавить

$de.givenName ## to get first name 
$de.sn ## to get last name 
[datetime]::FromFileTime($de.lastlogon) ## however, this may not be exact. There are abundance of info on why. 

Update: В ответ на ваши вопросы ... печатая их на той же линии, легко просто положить их в кавычки

"$($de.givenName) $($de.sn) $LastLogon" 

Если вы заметили, последний не имеет $(), что означает «оценить» внутри строки. Если вы просто поместите имя переменной в сомнительные кавычки "", она будет расширена. Но когда вы хотите сделать больше, вы хотите использовать метод $ (поставить что-то здесь для выполнения).

Теперь проблема, с которой вы сталкиваетесь, заключается в том, что атрибут LastLogon может не иметь значения, поэтому при чтении вы должны убедиться, что есть значение. Например, вы можете сделать что-то вроде этого

if ($de.lastlogon) { 
    $LastLogon=[datetime]::FromFileTime($de.lastlogon) 
} 

Кстати, атрибут lastlogon..и действительно не идеален. Взгляните на этот пост: https://blogs.technet.com/b/askds/archive/2009/04/15/the-lastlogontimestamp-attribute-what-it-was-designed-for-and-how-it-works.aspx

Надеюсь, что это поможет.

+0

Спасибо большое. Имя и фамилия работают как шарм, но я получаю ошибку при последней дате входа: Невозможно преобразовать аргумент «0» со значением: «System.DirectoryServices.PropertyValueCollection», для «FromFileTime» для ввода «System .Int64 ":" Невозможно преобразовать "Систему.DirectoryServices.PropertyValueCollection "значение типа" System.DirectoryServices.Propert yValueCollection "для ввода" System.Int64 "." Я новичок в powershell, извините за глупые вопросы, но как я могу сделать вывод в одной строке? Спасибо. –

+0

Хмм, я думаю, проблема в том, что вы ничего не получаете за $ de.logon, поэтому вам нужно проверить, существует ли она. –

Смежные вопросы