从O365中获取users到D365中
用D365 online可能会遇到这样的问题。 顾客需要获取O365 user的email address 发email使用。 但是又不想给这部分的users licenses。
那我们就可以通过graph api来获取这部分的users
我们首先可以通过 graph explorer来检查下索要获取的restful api
https://developer.microsoft.com/en-us/graph/graph-explorer

在我们开始写代码获取O365用户之前, 我们需要在portal.azure中注册一个application。
首先,我们需要register application并且需要add a permission。
在这里要注意了, 我们需要选择application permissions 而不是delegated permission。
两者区别在于application permission在赋予admin consent 权限之后不需要再次有弹出框登录。而delegated permission则需要每次都有弹出框来登录。

其次,我们要找到User.Read.All 并且选中

最后,我们需要给与User.Read.All 权限

这里需要注意的是 Application ID, Directory ID 和 Secret Key是需要的

接下来我们就需要写一个接口。
我们可以把这个接口用Microsoft flow每天凌晨call 做O365 users 同步。
var tenant = "";
var clientId = "";
var secret = ""; var tokenAuth = "https://login.microsoftonline.com/" + tenant + "/oauth2/v2.0/token";
var authStr = "&client_id=" + clientId
+ "&client_secret=" + HttpUtility.UrlEncode(secret)
+ "&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&grant_type=client_credentials";
HttpContent content = new StringContent(authStr, Encoding.UTF8, "application/x-www-form-urlencoded");
HttpClient httpClient = new HttpClient();
var httpClientResponse = httpClient.PostAsync(tokenAuth, content).Result;
var contents = httpClientResponse.Content.ReadAsStringAsync().Result; TokenResult tokenResult = JsonConvert.DeserializeObject<TokenResult>(contents);
var query = "https://graph.microsoft.com/v1.0/users/"; using (var client = new HttpClient())
{using (var request = new HttpRequestMessage(HttpMethod.Get, query))
{
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", tokenResult.access_token); using (var response = client.SendAsync(request).GetAwaiter().GetResult())
{if (response.IsSuccessStatusCode)
{
var jsonString = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
var jo = JsonConvert.DeserializeObject<JObject>(jsonString);
var ja = JsonConvert.DeserializeObject<JArray>(jo["value"].ToString());
if (ja.Count != )
{
for (int i = O365UsersIndexNo; i < ja.Count; i++)
{
JToken item = ja[i];
var displayName = item["displayName"].ToString();
var domainName = item["userPrincipalName"].ToString(); var account = ConfigurationManager.AppSettings["UserName"];
var password = ConfigurationManager.AppSettings["Password"];
var dhlResourceUrl = "https://xxx.crm5.dynamics.com/";
var crmClientId = ConfigurationManager.AppSettings["ClientId"];
var weburi = dhlResourceUrl + "api/data/v9.1/new_o365users";
AuthenticationContext authContext = new AuthenticationContext("https://login.windows.net/common", false);
AuthenticationResult result = authContext.AcquireToken(dhlResourceUrl, crmClientId, new UserCredential(account, password));
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(weburi); req.Method = "post";
req.Accept = "application/json";
req.ContentType = "application/json; charset=utf-8";
req.Headers.Add("OData-MaxVersion", "4.0");
req.Headers.Add("OData-Version", "4.0");
req.Headers.Set("Authorization", "Bearer " + result.AccessToken);
req.Headers.Set("If-None-Match", "*");
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; var newO365User = new JObject();
if (!string.IsNullOrEmpty(displayName) && !string.IsNullOrEmpty(domainName))
{
newO365User.Add("emailaddress", domainName);
newO365User.Add("new_fullname", displayName);
newO365User.Add("new_domainname", domainName);
}
else
{
continue;
}
byte[] data = Encoding.UTF8.GetBytes(newO365User.ToString());
Stream newStream = req.GetRequestStream();
newStream.Write(data, , data.Length);
newStream.Close();
using (HttpWebResponse res = (HttpWebResponse)req.GetResponse())
{
StreamReader read = new StreamReader(res.GetResponseStream());
}
}
}
}
}
}
}
如果我们需要获取当前新创建的O365 users, API query是这样的

