2013-05-14 3 views
0

기본적으로 내가 가져온 스크립트는 가져 오는 CSV 및 RANDOM.DOMAIN의 사용자를 제외한 스프레드 시트의 모든 항목을 검색하는 스크립트입니다. 관리자 전자 메일 주소를 찾아 XYZ 사용자가 곧 만료 될 것이라고 알리는 관리자에게 자동화 된 전자 메일을 보냅니다.곧 만료되는 AD 사용자를위한 Powershell 스크립트

관리자 이메일을 어떤 이유로 사용할 수없는 경우 기본적으로 이메일이 저에게 전송됩니다. 이 스크립트는 잘 작동합니다.

내가 겪고있는 문제는 스프레드 시트의 여러 사용자 (또는 항목)에도 불구하고 각 관리자에게 하나의 이메일 만 전송되도록 설정하고 관리자로 나열하는 것입니다.

e.e. Joe Bloggs에 관리자 Aaron T가 있고 Jane Doe에게 관리자 Aaron T가 있다면 Aaron T는 각 사용자에게 하나씩 두 개의 전자 메일을 받게됩니다.

내 질문 :

만 그 관리자가 만료되어 그들에게보고 여러 사용자가있는 경우에도, 관리자 당 하나의 이메일을 보내기 위해서는 할 수있는 간단한 방법이 있을까요?

$datai = Import-Csv "Soon-to-expire User Accounts22.csv" | select 'Display Name',Manager,'Domain Name','Account Expiry Time' 
Connect-QADService -Service another.DC | Out-Null 
$expiringUsers = @{} 



foreach ($i in $datai) { 
     $dn = $i.'Display Name' 
     $dn1 = $i.'Domain Name' 
     $man = $i.'Manager' 
     $aet = $i.'Account Expiry Time' 
     $subject = "Account about to expire: $dn" 



$getmail = get-qaduser "$man" -LdapFilter '(mail=*)' | select mail 
$emailAD = $getmail.mail 

if ($man -eq "-" -or $man -like 'CN=*' -or $getmail -eq $null -or $man -eq "") { 
$man = "Aaron T" 
$getmail = get-qaduser "$man" -LdapFilter '(mail=*)' | select mail 
$emailAD = $getmail.mail 
} 



if ($expiringUsers.Contains($emailAD)) { 
    $expiringUsers[$emailAD]["dn"] += $dn += "`n" 
    $expiringUsers[$emailAD]["aet"] += $aet += "`n" 
    $expiringUsers[$emailAD]["man"] += $man += "`n" 
} else { 
    $expiringUsers[$emailAD] = @{ 
    #"dn1" = $dn1 
    #"aet" = $aet 
    #"man" = $man 
    # "dn" = @($dn) 
    } 
    } 
} 


$expiringUsers | fC#as suggested 


foreach ($emailAD in $expiringUsers.Keys) { 
$dn = $expiringUsers[$emailAD]["dn"] 
$dn1 = $expiringUsers[$emailAD]["dn1"] 
$man = $expiringUsers[$emailAD]["man"] 
$aet = $expiringUsers[$emailAD]["aet"] 
$subject = "Account/s About to Expire!" 
$content = @" 
Hi, 
$dn `n 
$dn1 `n 
$man `n 
$aet `n 

$emailAD `n 
Technology Services 
"@ 
Send-MailMessage -from "[email protected]" ` 
-To $emailAD ` 
-Subject $subject ` 
-Body $content ` 
-Priority high ` 
-smtpServer "relay.server" 


#using this as a test instead of sending mass emais all the time 
Write-Host $content 
} 

새 스크립트가 요청 된대로 업데이트되었습니다 ... 여전히 문제가 있습니다.

만료 예정인 여러 명의 사용자가 관리자에게 있어도 관리자 당 하나의 이메일 만 보내는 쉬운 방법이 있습니까?

답변

0

$expiringUsers[$emailAD]["expiry"] += @{ 
    "name" = $dn; 
    "date" = $aet; 
} 

그래서 나는 결국 많은, 몇 달 후,이 스크립트를 다시 방문하기로 결정했다. PowerShell에서 좀 더 나아졌으며 이것이 가장 효과적인 방법이 아니라고 확신하지만, 이것이 저에게 효과적입니다.

입력 방법도 변경했습니다. 'AD 관리자 플러스'(증오 그것)라는 응용 프로그램에서 생성 된 CSV 파일을 사용하는 대신 AD에서 직접 정보를 가져옵니다.

