2017-06-14 75 views
2

我试图将两个函数的输出与默认的Get-ADUser -cmdlet的输出组合在一起。我对什么时候创建帐户感兴趣,是否锁定以及名称是什么。我也想知道用户何时最后一次登录(使用多个DC),以及该帐户是否被用作共享邮箱。组合powershell输出

我已经写了两个自定义功能Get-ADUserLastLogonisSharedMailbox,这两个功能使用Write-Output函数输出它们的输出。在Get-ADUserLastLogon的情况下,这将是Lastlogon:时间和在isSharedMailbox的情况下,这将是共享:是/否。我也是在foreach循环使用标准Get-ADUser呼叫现在

Get-ADUser默认输出是:

SAM帐户名LockedOut创建
------------- - --------- -------
ACC假23-10-2015八时二十〇分20秒

的自定义功能,输出为如下:

Lastlogon:1601年1月1日1:00:00

共享:是

我想什么是对LastLogon和共享 '头' 组合成的Get-ADUser便有结合。因此,输出将变为:

SAM帐户名LockedOut创建LastLogon共享

的当前代码,其中的帐户会从一个Excel工作表导入的代码:

foreach($username in $usernameWithTld){ 
    if ($username -eq $NULL){ 
     break 
    } 

    $usernameWithoutTld = $username.split('\') 

    Get-ADUser $usernameWithoutTld[1] -Properties LockedOut, SamAccountName, 
    Created -ErrorAction Stop | Select-Object SAMAccountName, LockedOut, 
    Created 

    Get-ADUserLastLogon -UserName $usernameWithoutTld[1] 

    # Shared mailbox? 

    isSharedMailbox -mailboxname $usernameWithoutTld[1] 
} 

功能代码:

function isSharedMailbox([string]$mailboxname){ 
    $isObject = Get-ADUser -Filter {name -eq $mailboxname} -SearchBase "..." | Select-Object DistinguishedName,Name 

    if ($isObject -match "DistinguishedName"){ 
     $output = "Shared: no" 
     Write-Output $output 
    } else { 
     $output = "Shared: No" 
     Write-Output $output 
    } 

} 


function Get-ADUserLastLogon([string]$userName){ 

    $dcs = Get-ADDomainController -Filter {Name -like "*"} 
    $time = 0 
    foreach($dc in $dcs) 
    { 
    $hostname = $dc.HostName 
    $user = Get-ADUser $userName | Get-ADObject -Properties lastLogon 
    if($user.LastLogon -gt $time) 
    { 
     $time = $user.LastLogon 
    } 
    } 
    $dt = [DateTime]::FromFileTime($time) 
    Write-Output "LastLogon : $dt" 

} 

我相信有很多改进这是可以做的,我仍然在学习如何编写(适当的)PowerShell。我希望有人能回答我的问题。

+0

'isSharedMailbox'总是返回'No',可能要修复;) –

回答

4

您可以在您的Select-Object中使用计算属性。查看MSDN页面上的example 4

你的情况,这将是:

Get-ADUser $usernameWithoutTld[1] -Properties LockedOut, SamAccountName, Created -ErrorAction Stop | ` 
Select-Object SAMAccountName, LockedOut, Created, @{Name='LastLogon';Expression={Get-ADUserLastLogon -UserName $usernameWithoutTld[1]}}, @{Name='IsSharedMailbox';Expression={isSharedMailbox -mailboxname $usernameWithoutTld[1]}} 

甚至更​​好,你可以使用对象(s)表示Get-ADUser放入管道上依次调用的函数为特定对象,并可以有用的情况下,查询返回多个结果:

Get-ADUser $usernameWithoutTld[1] -Properties LockedOut, SamAccountName, Created -ErrorAction Stop | ` 
Select-Object SAMAccountName, LockedOut, Created, @{Name='LastLogon';Expression={Get-ADUserLastLogon -UserName $_.sAMAccountName}}, @{Name='IsSharedMailbox';Expression={isSharedMailbox -mailboxname $_.sAMAccountName}} 
+0

这正是我要找的。非常感谢您的解释和解决方案! :) – Brainscrewer

1

