0

Я пытаюсь создать сценарий PowerShell, который может изменять пользователей Exchange Online через Exchange Online REST API. Мне нужно установить поля Title, City, Department и Manager через API. Согласно интерактивной документации об обмене, у контактного объекта есть все обязательные поля, которые я хотел бы установить. Однако похоже, что API не позволяет мне делать изменения на пользовательском рычаге. Это немного запутанно.Изменить пользователей через Exchange Online REST 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? Возможно ли это?

Как я могу разработать приложение-демон, которое использует аутентификацию AAD для приложений только для пользователей Exchange Online?

-Dmitry

+0

С одной стороны, PowerShell не требует запятой в конце каждой строки, так что вы можете очистить свой код в этой связи в первую очередь. Единственное место, где вам нужны точки с запятой, находится в вашей хэш-таблице ($ headers @ {...}) – FoxDeploy

+0

Я обнаружил, что MS выпустила новую документацию по API. Вы посмотрели на него? Некоторые из вашего кода, похоже, напоминают старый способ делать что-то, что было болью на клавиатуре. https://msdn.microsoft.com/Library/Azure/Ad/Graph/api/users-operations#AssignUsersManager – FoxDeploy

+0

Я не знаю, знаете ли вы, но есть Azure AD Module, который вы можете использовать для этих операций , Это уменьшает весь этот процесс до четырех или пяти строк кода и полностью исключает необходимость REST. – FoxDeploy

ответ

1

Вот способ атаковать эту проблему простым методом, используя модуль PowerShell. Поскольку у вас уже есть доступ к отличному и полнофункциональному инструменту PowerShell, по моему опыту нет никаких оснований делать это вручную с помощью REST API.

Использование MSONline модуля

Мы можем сделать все, что вам нужно сделать, кроме установленного менеджера с помощью этого модуля

  • Сначала установите модуль MSOnline.
  • Затем замените информацию в строках 3 и 4 своими собственными учетными данными.

    import-module MSOnline 
    
    $secpasswd = ConvertTo-SecureString '[email protected]!' -AsPlainText -Force 
    $credGuest = New-Object System.Management.Automation.PSCredential ('[email protected]', $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  : [email protected] 
    UserPrincipalName : [email protected] 
    Title    : Lead Pork Architect 
    City    : Hamburg 
    Department  : Ham Research Team 
    

Установка атрибута менеджера

Оказывается, атрибут менеджер не доступен из этого модуля. Не знаю, почему это так. Я работаю над решением этой пьесы для вас и буду обновлять этот ответ, когда я его закончу.


Когда нет дороги, сделать свой собственный

Интегрирование некоторые замечательные советы, найденные на этом блоге http://goodworkaround.com/node/73 Мариуса Solbakken Mellum, мы имели основание для подключения к Azure AD. Далее, используя замечательный API, предоставляемый в DLL Azure AD Graph (вы можете получить его с помощью команды nuget. \ Nuget.exe установите Microsoft.IdentityModel.Clients.ActiveDirectory и справочное руководство API Azure AD Restore, этот набор функции были построены.

Этот инструмент содержит ряд рабочих функций, таких как Get-MSOLGraphUser и Get-MsSOLGraphUserManager. Они в первую очередь предназначены для использования командлетом Set-MSOLGraphUserManager, но вы можете свободно изменять и использовать их в своем сердце.

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           
+0

Спасибо, Фокс. Этот подход хорош, но не идеален: 1. С модулем MSOL вы не можете изменить менеджера. Такой области нет. Чтобы изменить менеджера, вы должны использовать удаленный модуль Exchange Online. 2. Я не хочу использовать свои личные данные в скрипте PowerShell на удаленном сервере. По соображениям безопасности мне нужно создать специального пользователя с ограниченными разрешениями. И в лазурном режиме я не могу сделать это для пользователя, но могу использовать приложение AD. Возможно, что с помощью разрешений с областями с ресурсами справиться с этим, но я не уверен. – PyroJoke

+0

Хорошо, я закончил мой подход к настройке унифицированного менеджера, в комплекте с несколькими новыми функциями для вас. Я обновлю свой пост. Для получения дополнительной информации, проверьте это сообщение в блоге: http://goodworkaround.com/node/73 – FoxDeploy

+0

Кроме того, если вы просто хотите загрузить командлеты, вот они: https: //github.com/1RedOne/AzureAD – FoxDeploy

1

Вы должны Office 365 unified API, которая находится в общественном просмотре перечислять или изменять информацию о пользователях в Azure Active Directory. Этот API находится в Public Preview, и мы активно работаем над его получением в GA. Тем временем, если вам нужно настроить пользователей в настройках производства, пожалуйста, Azure AD Graph API. Это поддерживаемые конечные точки для управления информацией пользователя в каталоге. Конечная точка https://outlook.office365.com/api позволяет указать почтовый ящик пользователя, к которому вы хотите получить доступ, но не позволяет вам перечислять пользователей, поскольку это функция каталога.

+0

Унифицированный API не поддерживает аутентификацию только для приложений, не так ли? – PyroJoke

+0

Не сейчас, но это в дорожной карте –

Смежные вопросы