우리는 2008 환경이 없기 때문에 여기에서 Quest CMDlets를 사용하십시오. (Get-ADuser 대신 Get-QADUser를 사용)

참고 자료를 별도의 테이블에 데이터를 정렬하는 코드 만 게시했습니다. 이러한 결과를 어떻게 활용할 것인지 결정할 수 있습니다. 우리 환경에서는 좋은 HTML 테이블과 본문을 만든 다음 적절한 관리자에게 보내 처리하도록합니다.

#user data input 
$data = get-qaduser -SizeLimit 0 -includedproperties accountexpires | where {$_.AccountExpires -ne $null -and $_.AccountExpires -le ((Get-Date).AddDays(45)) } 

#get a list of managers, unique. 
$uniqueMan = $data | select Manager -Unique 

#foreach manager from $uniqueman 
Foreach ($manager in $uniqueman) { 
    #create the array variable/clear it out for the next manager. 
    $myarray = @() 
      #foreach User found in in $data query 
      Foreach ($user in $data) { 

      #Search the $user's query for people with the same manager as that of the $uniqueman list. 
      If ($user.Manager -eq $manager.Manager) { 

        #do what with the result. 
        #add the person to an array 
        $myarray += New-Object psobject -Property @{ 
         Name = $user.'Name' 
         UserName = $user.'SAMAccountName' 
         AccountExpires = $user.'AccountExpires' 
         Manager = $user.Manager 
         } 


      } 


    #for testing, to output the results to an HTML file. 
    #$myarray | ConvertTo-Html | Out-File ("C:\test\" + $manager.Manager + ".html") 

     } 


} 
0

이렇게하려면 전자 메일 처리를 연기해야합니다. 해시 테이블에서 사용자를 수집합니다 (예 : 관리자에 의한 전자 우편 주소 :

... 

$expiringUsers = @{} 

foreach ($i in $datai) { 
    If ($i.'Domain Name' -notmatch "RANDOM.DOMAIN") { 
    ... 
    if ($expiringUsers.Contains($emailAD)) { 
     $expiringUsers[$emailAD]["dn"] += $dn 
    } else { 
     $expiringUsers[$emailAD] = @{ 
     "dn1" = $dn1 
     "aet" = $aet 
     "man" = $man 
     "dn" = @($dn) 
     } 
    } 
    } 
} 

루프 외부의 실제 전자 메일 처리를 이동 : 단순 이유로 위의 코드 만의 만료 날짜를 기록합니다


foreach ($emailAD in $expiringUsers.Keys) { 
    $dn1 = $expiringUsers[$emailAD]["dn1"] 
    $man = $expiringUsers[$emailAD]["man"] 
    $aet = $expiringUsers[$emailAD]["aet"] 
    $subject = "Account about to expire: $($expiringUsers[$emailAD]["dn"])" 
    $content = @" 
Hi, 
... 
Technology Services 
"@ 
    Send-MailMessage -from "Test Script - Powershell <[email protected]>" ` 
    -To "$emailAD" ` 
    -Subject $subject ` 
    -Body $content ` 
    -Priority high ` 
    -smtpServer servername 
    Write-Host "Mail Sent to $man" 
} 
첫 번째 사용자. 별도로 기록 된 각 사용자의 만료일을 원하면 추가 단계를 거쳐야합니다. 대신

$expiringUsers[$emailAD]["dn"] += $dn 
+0

답장을 보내 주셔서 감사합니다. 조금 밀집되어 있지만 코드가 올바르게 작동하지 않는 것 같습니다. 그것이 보내는 이메일에 모든 항목을보고하는 것 같습니다. 전혀 필터링하지 않는 것 같습니다. 당신이 말하는 것은 분명히 이해가됩니다! –

+0

일부 모의 데이터로 테스트했을 때 효과적입니다 (여기에 광고가 없습니다). 첫 번째 루프 다음에'$ expiringUsers'의 내용을'$ expiringUsers | fc'. 문제가 해결되지 않는 경우 수정 된 코드로 질문을 업데이트하십시오. –

+0

흠 .. 나는 약간의 놀이를 해봤 다. 이제 나는 다른 이슈들을 다루고있다 ... 나는 이메일에 멋지게 표시 할 수 없다. 한 블록, 나머지는 나머지) .. 나는 해시 테이블에 대해 좀 더 배워야한다고 생각한다. 거의 "foreach"문을 닫아야합니다. 제공하신 스크립트로 곧 내 질문이 업데이트됩니다. –

관련 문제