直到最近我使用以下脚本(稍加修改...)来简单地删除 EXO 邮箱中的所有联系人(...不仅仅是重复的):
我很茫然,因为我找不到原因。
我收到以下错误:
Invoke-RestMethod : The remote server returned an error: (401) Unauthorized.
At C:\...\bin\graph-Delete\POC-graph-DeleteExistingContacts.ps1:136 char:33
+ ... eRequest = (Invoke-RestMethod -Headers @{Authorization = "Bearer $($T ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
我看到错误 401,这毫无意义,因为我使用类似的脚本用联系人填充邮箱(使用相同的应用程序注册和所有)。
如果您也无法弄清楚原因或如何解决此问题,您是否知道其他方法可以达到清除邮箱所有个人联系人的目的? (可以在无人监督的情况下自动完成)
提前致谢
我检查过
我希望邮箱 (UPN:\Contacts) 中的所有联系人都将被删除。
如果失败,从错误中你得到的结果看起来像这一行
$NextPageRequest = (Invoke-RestMethod -Headers @{Authorization = "Bearer $($Token)" } -Uri $NextPageURI -Method Get)
我很可能会说 $NextPageURI 无效,但您没有在脚本中进行任何错误处理,因此可能是应用程序本身根本无法工作,并且您发送的令牌是空白的。如果您可以通过 fiddler 运行脚本并查看正在发送的实际请求,这可以让您看到完整的错误消息,因为您可能会通过 401 获得一些额外的详细信息。
其他需要检查的事项
您的脚本不会执行错误处理,因此如果它无法删除一个联系人,则整个过程都会失败。我将从一个简单的 try catch 围绕您的删除请求开始,看看它是否只是一个特定的联系人或它无法删除的所有联系人。虽然现在邮箱中出现损坏的项目的情况很少见,并且图表并不总是能够在这些类型的边缘情况下返回良好的错误。
您可以考虑使用 PowerShell Graph SDK,它的一些优点是它将处理令牌过期和续订,它还会进行重试和处理限制,并为您解析 Graph 请求。例如,使用客户端凭据简单查找并删除一个联系人示例
# Define the Application (Client) ID and Secret
$ApplicationClientId = '12928ba2-2b75-4d04-9916-xxxxxxxxxx' # Application (Client) ID
$ApplicationClientSecret = 'gxxxxQ' # Application Secret Value
$TenantId = '1c3a18bf-da31-4f6c-a404-xxxxxxxx' # Tenant ID
# Convert the Client Secret to a Secure String
$SecureClientSecret = ConvertTo-SecureString -String $ApplicationClientSecret -AsPlainText -Force
# Create a PSCredential Object Using the Client ID and Secure Client Secret
$ClientSecretCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $ApplicationClientId, $SecureClientSecret
# Connect to Microsoft Graph Using the Tenant ID and Client Secret Credential
Connect-MgGraph -TenantId $TenantId -ClientSecretCredential $ClientSecretCredential
$ContactEmail = "[email protected]"
$Mailboxname = "[email protected]"
$Contacts = Get-mgusercontact -userid $Mailboxname -Filter "emailAddresses/any(a:a/address eq '$ContactEmail')"
foreach($contact in $Contacts){
Write-host ("Deleting Contact " + $contact.DisplayName)
Remove-MgUserContact -Userid $Mailboxname -contactid $contact.id
}