2017-10-09 8 views
0

私はXパスワードの年齢のローカルWindows管理者のリストを取得したい場合に一度の割り当てに取り組んでいます。ローカル管理ユーザーやその他のユーザーのために、以下の機能があります。これらを統合するのを手伝ってください。パスワードの年齢のローカル管理者を取得する

私は以下のコマンドを使用して、特定のグループとホスト名から詳細を取得することができます。ユーザーの

Get-Content -Path "D:\Groups.txt" | ForEach-Object { 
    Get-GroupMember -ComputerName (Get-Content -Path "D:\servers.txt") -LocalGroup $_ 
} | Export-Csv -Path D:\Getgroupmembers_$(Get-Date -Format ddMMyyyy).csv -NoTypeInformation 

一覧:

function Get-GroupMember { 
    [CmdletBinding()] 
    Param(
     [Parameter(Mandatory=$true)] 
     [Alias('Group')] 
     [string]$LocalGroup, 
     [Alias('CN','Computer')] 
     [string[]]$ComputerName = '.' 
    ) 

    foreach ($Computer in $ComputerName) { 
     Write-Verbose "Checking membership of localgroup: '$LocalGroup' on $Computer" 
     try { 
      ([adsi]"WinNT://$Computer/$LocalGroup,group").psbase.Invoke('Members') | ForEach-Object { 
       New-Object -TypeName PSCustomObject -Property @{ 
        ComputerName = $Computer 
        LocalGroup = $LocalGroup 
        Member  = $_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null) 
       } 
      } 
      Write-Verbose "Successfully checked membership of localgroup: '$LocalGroup' on $Computer" 
     } catch { 
      Write-Warning $_ 
     } 
    } 
} 

私たちは、コードの下に使用することができますし、私たちは一つのコマンドを使用して、これら両者を統合する必要があるパスワードの年齢を確認するには:

これら二つを組み合わせる
function Get-PwdAge { 
    [CmdletBinding()] 
    Param(
     [Parameter(Mandatory=$false, 
      Position=1, 
      ValueFromPipeline=$false, 
      ValueFromPipelineByPropertyName=$false)] 
     [String]$Usr, 
     [Switch]$All 
    ) 

    $filter = "(&(objectCategory=person)(objectClass=user)(name=$Usr))" 
    if ($All) { 
     $filter = '(&(objectCategory=person)(objectClass=user))' 
    } 
    $root = New-Object System.DirectoryServices.DirectoryEntry("LDAP://RootDSE") 
    $searcher = New-Object System.DirectoryServices.DirectorySearcher $filter 
    $SearchRoot = $root.defaultNamingContext 
    $searcher.SearchRoot = "LDAP://CN=Users,$SearchRoot" 
    $searcher.SearchScope = 'SubTree' 
    $searcher.SizeLimit = 0 
    $searcher.PageSize = 1000 
    $searcher.FindAll() | ForEach-Object { 
     $account = $_.GetDirectoryEntry() 
     $pwdset = [DateTime]::FromFileTime($_.Properties.Item("pwdLastSet")[0]) 
     $age = (New-TimeSpan $pwdset).Days 
     $info = 1 | Select-Object Name, Login, AgeInDays, LastSet 
     $info.Name = $account.DisplayName[0] 
     $info.Login = $account.SamAccountName[0] 
     $info.AgeInDays = $age 
     $info.LastSet = $pwdset 
     $info 
    } 
} 
+0

スクリプトはあなたを助けません - 2番目のものはローカルユーザアカウントではなく、ADユーザのためです –

+0

最初のスクリプトにパスワードの時代を追加することは可能です? –

+0

[ドメイン以外のシステムですべてのユーザーの[Last Windowsパスワードの変更]を一覧表示する(https://stackoverflow.com/questions/46571762/list-last-windows-password-change-for-all-users-on) -a-非ドメイン系) –

答えて

0
Param 
    (
    [Parameter(Position=0,Mandatory=$false)] 
    [ValidateNotNullorEmpty()] 
    [Alias('cn')][String[]]$ComputerName=$Env:COMPUTERNAME, 
    [Parameter(Position=1,Mandatory=$false)] 
    [Alias('un')][String[]]$AccountName, 
    [Parameter(Position=2,Mandatory=$false)] 
    [Alias('cred')][System.Management.Automation.PsCredential]$Credential 
) 
    $Obj = @() 

    $now = Get-Date 

    Foreach($Computer in $ComputerName) 
{ 
If($Credential) 
{ 
    $AllLocalAccounts = Get-WmiObject -Class Win32_UserAccount -Namespace "root\cimv2" ` 
    -Filter "LocalAccount='$True'" -ComputerName $Computer -Credential $Credential -ErrorAction Stop 
} 
else 
{ 
    $AllLocalAccounts = Get-WmiObject -Class Win32_UserAccount -Namespace "root\cimv2" ` 
    -Filter "LocalAccount='$True'" -ComputerName $Computer -ErrorAction Stop 
    } 



$Obj = $AllLocalAccounts | ForEach-Object { 

     $user = ([adsi]"WinNT://$computer/$($_.Name),user") 
     $pwAge = $user.PasswordAge.Value 
     $maxPwAge = $user.MaxPasswordAge.Value 
     $pwLastSet = $now.AddSeconds(-$pwAge) 


    New-Object -TypeName PSObject -Property @{ 


     'Account Name'   = $_.Name 
     'Disabled'    = $_.Disabled 
     'Password Expires'  = $_.PasswordExpires 
     'Password Last Set' = $pwLastSet 
     'Password Expiry Date' = $now.AddSeconds($maxPwAge - $pwAge) 
     'Password Required' = $_.PasswordRequired 
     'Domain'    = $_.Domain 
     'Password Age'   = ($now - $pwLastSet).Days 

    } 
    } 

If($AccountName) 
    { 
    Foreach($Account in $AccountName) 
    { 
     $Obj|Where-Object{$_.Name -like "$Account"} 
    } 
    } 
else 
    { 
    $Obj 
    } 
} 
関連する問題