SharePoint自动化部署,利用PowerShell 导入用户至AD——PART II

这是对上一篇文章《SharePoint自动化部署,利用PowerShell 导出/导入AD中的用户》进行补充。开发时,为了测试和演示,我们往往需要经常性的把用户添加到AD中。数据量小的时候,不麻烦,手动也是可以解决了。但是如果数据量很大时,比如帮助客户导入数据,手动操作就显得不那么乐观了。所以需要借助PowerShell来导入人员(.csv)数据。在上一篇文章中,自动化部署也有这个功能,但由于时间紧张,写得并不是很完善。所以趁今天有空,特此完善更新下。

首先,需要将人员以.csv格式导出,详见前一篇文章,导出的格式如下所示:

接着就是利用PowerShell将用户导入AD指定的Container中,以截图展示,如下所示。

当然,你可以使用Get-Help 来获取帮助,如:Get-Help .\CreateUsersFromCsv1.ps1 -Full,将会显示完整的帮助信息,如下所示:

详细代码

<#
    .Synopsis
        将用户(.csv)自动导入至AD中
    .Description
        利用PowerShell自动将用户导入至AD中,需要在参数配置中指定AdDomain,AdContainer
        如果要用默认的凭据,设置UseLoggedInUsersCredentials=True,
        否则在参数配置中配置Administrator账号和密码。
    .Parameter FullPathOfCsvFile
        用户文件所在位置
    .Parameter UseLoggedInUsersCredentials
        设置是否使用当前已经登录的凭据
    .Outputs
        用户 Chris 创建成功
        用户 Mark  创建成功
        用户 Chen  创建成功
        用户 Jack  创建成功
        用户 Queen 创建成功
        用户 King  创建成功
    .Example
         .\CreateUsersFromCsv1.ps1 -FullPathOfCsvFile "C:\Fuck\temp\Users.csv" -UseLoggedInUsersCredentials $false

#>
param([string] $FullPathOfCsvFile,[bool] $UseLoggedInUsersCredentials)

########################################################参数配置########################################################################################################################################
$AdDomain="Kingdom"                               #提供 Domain Name.Example=> $AdDomain="Kingdom"
$AdUser="Administrator"                           #当$UseLoggedInUsersCredentials=False时,提供 AD Administrator Name.Example=>$AdUser="Administrator"
$AdUserPwd="p@ssw0rd!!!"                             #当$UseLoggedInUsersCredentials=False时,提供 Administrator的密码.Example=>$AduserPwd="p@ssw0rd!!!"
$AdContainer="OU=Staff,DC=Kingdom,DC=com"         #存储区上,用作上下文的根容器。所有查询都在此根下执行,并且所有插入都在此容器中执行.Example=>"OU=Staff,DC=Kingdom,DC=com",请确保它是正确并真实存在
########################################################参数配置#########################################################################################################################################

if(!(Get-PSSnapin|Where-Object{$_.Name -eq "Microsoft.SharePoint.PowerShell"}))
{
    Add-PSSnapin "Microsoft.SharePoint.PowerShell"
}

function Get-ContextPrincipal([string]$ctxDomain,[string]$ctxContainer)
{
        Add-Type -AssemblyName System.DirectoryServices.AccountManagement
        $ct=[System.DirectoryServices.AccountManagement.ContextType]::Domain
        $pc=New-Object System.DirectoryServices.AccountManagement.PrincipalContext($ct,$ctxDomain,$ctxContainer)
        return $pc
    }

function Get-Principal([string]$userName,[string]$userPassword,[string]$ctxDomain,[string] $ctxContainer)
{
        Add-Type -AssemblyName System.DirectoryServices.AccountManagement
        $ct=[System.DirectoryServices.AccountManagement.ContextType]::Domain
        $pc=New-Object System.DirectoryServices.AccountManagement.PrincipalContext($ct,$ctxDomain,$ctxContainer,$userName,$userPassword)
        return $pc
    }

function IsUserExist([System.DirectoryServices.AccountManagement.PrincipalContext] $ctx,[string] $userName)
{
        $curUser=[System.DirectoryServices.AccountManagement.UserPrincipal]::FindByIdentity($ctx,$userName)
        return $curUser -ne $null
    }

function IsNullOrEmpty($str)
{
    if ($str) 
    { 
        return $false
    }
    else
    {
        return $true
    }
}