您可以将函数的结果存储在全局变量中,最后将它们连接起来是一种方法。

否则您可以使用从函数返回输出并在稍后使用该值或使用如下值:$ value = functionname然后$ value将保存函数的返回值,稍后您可以组合结果。

function isSharedMailbox([string]$mailboxname){ 
    $isObject = Get-ADUser -Filter {name -eq $mailboxname} -SearchBase "..." | Select-Object DistinguishedName,Name 

    if ($isObject -match "DistinguishedName"){ 
     $output = "Shared: no" 
     $Global:result1= $output 
    } else { 
     $output = "Shared: No" 
     $Global:result1= $output 
    } 

} 


function Get-ADUserLastLogon([string]$userName){ 

    $dcs = Get-ADDomainController -Filter {Name -like "*"} 
    $time = 0 
    foreach($dc in $dcs) 
    { 
    $hostname = $dc.HostName 
    $user = Get-ADUser $userName | Get-ADObject -Properties lastLogon 
    if($user.LastLogon -gt $time) 
    { 
     $time = $user.LastLogon 
    } 
    } 
    $dt = [DateTime]::FromFileTime($time) 
    $Global:result2= "LastLogon : $dt" 

} 
## Calling the function . Change the placeholders accordingly 
Get-ADUserLastLogon -UserName $usernameWithoutTld[1] 
isSharedMailbox -mailboxname $usernameWithoutTld[1] 

$FinalResult = "result1" + "result2" 
$FinalResult 

希望它能帮助你更好的理解。

+0

我不想使用全局变量时,计算属性将是一个更优雅的方式来做到这一点。 –

+0

@詹姆斯:雅。我只是不想在这种情况下改变任何代码。 :) –

1

的一种方式做到这一点是让你的函数返回你所感兴趣的值,并将其存储在变量中,一起算账结合一切入含有一个PSObject您感兴趣的物业编辑。

存储作为对象的好处很多。例如,你可以使用Select-ObjectSort-Object等在管道,或Export-CSV以及期待InputObject

foreach($username in $usernameWithTld){ 
    if ($username -eq $NULL){ 
     break 
    } 

    $usernameWithoutTld = $username.split('\') 

    $adDetails = Get-ADUser $usernameWithoutTld[1] -Properties LockedOut, SamAccountName, 
    Created -ErrorAction Stop | Select-Object SAMAccountName, LockedOut, 
    Created 

    $lastlogin = Get-ADUserLastLogon -UserName $usernameWithoutTld[1] 

    # Shared mailbox? 

    $isshared = isSharedMailbox -mailboxname $usernameWithoutTld[1] 

    # putting together the PSobject 
    [array]$myResults += New-Object psobject -Property @{ 
     SAMAccountName = $adDetails.SAMAccountName 
     LockedOut  = $adDetails.LockedOut 
     Created  = $adDetails.Created 
     LastLogon  = $lastlogin 
     Shared   = $shared # true/false or yes/no, depending on function 
     #Shared   = if($shared){"yes"}else{"no"} # yes/no, based on true/false from function 

    } 
} 

功能其他cmdlet:

function isSharedMailbox([string]$mailboxname){ 
    $isObject = Get-ADUser -Filter {name -eq $mailboxname} -SearchBase "..." | Select-Object DistinguishedName,Name 

    return ($isObject -match "DistinguishedName") # returns true/false 

    <# if you prefer to keep yes/no 
    if ($isObject -match "DistinguishedName"){ 
     return "Yes" # no in original code 
    } else { 
     return "No" 
    } 
    #> 
} 

function Get-ADUserLastLogon([string]$userName){ 

    $dcs = Get-ADDomainController -Filter {Name -like "*"} 
    $time = 0 
    foreach($dc in $dcs) 
    { 
    $hostname = $dc.HostName 
    $user = Get-ADUser $userName | Get-ADObject -Properties lastLogon 
    if($user.LastLogon -gt $time) 
    { 
     $time = $user.LastLogon 
    } 
    } 
    $dt = [DateTime]::FromFileTime($time) 

    return $dt 
    #Write-Output "LastLogon : $dt" 

}