我编写了一个DotNet Forms应用程序,它使用PowerShell自动化来创建和修改内部部署AD,内部部署Exchange,Azure AD和O365中的用户,以匹配HR提供的记录。这已经被客户使用了几年并且运行良好。
该代码使用适用于Windows PowerShell的Azure Active Directory模块(MSOnline - MSOL)来查看和编辑Azure AD中的用户。我最初使用MSOL版本8073.4,但自从升级到MSOL版本1.1.166.0以来我已经使用过 (见http://social.technet.microsoft.com/wiki/contents/articles/28552.microsoft-azure-active-directory-powershell-module-version-release-history.aspx)
例如,我使用以下PowerShell修改用户标题:
Import-Module MSOnline
$Cred = Get-Credential
Connect-MSOLService -Credential $Cred
Set-MSOLUser -UserPrincipalName Santa@northpole.com -Title 'Deliverer of presents'
在我被要求扩展代码以更新每个Azure AD用户"经理ID"之前,一切都很好。属性。我想的很容易!我只需要更新用户"经理ID"字段(这是管理器的Azure AD帐户的ObjectID)就像我更新标题.....
呃,没有。我找不到任何方法来更改管理员字段。我已经遍历了MSDN文档,找不到任何方法来执行此操作:
所以我查看了目前处于预览状态的新v2 Azure AD模块(在上述版本历史记录URL中提到),可以从PowerShell库中下载(搜索" AzureADPreview")。 这些最终将取代旧的MSOL cmdlet,看起来非常类似于现有的Azure PowerShell模块(用于创建VM等)。 这确实为设置用户"经理ID"提供了支持。通过命令
Set-AzureADUserManager
我尝试了这个并且它有效,所以我想我会更新我的应用程序以使用新的v2 API而不是v1 API(MSOL)。
不幸的是我发现了
Set-AzureADUser
命令(用于设置作业标题等属性)在v2.0.0.1中完全中断,但失败并显示错误
"调用的目标"
抛出了异常
我尝试的任何组合。我已通过PowerShell库向开发人员报告此内容。
幸运的是,我发现这些模块的先前版本1.1.167.0运行正常,因此我使用该版本,现在可以成功创建用户,修改用户,配置用户"经理ID& #34;但我无法弄清楚如何设置许可证(例如O365_BUSINESS_PREMIUM)。命令Set-AzureADUserLicense的文档几乎不存在,我一直无法弄清楚如何使用它。
我想我需要做以下事情:
# Create an object which contains the individual license 'x' I want to add
# The available license SkuIDs can be read from Get-AzureADSubscribedSku
$MySingleLicenseToAdd = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense
$MySingleLicenseToAdd.SkuID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
# Create a licenses object which is assigned the individual licenses I want to add or remove
$MyLicensesToAddOrRemove = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses
$MyLicensesToAddOrRemove.AddLicenses = $MySingleLicenseToAdd
$MyLicensesToAddOrRemove.RemoveLicenses = $Null
# Perform the license action against the specified user 'y'
Set-AzureADUserLicense -ObjectId 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyy' -AssignedLicenses $MyLicensesToAddOrRemove
但它在第二行代码中失败,说" SkuID"是一个只读字段。
所以我无法使用V1(MSOL)API,因为我找不到更新用户"经理ID"的方法。领域。 我无法使用V2 API,因为我无法找到分配许可证的方法(而且它在预览中也不是一个好主意在现场使用)
我目前的计划是回到使用V1 API,然后使用V2 API来更新" Manager ID"仅限字段,但这不是一个理想的解决方案(因为我将使用两个不同的API两次登录Azure)所以我想知道是否有人可以提供任何建议?
我已经阅读了一篇关于直接使用REST API的文章,但这很重要,如果可能的话,我更愿意避免并坚持使用Azure PowerShell API。
对于looooong问题感到抱歉,但我试图提供一些关于我尝试使用V2 API的原因。
更新(2016年9月23日):
AzureADPreview 2.0.0.2刚刚发布,它解决了 Set-AzureADUser :)的问题,但不幸的是部分破坏了 Set-AzureADUserManager :(
使用此新版本的许可证存在相同问题
答案 0 :(得分:0)
以下是如何使用Set-AzureADuserLicense cmdlet为用户设置许可证的示例。
如果澄清,请告诉我。
<?php
namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Http\Controllers\AdminController;
use App\CreateEmployee;
use App\Employee;
use App\Users;
class CreateEmployeeController extends AdminController
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}
public function addemployee()
{
$employee = CreateEmployee::all();
$employee =CreateEmployee::join('users','users.id','=','users.users_id')->get();
return view('app.admin.employee.employee',compact('employee','users'));
}
public function employeesave(Request $request)
{
$title = 'Add Employee';
$employee = new Employee();
$employee->name=$request->employee_name;
$employee ->area = $request->area;
$employee->save();
Session::flash('flash_notification', array('level' => 'success', 'message' => 'employee created successfully'));
return Redirect::action('Admin\CreateEmployeeController@addemployee');
}
public function updateemployee(Request $request)
{
Employee::where('id',$request->id)->update(array('name'=>$request->employee_name,'area'=>$request->area));
Session::flash('flash_notification', array('level' => 'success', 'message' => 'shop details updated successfully'));
return Redirect::action('Admin\CreateEmployeeController@addemployee',array('id' => $request->id));
}
public function editemployee($id)
{
$employee = Employee::where('id',$id)->get();
return view('app.admin.employee.editemployee',compact('employee'));
}
public function deleteemployee($id)
{
$employee = Employee::where('id',$id)->get();
return view('app.admin.employee.delete',compact('employee'));
}
public function deleteconfirms($id)
{
$employee = Employee::where('id',$id)->delete();
Session::flash('flash_notification', array('level' => 'success', 'message' => 'customer deleted successfully'));
return Redirect::action('Admin\CreateEmployeeController@addemployee');
}
public function destroy($id)
{
//
}
}
//view file
@extends('app.admin.layouts.default')
{{-- Web site Title --}}
@section('title') {{{ trans('site/user.register') }}} :: @parent @stop
@section ('styles')
@parent
<style type="text/css">
</style>
@stop
{{-- Content --}}
@section('main')
@include('utils.vendor.flash.message')
<div class="row">
<div class="page-header">
<h2>Add Employee</h2>
</div>
</div>
<div class="container-fluid">
<div class="row">
@include('utils.errors.list')
<form class="form-horizontal" role="form" method="POST" action="{{ URL::to('admin/addemployee') }}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="col-sm-12">
<div class="form-group">
<label class="col-md-2 control-label">Employee Name</label>
<div class="col-md-2">
<input type="text" class="form-control" name="employee_name"
required>
</div>
</div>
</div>
<div class="col-sm-12">
<div class="form-group">
<label class="col-md-2 control-label" for="religion">Password</label>
<div class="col-md-2">
<input type="password" class="form-control" placeholder="Password" name="password" id="password" data-parsley-trigger="change" data-parsley-required="true" data-parsley-minlength="6" data-parsley-maxlength="14" required>
{!! $errors->first('cpassword', '<label class="control-label" for="cpassword">:message</label>')!!}
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="form-group">
<label class="col-md-2 control-label" for="caste">Confirm Password</label>
<div class="col-md-2">
<input type="password" class="form-control" placeholder="Confirm Password" name="password_confirmation" id="password_confirmation" data-parsley-trigger="change" data-parsley-required="true" data-parsley-equalto="#password" data-parsley-minlength="6" data-parsley-maxlength="14" required>
{!! $errors->first('password_confirmation', '<label class="control-label" for="password_confirmation">:message</label>')!!}
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="form-group">
<label class="col-md-2 control-label">Area</label>
<div class="col-md-2">
<input type="text" class="form-control" name="area"
required placeholder="Area">
</div>
</div>
</div>
</div>
<div class="form-group">
<div class="col-md-2 col-md-offset-2">
<button type="submit" class="btn btn-primary">
Add
</button>
</div>
</div>
</form>
</div>
</div>
<div class="invoice-content">
<div class="table-responsive">
<div class="col-md-offset-2">
<table class="table table-invoice">
<thead>
<tr>
<th>Employee Name</th>
<th>Area</th>
</tr>
</thead>
</div>
</div>
<tbody>
@foreach($addemployee as $employee)
<tr>
<td>{{$employee->employee_name}}</td>
<td>{{$employee->area}}</td>
<td>
<a href="employee/edit/{{$employee->id}}">Edit</a>
<a onclick="return confirm('Are you Sure you want to do this Action!'); style.backgroundColor='#84DFC1'; " href="employee/delete/{{$employee->id}}">delete</a>
</td>
</tr>
@endforeach
@if(!count($employee))
<tr><td>NO data found </td></tr>
@endif
</tbody>
</tbody>
</table>
{{--</div>--}}
{{--</div>--}}
{{--</div>--}}
</div>
</div>
@endsection
答案 1 :(得分:0)
感谢您的回复。罗布。
您提供的代码与我尝试的代码相同(请参阅原始问题中的代码),但您从现有用户检索SkuID除外。
由于AzureADPreview的两个新版本已经发布(2.0.0.7和2.0.0.17),这促使我再次尝试新版本的AzureADPreview以及我最初发布时可用的原始版本。
我的结果如下:
2.0.0.1:不起作用。只读错误。
2.0.0.2:不起作用。只读错误。
2.0.0.7:工作
2.0.0.17:工作
所以基本上它是AzureADPreview原始版本的一个错误,但微软已经修复了它。
现在全部工作。