使用 Powershell-Graph-API 删除(存储)在 ExchangeOnline 邮箱中的个人联系人

问题描述 投票:0回答:1

直到最近我使用以下脚本(稍加修改...)来简单地删除 EXO 邮箱中的所有联系人(...不仅仅是重复的):

graph-删除重复联系人.ps1

我很茫然,因为我找不到原因。

我收到以下错误:

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,这毫无意义,因为我使用类似的脚本用联系人填充邮箱(使用相同的应用程序注册和所有)。

如果您也无法弄清楚原因或如何解决此问题,您是否知道其他方法可以达到清除邮箱所有个人联系人的目的? (可以在无人监督的情况下自动完成)

提前致谢

我检查过

  • 如果所有权限均已到位(Azure 企业应用程序 -> 应用程序注册)
  • Microsoft 文档、社区、ChatGPT

我希望邮箱 (UPN:\Contacts) 中的所有联系人都将被删除。

powershell microsoft-graph-api contacts import-contacts exchange-online
1个回答
0
投票

如果失败,从错误中你得到的结果看起来像这一行

$NextPageRequest = (Invoke-RestMethod -Headers @{Authorization = "Bearer $($Token)" } -Uri $NextPageURI -Method Get)

我很可能会说 $NextPageURI 无效,但您没有在脚本中进行任何错误处理,因此可能是应用程序本身根本无法工作,并且您发送的令牌是空白的。如果您可以通过 fiddler 运行脚本并查看正在发送的实际请求,这可以让您看到完整的错误消息,因为您可能会通过 401 获得一些额外的详细信息。

其他需要检查的事项

  • 邮箱是否处于诉讼保留状态
  • 您使用的访问令牌已过期(从代码中看起来并非如此,但可能在上下文中)
  • 邮箱已超过配额之一
  • 使用 jwt.io 检查返回的令牌中的实际权限

您的脚本不会执行错误处理,因此如果它无法删除一个联系人,则整个过程都会失败。我将从一个简单的 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
}

© www.soinside.com 2019 - 2024. All rights reserved.