通过 Exchange Online REST 修改用户 Api
Modify Users via Exchange Online REST Api
我正在尝试制作一个可以通过 Exchange Online REST 修改 Exchange Online 用户的 PowerShell 脚本 API。我需要通过 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 用户的守护程序应用程序?
-德米特里
您应该 Office 365 unified API which is in public preview to enumerate or modify user information in Azure Active Directory. This API is in Public Preview, and we are working actively to get it to GA. In the meantime, if you need to configure users in a production setting, please Azure AD Graph API. These are the supported endpoints for managing user info in directory. The endpoint https://outlook.office365.com/api 允许您指定要访问哪个用户的邮箱,但不允许您枚举用户,因为这是一个目录功能。
这是解决此问题的简单方法,使用 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 在这个博客 post http://goodworkaround.com/node/73 上找到的一些精彩技巧,我们有了连接到 Azure AD 的基础。接下来,使用Azure AD Graph DLL中提供的精彩API(你可以使用'.\nuget.exe install Microsoft.IdentityModel.Clients.ActiveDirectory'的nuget命令和Azure AD Rest API 参考指南, 这套功能就建好了
此工具包含许多工作函数,例如 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
我正在尝试制作一个可以通过 Exchange Online REST 修改 Exchange Online 用户的 PowerShell 脚本 API。我需要通过 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 用户的守护程序应用程序?
-德米特里
您应该 Office 365 unified API which is in public preview to enumerate or modify user information in Azure Active Directory. This API is in Public Preview, and we are working actively to get it to GA. In the meantime, if you need to configure users in a production setting, please Azure AD Graph API. These are the supported endpoints for managing user info in directory. The endpoint https://outlook.office365.com/api 允许您指定要访问哪个用户的邮箱,但不允许您枚举用户,因为这是一个目录功能。
这是解决此问题的简单方法,使用 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 在这个博客 post http://goodworkaround.com/node/73 上找到的一些精彩技巧,我们有了连接到 Azure AD 的基础。接下来,使用Azure AD Graph DLL中提供的精彩API(你可以使用'.\nuget.exe install Microsoft.IdentityModel.Clients.ActiveDirectory'的nuget命令和Azure AD Rest API 参考指南, 这套功能就建好了
此工具包含许多工作函数,例如 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