Powershell-Skript gibt die letzte Anmeldezeit des Benutzers nicht zurück

Powershell-Skript gibt die letzte Anmeldezeit des Benutzers nicht zurück

hoffentlich kann jemand einen einfachen Codeabschnitt beheben, an dem ich herumgespielt habe. Zunächst möchte ich sagen, dass ich KEIN Programmierer bin und noch nie wirklich viel mit Powershell gemacht habe.

Das Problem besteht darin, dass dies zunächst funktionierte und der LastLogonTimeStamp wie erwartet zurückgab.

Wenn ich es jetzt ausführe, erhalte ich in dieser Spalte überhaupt keine Ausgabe.

Ich bin ziemlich sicher, dass es etwas Dummes ist, das ich übersehe, aber ich komme nicht dahinter.

Wie gesagt – ich habe darin buchstäblich keine Erfahrung – ich weiß nicht, was die Hälfte des Codes bedeutet.

Kann mir bitte jemand weiterhelfen?

    # Script to list member of VDI Desktop Users Group
    # and export details to c:\VDIlastlogon.csv file
    # [email protected] 24/11/14'

    # 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=VDI Desktop Users,ou=Groups,ou=x,ou=uk,dc=uk,dc=x,dc=com")

    # Get all nested members and send to CSV file

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

    #Send CSV file to mail recipient

    $PSEmailServer = "mail.x.net"
    $smtpServer = "mail.x.net"
    $file = "c:\VDILastLogon.csv"
    $att = new-object Net.Mail.Attachment($file)
    $msg = new-object Net.Mail.MailMessage
    $smtp = new-object Net.Mail.SmtpClient ($smtpServer)
    $msg.From = "[email protected]"
    $msg.To.Add("[email protected]")
    $msg.Subject = "User logon report from VDI Solution"
    $msg.Body = "Please find attached the most recent user logon report"
    $msg.Attachments.Add($att)
    $smtp.Send($msg)
    $att.Dispose()

Antwort1

Wenn Sie das AD Powershell-Modul importieren, müssen Sie keine zusätzlichen Verzeichnisdienstobjekte verwenden (zumindest nicht bei dieser Gelegenheit). Sie können das Get-ADGroupMemberCmdlet verwenden -Resursiveund es sollte auch Ihre verschachtelten Benutzer finden.

Bearbeiten: Ich habe -Serverden AD-Cmdlets Argumente hinzugefügt, damit Sie bestimmte DCs angeben können. Die Zeitstempelattribute können unterschiedlich sein (das ist bei meinen 12 DCs auch der Fall). Überprüfen Siedieser Blogfür einen anständigen Artikel.

Dies gibt die letzte Anmeldezeit an und ist etwas einfacher zu lesen:

$groupname = "name_of_AD_group"

Import-Module ActiveDirectory

Get-ADDomainController -Filter * | % {
   $DC = $_
   $group = Get-ADGroup -Identity $groupname -Server $DC.Name -ErrorAction SilentlyContinue
   If ($group) {
      $members = Get-ADGroupMember -Identity $group.Name -Recursive -Server $DC.Name -ErrorAction SilentlyContinue
      ForEach ($member In $members) {
         If (-not $member.objectClass -ieq "user") { Continue }
         $user = Get-ADUser $member.SamAccountName -Server $DC.Name -ErrorAction SilentlyContinue
         If ($user) {
            $lastlogon = ($user | Get-ADObject -Properties lastLogon).LastLogon
            New-Object PSObject -Property @{
               "First Name" = $user.GivenName
               "Last Name"  = $user.Surname
               "DC"         = $DC.Name
               "Last Logon" = [DateTime]::FromFileTime($lastlogon)
               "SamAccountName" = $user.SamAccountName
            }
         } Else {
            # $user not found on $DC
         }
      }
   } Else {
      # $groupname not found on $DC
   }
} | ft -auto

Antwort2

Das ist zwar ein Hack, aber es funktioniert. Ich habe mir Get-ADUserLastLogon aus einem Microsoft-Artikel (http://technet.microsoft.com/en-us/library/dd378867%28v=ws.10%29.aspx)

Import-Module ActiveDirectory
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 
}

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=Domain Users,CN=Users,DC=yourdomain,DC=com")
# Get all nested members and send to CSV file
get-NestedMembers $group|FT @{l="First Name";e={$_.givenName}},@{l="Last Name";e={$_.sn}},@{l="Last Logon";e={Get-ADUserLastLogon($_.sAMAccountName)}},sAMAccountName | tee c:\VDILastLogon.csv

verwandte Informationen