从O365中获取users到D365中的更多相关文章
- 从O365中获取users到D365中 使用flow
在我上篇blog中讲解到了怎么用代码把O365 users 获取到D365中. 从O365中获取users到D365中 这几天一直在研究flow, 发现flow可以更简单的完成这个功能. 一开始没有考 ...
- asp.net 类库中获取session c#类中获取session
asp.net 类库中获取session c#类中获取session 1. 先引入命名空间 using System.Web; using System.Web.SessionState; 在使用H ...
- spring boot拦截器中获取request post请求中的参数
最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取 ...
- spring中获取dao或对象中方法的实例化对象
spring中获取dao的中方法的实例化对象: //获取应用上下文对象 ApplicationContext ctx = new ClassPathXmlApplicationContext(&quo ...
- java中获取两个时间中的每一天
引入下面方法即可: /** * 获取两个时间中的每一天 * @param bigtimeStr 开始时间 yyyy-MM-dd * @param endTimeStr 结束时间 yyyy-MM-dd ...
- vROPS中获取虚拟机在VC中的UUID
vROPS中虚拟机对象的ID为resourceID,跟vCenter中虚拟机的UUID是不一致的,因此想要将vROPS中的虚拟机和vCenter中的虚拟机对应肯定不能靠虚拟机名称,而是一定要靠UUID ...
- ASP.NET中获取Repeater模板列中LinkButton按钮事件中获取ID等
前台页面中: <asp:Repeater ID="repComment" runat="server"> <ItemTe ...
- C++ 中获取 可变形參函数中的參数
#include <iostream> #include <stdarg.h> using namespace std; int ArgFunc(const char * st ...
- javascript中获取字符串或数组中元素的索引
有些时候,我们需要知道一个字符串中字符的位置,或者一个数组中元素的位置,这是就需要对该变量进行迭代操作. 对于数组,有两个方法indexOf和findIndex() , 需要注意的是,findInde ...
随机推荐
- LuoguP3521 [POI2011]ROT-Tree Rotations
P3521 [POI2011]ROT-Tree Rotations 题目大意: 给一棵\((1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 我们发现 ...
- 【2016常州一中夏令营Day1】
Problem 1. suffix给定一个单词,如果该单词以 er. ly 或者 ing 后缀结尾,则删除该后缀(题目保证删除后缀后的单词长度不为 0),否则不进行任何操作.Input输入一行,包含一 ...
- 云栖大会压轴好戏 阿里云发布视频云V5计划与系列新产品
9月25 - 27日,2019云栖大会如期召开.在大会最后一天下午,阿里云智能视频云分论坛为今年的云栖大会献上了一场精彩的压轴好戏. 视频云V5计划发布 使能生态合作伙伴 会上,阿里云智能研究员金戈进 ...
- 2017.5.11 昨天晚上看fview直播坚果pro回放
对话1 彭林: 我以前也是产品经理,身为产品经理,你有没有感觉我们做出过什么之前不被人接受的东西,但是我们却坚持做了,并且得到的反响非常好. 朱萧木: 没有吧,我们没有做颠覆用户认知或者三观的特别 ...
- 怎么安装GUI
python安装easygui的过程中,下载的是0.97.安装的时候提示setuptools模块不存在.然后又去安装setuptools等等, 真麻烦.也没有成功.后来又下载了0.96的.才成功.下面 ...
- Excel读取方式优化(浅谈对规律的认知)
相信大家都接触过对Excel的读取,今天突发奇想,想将自己的一小段经历分享出来.灵活识别列名并将其存到对象数组中. 固定形式的Excel列的读取: 源于我第一次操作Excel,将列名对应成table中 ...
- C# 将PDF转为Word、Html、XPS、SVG、PCL、PS——基于Spire.Cloud.PDF
Spire.Cloud.PDF提供了接口PdfConvertApi可用于将PDF文档转换为其他格式文档,如Word(docx/doc).Html.XPS.SVG.PCL.PS.Png以及XPS转成PD ...
- Java提供的JDBC标准- 六大步骤
JDBC 1.//加载驱动 class.forname 2.//创建连接connection 3.//创建 管道流 statement或 preparestatement预处理4.//执行sql语句 ...
- linux技巧---创建应用快捷方式
linux中启动或关闭应用有时候比较麻烦,你必须cd到该应用的可执行脚本的目录中再执行该脚本,不能在任意目录下开启或关闭应用..当然,设置了环境变量path可以解决在任意目录下开启应用的问题,但是每个 ...
- Wireshark抓包,带你快速入门
前言 关于抓包我们平时使用的最多的可能就是Chrome浏览器自带的Network面板了(浏览器上F12就会弹出来).另外还有一大部分人使用Fiddler,Fiddler也是一款非常优秀的抓包工具.但是 ...