通过Exchange Online REST Api修改用户

时间:2015-07-01 12:59:55

标签: powershell azure exchangewebservices azure-active-directory

我尝试制作可以通过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

2 个答案:

答案 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手动执行此操作。

使用MSONline模块

我们可以做你需要做的一切,除了使用这个模块设置管理器

  • 首先,安装MSOnline模块。
  • 接下来,使用您自己的凭据替换第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