Как мне ввести SamAccountName из get-aduser?

Я карабкался вокруг в поисках примеров использования -inputobject, и я не могу найти ни одного. Я никогда раньше не касался PowerShell, но когда я недавно начал эту работу, и мне сказали, что это сценарий, который мы использовали, я не мог не начать возиться с ним! Трубы восхитительны, но я не могу обойти эту последнюю проблему.

У меня есть этот огромный список данных, который появляется при поиске пользователей в AD, и мне было интересно, смогу ли я также получить SamAccountName из того же блока кода!

$User = Get-ADUser -Filter "EmployeeID -eq '$NameID' -or SamAccountName -eq '$NameID' -or DisplayName -eq '$NameID' -or UserPrincipalName -eq '$NameID'" -Properties 
Enabled,LockedOut,Mail,Created,passwordlastset,Description,PasswordExpired,LastLogonDate,EmployeeID,DisplayName,"msRTCSIP-UserEnabled",
"msDS-UserPasswordExpiryTimeComputed","extensionAttribute7",telephonenumber,targetaddress,distinguishedName |
                Select-Object @{Expression={$_.Name};Label='User Name';},
                @{Expression={$_.UserPrincipalName};Label='Logon Name';},
                @{Expression={$_.DisplayName};Label='Display Name';},
                @{Expression={$_.Created};Label='Date Created';},
                @{Expression={$_.SamAccountName};Label='SamAccountName';} -InputObject $Name,
                Description,
                Enabled, 
                @{Expression={$_.LockedOut};Label='Locked';}, 
                @{Expression={$_.Mail}; Label='Email Address';}, 
                @{Expression={$_.passwordlastset};Label='PW Last Reset';},
                @{Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")};Label='Password Expiry';},
                @{Expression={$_.LastLogonDate};Label='Last Logon';}, 
                @{Expression={$_.PasswordExpired};Label='Password Expired';}, 
                @{Expression={$_.extensionAttribute7};Label='Contract Expires On';},
                @{Expression={$_.EmployeeID};Label='Employee ID';},
                @{Expression={$_."msRTCSIP-UserEnabled"};Label='Skype Enabled';},
                @{Expression={$_.telephonenumber};Label='Phone Number';},
                @{Expression={$_.targetaddress};Label='Email Forwarded To';},
                @{Expression={$_.distinguishedName};Label='Distinguished Name';} | Select-Object SamAccountName -InputObject $Name | Format-list | Out-String

Выше приведено то, что я использую, чтобы получить большую часть интересной информации для правильного отображения в сценарии, но в дальнейшем мне придется вызывать ее снова с моими ограниченными знаниями, чтобы просто ввести имя пользователя SamAccountName в переменную $Name (чтобы собрать их менеджеров). и тому подобное.) Это выглядит примерно так:

$Name = (getad-user -Filter "EmployeeID -eq '$NameID' -or SamAccountName -eq '$NameID' -or DisplayName -eq '$NameID' -or UserPrincipalName -eq '$NameID'").SamAccountName

Мне просто интересно, смогу ли я сжать все это в один Get-ADUser, и какой будет лучшая практика!

Заранее всем спасибо

2 ответа

Решение

У вас есть довольно запутанный способ получить то, что вы хотите. Чтобы минимизировать количество Get-ADUser вызовы просто используют переменную. Вы уже присваиваете переменную в начале, но по какой-то причине вы "мусорите" объект.

В вашем коде Select-Object SamAccountName -InputObject $Name кажется, не имеет смысла. Вы никогда не показываете, что вы назначаете $Name и с тем, что вы делаете до этого, это выглядит странно. Как таковой, я удалил его в коде ниже.

$user = Get-ADUser -Filter "EmployeeID -eq '$NameID' -or SamAccountName -eq '$NameID' -or DisplayName -eq '$NameID' -or UserPrincipalName -eq '$NameID'" -Properties 
Enabled,LockedOut,Mail,Created,passwordlastset,Description,PasswordExpired,LastLogonDate,EmployeeID,DisplayName,"msRTCSIP-UserEnabled",
"msDS-UserPasswordExpiryTimeComputed","extensionAttribute7",telephonenumber,targetaddress,distinguishedName

$niceDisplay = $user |
                Select-Object @{Expression={$_.Name};Label='User Name';},
                @{Expression={$_.UserPrincipalName};Label='Logon Name';},
                @{Expression={$_.DisplayName};Label='Display Name';},
                @{Expression={$_.Created};Label='Date Created';},
                @{Expression={$_.SamAccountName};Label='SamAccountName';} -InputObject $Name,
                Description,
                Enabled, 
                @{Expression={$_.LockedOut};Label='Locked';}, 
                @{Expression={$_.Mail}; Label='Email Address';}, 
                @{Expression={$_.passwordlastset};Label='PW Last Reset';},
                @{Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")};Label='Password Expiry';},
                @{Expression={$_.LastLogonDate};Label='Last Logon';}, 
                @{Expression={$_.PasswordExpired};Label='Password Expired';}, 
                @{Expression={$_.extensionAttribute7};Label='Contract Expires On';},
                @{Expression={$_.EmployeeID};Label='Employee ID';},
                @{Expression={$_."msRTCSIP-UserEnabled"};Label='Skype Enabled';},
                @{Expression={$_.telephonenumber};Label='Phone Number';},
                @{Expression={$_.targetaddress};Label='Email Forwarded To';},
                @{Expression={$_.distinguishedName};Label='Distinguished Name';} | Format-list | Out-String

$name = $User.SamAccountName

Лучше всего превратить любой фрагмент кода в функцию с возможностью повторного использования, а затем объединить несколько функций в модули. Поскольку вы начинаете с powershell, вы можете начать с простой функции, подобной этой:

Function Get-ADUserInfo {
   param([string]$NameID)

   Get-ADUser -Filter "SamAccountName -eq '$NameID'" -Properties Enabled,LockedOut,Mail,Created,passwordlastset,Description,PasswordExpired,LastLogonDate,EmployeeID,DisplayName,Manager,"msRTCSIP-UserEnabled","msDS-UserPasswordExpiryTimeComputed","extensionAttribute7",telephonenumber,targetaddress,distinguishedName |
                Select-Object @{Expression={$_.Name};Label='User Name'},
                SamAccountName

    }

# call the function with different nameid values like so
$Name = Get-ADUserInfo -NameID someuser1
$Name = Get-ADUserInfo -NameID someuser2

информация для менеджеров

Get-ADuser -Identity $Name.Manager

Inputobject, как следует из названия, используется для передачи объекта в качестве входных данных для функции. Недвижимость samaccountname уже присутствует в выводе, поэтому нет необходимости делать что-либо еще, кроме как просто указать это, как показано в коде выше.

Кроме того, зачем отображать "Имя" как "имя пользователя"? Не будет ли проще отформатировать заголовки в Excel?

Вот несколько ссылок, которые могут быть полезны:

функции

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions?view=powershell-5.1

Другие вопросы по тегам