OneDrive For Business(ODFB) Personal Site

 怎样创建MySite对于SharePoint On-Premise来说非常容易,但现如今使用On-Premise的越来越少,逐渐走进Cloud,今天就来聊聊如何在Microsoft 365 Online上创建MySite(Personal Site)。

应用场景:

   1、从local AD同步到Microsoft 365 Online AzureAD的User;

   2、Azure AD已存在的User

   3、通过third-part在Azure AD 创建的User

实现方式主要有两种,一是Powershell,另一个就是Code(CSOM)

  1、SharePoint Online Powershell (Microsoft.Online.SharePoint.PowerShell

      1)、Install Module:

Install-Module -Name Microsoft.Online.SharePoint.PowerShell

     或者Import-Module(推荐)

Import-Module -Name C:\\microsoft.online.sharepoint.powershell.16.0.21116.12000\\Microsoft.Online.SharePoint.PowerShell.psd1

      2)、连接SPO,这里介绍通过Credential的方式(username, password)

$username = "admin@contoso.sharepoint.com"
$password = "password"
$cred = New-Object -TypeName System.Management.Automation.PSCredential -argumentlist $userName, $(convertto-securestring $Password -asplaintext -force)
Connect-SPOService -Url https://contoso-admin.sharepoint.com -Credential $cred

    Notes:如果是windows OS,可以直接使用windows powershell运行此命令;如果是PowerShell 7,Connect-SPOService会报 error:Can you please implement System.Security.Cryptography.SHA256Cng from .net standard? We cant use Connect-AzureAD in Powershell 7 because of this.

     Reason:虽然官网说PowerShell 7是crossplatform,但目前仍有些module imcompatible, include: AzureAD Preview, Microsoft.Online.SharePoint.PowerShell...

     Resolved : 如果你仍执着于PS7,可以在Import-Module的时候使用-UseWindowsPowerShell,实际上这时Remote Server充当一个policy,调用的是本地的windows powershell。 PowerShell 7.0

    3)、执行Request-SPOPersonalSite command,通过user email创建MySite

Request-SPOPersonalSite -NoWait -UserEmails admin@contoso.onmicrosoft.com

 2、PnP PowerShell

    PnP PowerShell 跨平台,支持Microsoft 365的SharePoint Online, Microsoft Teams,Microsoft Planner和Microsoft Flow的操作和管理。它是SharePointPnPPowershellOnline的后续模块,SharePointPnPPowershellOnline已经不再维护使用了。

  1)、Install-Module

Install-Module -Name PnP.PowerShell

   或Import-Module(推荐)

Import-Module -Name C:\\pnp.powershell.1.5.0\\PnP.PowerShell.psd1

 2)、Connect-PnPOnline 

Connect-PnPOnline -Url https://contoso-admin.sharepoint.com/ -UseWebLogin

  Notes: 这里使用-UseWebLogin parameter,会弹出Microsoft 365 web Login页面,使用username, password验证登录。

 如果在某种情况下使用Credentials认证,你会发现不一样的惊喜

$username = "admin@contoso.sharepoint.com"
$password = "password"
$cred = New-Object -TypeName System.Management.Automation.PSCredential -argumentlist $userName, $(convertto-securestring $Password -asplaintext -force)

Connect-PnPOnline -Url https://contoso.sharepoint.com -Credentials $cred

 Connect-PnPOnline : AADSTS65001: The user or administrator has not consented to use the application with ID
'31359c7f-bd7e-475c-86db-fdb8c937548e' named 'PnP Management Shell'. Send an interactive authorization request for
this user and resource.

如何解决呢?需要用下列命令:

Connect-PnPOnline -Url https://contoso.sharepoint.com -PnPManagementShell

执行之后,你会收到一个code:

接下来在https://microsoft.com/devicelogin  输入刚刚得到的code,用Microsoft accout 验证,这里需要注意,MS account 必须是application admin role,接下来会弹出给PnP PowerShell授权页面,授予PnPPowerShell所需权限就可以操作Tenant了。

  3)、创建OneDrive Site

New-PnPPersonalSite -Email admin@contoso.onmicrosoft.com

  4)、查看是否创建成功

Get-PnPTenantSite -IncludeOneDriveSites -Filter "Url -like '-my.sharepoint.com/personal/'"

3、 CSOM在NetFramework下的使用

复制代码
using (ClientContext _context = new ClientContext(tenantAdminUrl)) 
{ 
   try
   { 
        SharePointOnlineCredentials _creds = new SharePointOnlineCredentials(userName, ConvertToSecureString(password));
        _context.Credentials = _creds;
        _context.ExecuteQuery(); 
        ProfileLoader _profileLoader = ProfileLoader.GetProfileLoader(_context); 
        _profileLoader.CreatePersonalSiteEnqueueBulk(emailIDs); 
        _profileLoader.Context.ExecuteQuery();
     } catch(Exception ex) 
     {
         throw new Exception(ex.Message);
     }
  }
复制代码

Notes: 为什么只介绍CSOM在NetFramework下的使用呢,因为CSOM 不支持NetCore下创建OneDrive Site,Graph官网目前也只提供Get OneDrive Site方法

 如果项目是NetCore的呢?怎么办???遇到我你是幸运的,我们可以在NetCore下调用SharePoint Online PowerShell,但必须是运行在windows OS下

 Demo Code:

复制代码
 public void PreProvisionOneDriveSites(string username, string password, string spAdminUrl)
 {
    var initial = InitialSessionState.CreateDefault();
    using (Runspace runspace = RunspaceFactory.CreateRunspace(initial))
    {
                runspace.Open();
                try
                {
                    using (var ps = PowerShell.Create())
                    {
                        ps.Runspace = runspace;                   
                        ps.AddCommand("Import-Module");
                        ps.AddParameter("-Name", "C:\\microsoft.online.sharepoint.powershell.16.0.21116.12000\\Microsoft.Online.SharePoint.PowerShell.psd1");
                        ps.AddParameter("-UseWindowsPowerShell");
                        ps.Invoke();
                    }
                    using (var ps = PowerShell.Create())
                    {
                        ps.Runspace = runspace;
                        ps.AddCommand("Connect-SPOService");
                        ps.AddParameter("-Url", spAdminUrl);
                        ps.AddParameter("-Credential", _pnpService.GetCredential(username, password));
                        ps.Invoke();
                    }

                    using (var ps = PowerShell.Create())
                    {
                        ps.Runspace = runspace;
                        ps.AddCommand("Request-SPOPersonalSite");
                        ps.AddParameter("-NoWait", null);
                        ps.AddParameter("-UserEmails", "devtest03@M365x677264.onmicrosoft.com");
                        ps.Invoke();
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    runspace.Close();
                    runspace.Dispose();
                }
    }
}

复制代码
public  PSCredential GetCredential(string username, string password)
{
     var secureString = new SecureString();
     Array.ForEach(password.ToCharArray(), secureString.AppendChar);
     var credential = new PSCredential(username, secureString);
     return credential;
}

 

OK,就先这样吧,如有任何问题,请下方留言!

 

posted @   云霄宇霁  阅读(378)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示