if([System.IO.File]::Exists($FullPathOfCsvFile) -eq $true)
{
     if(IsNullOrEmpty($AdDomain)){
            Write-Host Domain Name不能为空
            return
     }
     if(IsNullOrEmpty($AdContainer)){
            Write-Host AD Container不能为空
            return
     }
    if($UseLoggedInUsersCredentials)
    {
        $CurrentContext=Get-ContextPrincipal -ctxDomain $AdDomain -ctxContainer $AdContainer
    }
    else
    {
        [bool] $DataValid=$true
        if(IsNullOrEmpty($AdUser)){
            Write-Host AD Admin Name不能为空
            $DataValid=$false
        }
        if(IsNullOrEmpty($AdUserPwd)){
            Write-Host AD Admin 密码不能为空
            $DataValid=$false
        }
        
        if($DataValid)
        {
          $CurrentContext=Get-Principal -userName $AdUser -userPassword $AdUserPwd -ctxDomain $AdDomain -ctxContainer $AdContainer
        }
        else
        {
            Write-Host 传入参数不能为空,请修改。或者使用已登录的用户的凭据,请设置UserLoggedInUsersCredentials为True。详情请 Get-Help .\CreateUsersFromCsv1.ps1查看
            return;
        }
    }

    Import-Csv $FullPathOfCsvFile|ForEach-Object{
        if(IsUserExist -ctx $CurrentContext -userName $_.LogIn)
        {
            Write-Host 用户 $_.LogIn 已经存在
        }
        else
        {
            $newUser=New-Object -TypeName System.DirectoryServices.AccountManagement.UserPrincipal($CurrentContext,$_.LogIn,$_.Password,$_.PasswordNeverExpires)
            $newUser.UserPrincipalName=$_.LogIn
            $newUser.GivenName=$_.FirstName
            $newUser.DisplayName=$_.FirstName+" "+$_.LastName
            $newUser.Name=$_.FirstName+" "+$_.LastName
            $newUser.EmailAddress=$_.Email
            $newUser.Surname=$_.LastName
            $newUser.PasswordNeverExpires=$_.PasswordNeverExpires
            $newUser.Save()
            Write-Host 用户 $_.LogIn 创建成功
        }
    }
       Write-Host 命令执行结束
}
else
{
    Write-Host 无效的文件路径
    Write-Host 请入有效的文件路径
}

 参考实现

http://www.ashokraja.me/post/Power-Shell-Script-to-Create-Users-in-SharePoint-Dev-Environment.aspx http://msdn.microsoft.com/zh-cn/library/bb383475(v=vs.110).aspx http://msdn.microsoft.com/zh-cn/library/bb348316(v=vs.110).aspx

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰童鞋骚年

设计模式的征途—19.命令(Command)模式

在生活中,我们装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制一些电器的打开和关闭,例如电灯或换气扇。在购买开关时,用户并不知道它将来到底用于控制什...

682
来自专栏木宛城主

基于Socket的网络聊天室编程(第一版)

一:什么是套接字 在网络编程中最常用的方案便是Client/Server (客户机/服务器)模型。在这种方案中客户应用程序向服务器程序请求服务。一个服务程序通常...

2895
来自专栏一个爱瞎折腾的程序猿

在asp.net core2.1中添加中间件以扩展Swashbuckle.AspNetCore3.0支持简单的文档访问权限控制

在此之前的接口项目中,若使用了 Swashbuckle.AspNetCore,都是控制其只在开发环境使用,不会就这样将其发布到生产环境(安全第一) 。 那么,...

1711
来自专栏Core Net

ASP.NET Core 2.1 : 十四.静态文件与访问授权、防盗链

我的网站的图片不想被公开浏览、下载、盗链怎么办?本文主要通过解读一下ASP.NET Core对于静态文件的处理方式的相关源码,来看一下为什么是wwwroot文件...

1712
来自专栏技术博客

Asp.Net Mvc3.0(MEF依赖注入实例)

在http://www.cnblogs.com/aehyok/p/3386650.html前面一节主要是对MEF进行简单的介绍。本节主要来介绍如何在Asp.Ne...

952
来自专栏我有一个梦想

设计模式学习笔记-命令模式

1. 概述   将一个请求封装为一个对象(即我们创建的Command对象),从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的...

20210
来自专栏有趣的django

Django rest framework源码分析(4)----版本

版本  新建一个工程Myproject和一个app名为api (1)api/models.py from django.db import models c...

3756
来自专栏DOTNET

ASP.NET MVC编程——验证、授权与安全

1 验证 一般采用表单验证完成登陆验证,建议结合SSL使用。为限制控制器只能执行HTTPS,使用RequireHttpsAttribute 2 授权 对账户的...

3656
来自专栏程序你好

不同的.Net版本客户端软件调用Java Web Service区别

最近的系统中需要.Net开发的离线端软件通过Web Service技术和Java开发的在线系统进行数据交互。

1183
来自专栏黑泽君的专栏

SolrCloud搭建 + zookeeper集群搭建 + 搜索功能切换到集群版 + httpclient学习 + 全局异常处理器

索引集合包括两个Shard(Shard1和Shard2),Shard1和Shard2分别由三个Core组成,其中一个Leader两个Replication,L...

1962

扫码关注云+社区

领取腾讯云代金券