0

我开发了一个 Powershell 脚本来为 Office 365 生成每个用户的未读电子邮件报告。

1.- 这仅适用于管理员用户帐户 2.- 管理员用户需要 Exchange Server 中的以下角色(Applicationimpersonate)

# work with Office 365 exchange server to retrieve messages
# Check Admin user have Applicationimpersonate Role

Set-ExecutionPolicy RemoteSigned

$UserCredential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection
Import-PSSession $Session


# load the assembly
[void] [Reflection.Assembly]::LoadFile("C:\Program Files\Microsoft\Exchange\Web Services\2.0\Microsoft.Exchange.WebServices.dll")
$s = New-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013_SP1)


if ($UserCredential -ne $null) 
{
    $s.Credentials = $UserCredential.GetNetworkCredential()
}
else 
{
    # Credencial for Admin User
    $UserCredential = Get-Credential 
    $s.Credentials = $UserCredential.GetNetworkCredential()
}


# This URL is used for Office 365
# You can use AutodiscoverUrl in case of don't have URL
$s.Url= new-object Uri(“https://outlook.office365.com/EWS/Exchange.asmx”)

# To use AutoDiscovery
# discover the url from your email address
# $TestUrlCallback = {
#  param ([string] $url)
#  if ($url -eq "https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml") {$true} else {$false}
# }
#  $s.AutodiscoverUrl($email,$TestUrlCallback)


# get a handle to the inbox, this function get all inbox, you can replace with a address file 
# uncomment this line
# For All Inbox

Write-host "Name , Email , Toatl in Inbox, UnRead in Inbox , Sent "
get-mailbox | foreach-object{
    $mbcomb = "" | select DisplayName,EmailAddress,Inbox_Number_Unread,Inbox_Unread_LastRecieved,Sent_Items_LastSent
    $mbcomb.DisplayName = $_.DisplayName.ToString()
    $mbcomb.EmailAddress = $_.WindowsEmailAddress.ToString()
    $email = $_.WindowsEmailAddress
    $folderId = New-Object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox, $email);
    $s.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress,$email)
    $inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s,$folderId)
    $folderIdS = New-Object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::SentItems, $email);
    $Sent = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s,$folderIdS)
    Write-host $mbcomb.DisplayName "," $email "," $inbox.TotalCount "," $inbox.UnreadCount ","  $Sent.TotalCount
}



# For email address in a File 
#function GetUnreadInboxMails([string] $emailAddress) 
#{
#
#    $folderId = New-Object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox, $emailAddress);
#    $s.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress,$emailAddress)
#    $inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s,$folderId)
#    $folderIdS = New-Object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::SentItems, $emailAddress);
#    $Sent = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s,$folderIdS)
#    Write-host $emailAddress "," $inbox.UnreadCount "," $Sent.TotalCount "," $inbox.TotalCount 
#}
#$addresses = Import-Csv "c:\temp\email-list.txt"
#$addresses | % {GetUnreadInboxMails($_.MailAddress)}  
4

0 回答 0