【问题标题】:How do I input the SamAccountName from get-aduser?如何从 get-aduser 输入 SamAccountName?
【发布时间】:2019-02-19 04:26:38
【问题描述】:

我一直在四处寻找有关如何使用 -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 var(To召集他们的经理等。)它看起来像这样:

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

我只是想知道是否可以将其全部压缩到一个 Get-ADUser 中,最好的做法是什么!

提前谢谢大家

【问题讨论】:

    标签: powershell pipe select-object


    【解决方案1】:

    你有一种非常复杂的方式来获得你想要的东西。要最小化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
    

    【讨论】:

    • 嘿!您回答了我心中的另一个问题,即为管道预定义过滤器的能力。棒极了!我确定我现在可以从这里继续下去,而且我的意图是从一开始就不会丢弃它!很长一段时间以来,我一直在拼命尝试保存从 $User 中提取的信息。谢谢!
    【解决方案2】:

    最好的做法是将任何一段代码变成一个可重用的函数,然后将多个函数组合成模块。由于您是从 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

    【讨论】:

    • 我们的工作主要使用它来获取 ID、电子邮件、查看他们的经理是谁、检查他们的组以及判断他们的密码是否过期 - 我们实际上并没有将所有这些都粘贴到 excel 和喜欢。我正在搞乱的剧本是其他人的作品,所以这是一次真正有趣的冒险!至于我为什么使用 SamAccountName(或者更确切地说是需要它)是因为初始函数采用多种方式输入用户,并通过过滤器搜索它们。然后,我稍后会使用相同的信息来联系他们的经理。不过,如果他们使用电子邮件,效果就不太好了。
    • [Ran out above] 所以我过滤了他们的 SamAccountName,然后用它在系统中检查他们的经理和他们的信息。在这一点上,我主要只是想压缩行数,哈哈,而且我知道我可以通过将其压缩成函数来走得更远。我很好奇如何将找到的 SamAccountName 从同一个 ADUser 推入 $Name - 我认为这是可能的,我只是不知道足够的术语来这样做。即使有一个函数,我也不太确定我会返回什么!我一周前才开始弄乱PowerShell。 :p
    • 你不需要使用 return 关键字来显示 c# 的 powershell 中的输出...我将编辑答案以显示如何使用 $name 作为输出
    • 如果您只显示名称/SamAccountName,为什么要获取所有属性,您是否只是将其作为示例?
    • @Seth 事实上,里面的所有信息对我们的工作都很重要!我也在处理别人的工作(实际上他早就辞职了……),所以我正在尽我所能慢慢地把它清理干净,让它变得更好。同样,最初的问题是如何撕掉 SamAccountName 以便稍后在脚本中的其他部分使用(例如,他们的经理,或者最好猜测一个 LA 或 t-0/3 帐户!)Powershell 已经完全外国的,几周前我才开始弄乱它。我什至不确定其中一半的意思是什么,:X
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    相关资源
    最近更新 更多