Powershell 스크립트가 사용자 마지막 로그온 시간을 반환하지 않습니다.

Powershell 스크립트가 사용자 마지막 로그온 시간을 반환하지 않습니다.

내가 엉망으로 만든 간단한 코드 조각을 누군가가 해결할 수 있기를 바랍니다. 나는 코더가 아니며 Powershell을 많이 수행한 적이 없다고 말하면서 시작하겠습니다.

문제는 처음에는 이것이 작동하여 예상대로 LastLogonTimeStamp를 반환한다는 것입니다.

이제 실행하면 이 열에 출력이 전혀 표시되지 않습니다.

나는 그것이 내가 간과하고 있는 어리석은 일이라고 확신하지만 그것을 알아낼 수는 없습니다.

내가 말했듯이 – 나는 문자 그대로 이것에 대한 경험이 없습니다 – 나는 코드의 절반이 무엇을 의미하는지 모릅니다.

누구든지 나를 도와주실 수 있나요?

    # 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()

답변1

AD Powershell 모듈을 가져오는 경우 추가 디렉터리 서비스 개체를 사용할 필요가 없습니다(적어도 이 경우는 아닙니다). Get-ADGroupMembercmdlet을 사용하면 -Resursive중첩된 사용자도 찾을 수 있습니다.

-Server편집: 특정 DC를 지정할 수 있도록 AD cmdlet에 인수를 추가했습니다 . 타임스탬프 속성은 다를 수 있습니다(12개 DC에서도 마찬가지입니다). 확인하다이 블로그괜찮은 글쓰기를 위해.

이는 마지막 로그온 시간을 가져오며 읽기가 좀 더 쉽습니다.

$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

답변2

이것은 해킹이지만 작동합니다. Microsoft 기사(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

관련 정보