交換ハイブリッド環境 があります。 (一部のユーザーはオンプレミスの交換にあり、一部のユーザーはOffice 365です。)
onpremisからメールをエクスポートする場合は、以下のコマンドを使用して、メールボックスとアーカイブをエクスポートします。
New-MailboxExportRequest -Mailbox "user" -FilePath \\mysrv\l$\PST\Mailbox-user.pst; New-MailboxExportRequest -Mailbox "user" -IsArchive -FilePath \\mysrv\l$\PST\Mailbox-user-archive.pst -confirm:$false
New-MailboxExportRequestは、Office 365ではなくonpremisユーザーに対して正常に機能します。Powershellを使用してOffice 365ユーザーのメールボックスをpstにエクスポートする方法はありますか?
これまでに試したこと:
Office 365にログインしました
$UserCredential = Get-Credential
Import-Module MSOnline
Connect-MsolService -Credential $UserCredential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://Outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection
Import-PSSession $Session
してみましたNew-MailboxExportRequest
ただし、エラーが発生します。どうやらOffice 365はそのコマンドを知らない
PS C:\Users\pp> New-MailboxExportRequest
New-MailboxExportRequest : The term 'New-MailboxExportRequest' is not recognized as the name of a cmdlet, function,
script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is
correct and try again.
At line:1 char:1
+ New-MailboxExportRequest
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (New-MailboxExportRequest:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
またGet-Command *Export*
結果は次のとおりです
グーグルで試しましたが、実行可能なオプションが見つかりませんでした。案内してくれませんか?これを行うには、オフィス環境で互換性のあるコマンドは何ですか?
PS:私が試しましたhttps://www.codetwo.com/admins-blog/how-to-export-office-365-mailboxes-to-pst-using-ediscovery/
E5ライセンスで、GUIで完全に動作します。しかし、私の懸念はe-discoveryでさえあり、powershellでそれを実行するためのライセンスを持っていますか?私はPowershellを介してスクリプト/自動化することを意味しますか?
組み込みのツールを使用して、PowerShell経由でExchange Onlineメールボックスを直接PSTにエクスポートすることはできません。必要なNew-MailboxExportRequestがオンラインに存在しない(または私たちの死すべき者に公開されていない)。
あなたはできる:
あなたと同じように私はイライラしています。長期保存のためにユーザーを退去させるためにメールボックスをエクスポートすることは、不必要に煩わしいことです。インポートと同じように、Azure Blobにエクスポートすることができれば、良いスタートです。
これは質問に対する回答ではありません。ExchangeOnlineからPSTに直接エクスポートすることはまだ試みていません。
これは、@ DonZoomiks回答の最後のポイントを補足するものです。 Powershellの一部で、Frankensteinはさまざまなあいまいなソースからであり、Exchange Onlineからメールを取得します。必要に応じてカスタマイズします。
製品は、取得したメールを含むカスタムオブジェクトです。おそらく誰かがエクササイズして行く方法を共有することができます そこからPSTにOutlookを渡すことなく ?
要件は Exchange Webサービス(EWS)マネージAPI 2.2 です。
したがって、最初の2つの関数:
function Enter-ExchangeOnlineSession {
<#
.Synopsis
Sets up a user session with ExchangeOnline, typically to fetch mail.
.DESCRIPTION
Sets up a user session with ExchangeOnline, typically to fetch mail.
.EXAMPLE
$CredMail = Get-Credential -UserName [email protected]
$Service = Enter-ExchangeOnlineSession -Credential $CredMail -MailDomain domain.com
.INPUTS
Inputs to this cmdlet (if any)
.OUTPUTS
Output from this cmdlet (if any)
.NOTES
General notes
.COMPONENT
The component this cmdlet belongs to
.ROLE
The role this cmdlet belongs to
.FUNCTIONALITY
The functionality that best describes this cmdlet
#>
Param(
[Parameter(ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
Position=0)]
[ValidateNotNullOrEmpty()]
[string]$EWSAssemblyPath = 'C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll',
# Parameter Credential
[Parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
ValueFromRemainingArguments=$false,
Position=1)]
[System.Management.Automation.CredentialAttribute()]
$Credential,
# Parameter Maildomain
[Parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
ValueFromRemainingArguments=$false,
Position=2)]
[string]$MailDomain,
# Parameter Maildomain
[Parameter(Mandatory=$false,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
ValueFromRemainingArguments=$false,
Position=3)]
[string]$AutoDiscoverCallbackUrl = 'https://autodiscover-s.Outlook.com/autodiscover/autodiscover.xml'
)
# Set the path to your copy of EWS Managed API and load the Assembly.
[void][Reflection.Assembly]::LoadFile($EWSAssemblyPath)
# Establish the session and return the service connection object.
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService
$Service.Credentials = New-Object System.Net.NetworkCredential($Credential.UserName, $Credential.GetNetworkCredential().Password, $MailDomain)
$TestUrlCallback = {
param ([string] $url)
if ($url -eq $AutoDiscoverCallbackUrl) {$true} else {$false}
}
$service.AutodiscoverUrl($Credential.UserName, $TestUrlCallback)
return $Service
}
そして
function Get-ExchangeOnlineMailContent {
<#
.Synopsis
Fetches content from an Exchange Online user session, typically mail.
.DESCRIPTION
Fetches content from an Exchange Online user session, typically mail.
.EXAMPLE
$Service = Enter-ExchangeOnlineSession -Credential $CredMail -MailDomain example.com
Get-ExchangeOnlineMailContent -ServiceObject $Service -PageSize 5 -Offset 0 -PageIndexLimit 15 -WellKnownFolderName Inbox
.INPUTS
Inputs to this cmdlet (if any)
.OUTPUTS
Output from this cmdlet (if any)
.NOTES
General notes
.COMPONENT
The component this cmdlet belongs to
.ROLE
The role this cmdlet belongs to
.FUNCTIONALITY
The functionality that best describes this cmdlet
#>
Param(
[Parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
ValueFromRemainingArguments=$false,
Position=0)]
$ServiceObject,
# Define paging as described in https://msdn.Microsoft.com/en-us/library/office/dn592093(v=exchg.150).aspx
[Parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
ValueFromRemainingArguments=$false,
Position=1)]
[int]$PageSize,
[Parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
ValueFromRemainingArguments=$false,
Position=2)]
[int]$Offset,
#Translates into multiples of $PageSize
[Parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
ValueFromRemainingArguments=$false,
Position=3)]
[int]$PageIndexLimit,
# WellKnownFolderNames doc https://msdn.Microsoft.com/en-us/library/Microsoft.exchange.webservices.data.wellknownfoldername(v=exchg.80).aspx
[Parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
ValueFromRemainingArguments=$false,
Position=4)]
[ValidateSet('Calendar',
'Contacts',
'DeletedItems',
'Drafts',
'Inbox',
'Journal',
'Notes',
'Outbox',
'SentItems',
'Tasks',
'MsgFolderRoot',
'PublicFoldersRoot',
'Root',
'JunkEmail',
'SearchFolders',
'VoiceMail',
'RecoverableItemsRoot',
'RecoverableItemsDeletions',
'RecoverableItemsVersions',
'RecoverableItemsPurges',
'ArchiveRoot',
'ArchiveMsgFolderRoot',
'ArchiveDeletedItems',
'ArchiveRecoverableItemsRoot',
'ArchiveRecoverableItemsDeletions',
'ArchiveRecoverableItemsVersions',
'ArchiveRecoverableItemsPurges',
'SyncIssues',
'Conflicts',
'LocalFailures',
'ServerFailures',
'RecipientCache',
'QuickContacts',
'ConversationHistory',
'ToDoSearch')]
[string]$WellKnownFolderName,
[Parameter(Mandatory=$false,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
ValueFromRemainingArguments=$false,
Position=5)]
[switch]$ParseOriginalRecipient,
[Parameter(Mandatory=$false,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
ValueFromRemainingArguments=$false,
Position=6)]
[switch]$OriginalRecipientAddressOnly,
[Parameter(Mandatory=$false,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
ValueFromRemainingArguments=$false,
Position=7)]
[datetime]$MailFromDate,
[Parameter(Mandatory=$false,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
ValueFromRemainingArguments=$false,
Position=8)]
[switch]$ConsoleOutput
)
# Create Property Set to include body and header, set body to text.
$PropertySet = New-Object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
$PropertySet.RequestedBodyType = [Microsoft.Exchange.WebServices.Data.BodyType]::Text
if ($ParseOriginalRecipient)
{
$PR_TRANSPORT_MESSAGE_HEADERS = new-object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition(0x007D,[Microsoft.Exchange.WebServices.Data.MapiPropertyType]::String)
$PropertySet.add($PR_TRANSPORT_MESSAGE_HEADERS)
}
$PageIndex = 0
# Page through folder.
do
{
# Limit the view to $pagesize number of email starting at $Offset.
$PageView = New-Object Microsoft.Exchange.WebServices.Data.ItemView($PageSize,$PageIndex,$Offset)
# Get folder data.
$FindResults = $ServiceObject.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::$WellKnownFolderName,$PageView)
foreach ($MailItem in $FindResults.Items)
{
# Load extended properties.
$MailItem.Load($propertySet)
if ($ParseOriginalRecipient)
{
# Extended properties are one string, split by linebreak then find the line beginning with 'To:', containing original recipient address before exchange aliasing replaces it.
$OriginalRecipientStringRaw = ($MailItem.ExtendedProperties.value.split([Environment]::NewLine) | Where-Object {$_ -match '^To:'}).trimstart('To:').trim()
$MailItem | Add-Member -NotePropertyName ExtendedHeader -NotePropertyValue $OriginalRecipientStringRaw
if ($OriginalRecipientAddressOnly)
{
# Removes everything but the address '[email protected]' when string has form of e.g. '"My Name" <[email protected]>'
$MailItem | Add-Member -NotePropertyName OriginalRecipient -NotePropertyValue ($OriginalRecipientStringRaw | ForEach-Object {($_.ToString() -creplace '^[^<]*<', '').trimend('>')})
}
else
{
$MailItem | Add-Member -NotePropertyName OriginalRecipient -NotePropertyValue $OriginalRecipientStringRaw
}
if ($ConsoleOutput) {write-Host -ForegroundColor Cyan "$($MailItem.DateTimeReceived) | $($MailItem.OriginalRecipient) | $($MailItem.Sender)"}
}
# Output result.
$MailItem | Select-Object -Property *
}
# Increment $index to next page.
$PageIndex += $PageSize
} while (($FindResults.MoreAvailable) `
-and ($PageIndex -lt $PageIndexLimit) `
-and ($MailItem.DateTimeReceived -gt $MailFromDate)) # Do/While there are more emails to retrieve and pagelimit is not exceeded and datetimereceived is later than date.
}
次に、次のことができます。
$Cred = Get-Credential #Example user: [email protected]
$domain = 'example.com'
# Set how many emails we want to read at a time
$PageSizeNumOfEmails = 10
$OffSet = 0
$PageIndexLimit = 2000
$MailFolder = 'Inbox'
$DeltaTimeStamp = (Get-Date).AddDays(-30) #Go how many days back?
try
{
$Session = Enter-ExchangeOnlineSession -Credential $Cred -MailDomain $domain
}
catch
{
$Message = $_.exception.message
Write-Host -ForegroundColor Yellow $Message
}
$Mails = Get-ExchangeOnlineMailContent -ServiceObject $Session `
-PageSize $PageSizeNumOfEmails `
-Offset $OffSet `
-PageIndexLimit $PageIndexLimit `
-WellKnownFolderName $MailFolder `
-ParseOriginalRecipient `
-OriginalRecipientAddressOnly `
-MailFromDate $DeltaTimeStamp | Where-Object {$_.DateTimeReceived -gt $DeltaTimeStamp} | select *
そして最後に$Mails
お好きなように。