我尝试制作可以通过Exchange Online REST API修改Exchange Online用户的PowerShell脚本。我需要通过API设置Title,City,Department和Manager字段。根据交换在线文档,联系对象具有我想要设置的所有必填字段。但是,看起来API不允许我对用户控制杆进行更改。这有点令人困惑。
如果我尝试访问用户端点,则收到错误:
Invoke-RestMethod : {"error":{"code":"ErrorAccessDenied","message":"Access is denied. Check credentials and try again."}}
但是,我在Azure Active Directory中设置了应用程序的所有权限。
这是我使用的脚本:
Add-Type -Path ".\Microsoft.IdentityModel.Clients.ActiveDirectory.dll";
$clientId = "<<Application Client ID>>";
$certFileFullName = "<<Path to certificate file>>";
$certFilePassword = "<<Password to certificate file>>";
$tenantId = "<<Tenant ID>>";
$authContext = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext("https://login.windows.net/$tenantId/oauth2/authorize", $false);
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 ($certFileFullName, $certFilePassword, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::MachineKeySet);
$clientAssertionCertificate = new-Object Microsoft.IdentityModel.Clients.ActiveDirectory.ClientAssertionCertificate($clientId, $cert);
$authenticationResult = $authContext.AcquireToken("https://outlook.office365.com", $clientAssertionCertificate);
$token = $authenticationResult.AccessToken;
$headers = @{
"Authorization" = ("Bearer {0}" -f $token);
"User-Agent" = "SyncTool/0.1PowerShell";
"client-request-id" = [System.Guid]::NewGuid().ToString();
"Date" = Get-Date -Format r;
"Accept" = "application/json";
}
Invoke-RestMethod -Method Get -Uri "https://outlook.office365.com/api/v1.0/Users" -Headers $headers;
是否有人通过Exchange Online REST API执行此操作?它甚至可能吗?
我应该如何开发一个使用App-Only AAD身份验证来管理Exchange Online用户的守护程序?
-Dmitry
答案 0 :(得分:1)
您应该Office 365 unified API进行公开预览,以枚举或修改Azure Active Directory中的用户信息。此API位于公开预览中,我们正在积极地将其用于GA。与此同时,如果您需要在生产设置中配置用户,请Azure AD Graph API。这些是用于管理目录中的用户信息的受支持端点。端点https://outlook.office365.com/api允许您指定要访问的用户的邮箱,但不允许您枚举用户,因为它是目录功能。
答案 1 :(得分:1)
以下是使用PowerShell模块轻松解决此问题的方法。由于您已经可以访问功能强大的PowerShell工具,因此根据我的经验,没有理由使用REST API手动执行此操作。
我们可以做你需要做的一切,除了使用这个模块设置管理器
接下来,使用您自己的凭据替换第3行和第4行的信息。
import-module MSOnline
$secpasswd = ConvertTo-SecureString 'P@ssw0rdHer3!' -AsPlainText -Force
$credGuest = New-Object System.Management.Automation.PSCredential ('testest@sred13gmail.onmicrosoft.com', $secpasswd)
connect-msolservice -credential $credGuest
Get-MsolUser | ? DisplayName -eq 'JSamson' |
Set-MsolUser -Department 'Ham Research Team' -Title "Lead Pork Architect" -City "Hamburg"
Get-MsolUser | ? DisplayName -eq 'JSamson' | Select *Name,Title,City,Depar* | fl
DisplayName : JSamson
FirstName : Joe
LastName : Sampson
SignInName : JoeSampson@sred13gmail.onmicrosoft.com
UserPrincipalName : JoeSampson@sred13gmail.onmicrosoft.com
Title : Lead Pork Architect
City : Hamburg
Department : Ham Research Team
事实证明,该模块无法访问manager属性。不知道为什么会这样。我正在为你准备一个解决方案,并在我完成后更新这个答案。
整合Marius Solbakken Mellum撰写的这篇博文http://goodworkaround.com/node/73中的一些精彩提示,我们有了连接Azure AD的基础。接下来,使用Azure AD Graph DLL中提供的精彩API(您可以使用'。\ nuget.exe安装Microsoft.IdentityModel.Clients.ActiveDirectory'和Azure AD Rest API参考指南的nuget命令获取它,这一组功能已建成。
此工具包含许多工作函数,例如Get-MSOLGraphUser和Get-MsSOLGraphUserManager。它们主要设计为由Set-MSOLGraphUserManager cmdlet本身使用,但您可以随意修改它们并将它们用于您的内容。
New versions of this project will live in GitHub at this url
示例:
Set-MSOLGraphUserManager -targetUser Test -targetManager Stephen
>Successfully found user to modify PSTest
>Successfully looked up manager Stephen Owen
>Updating the manager
>Verifying manager now set for PSTest
>Getting user manager
>PSTest's manager is now Stephen Owen