文档章节

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

 木宛城主
发布于 2015/03/02 19:37
字数 846
阅读 3
收藏 0
点赞 0
评论 0

这是对上一篇文章《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

© 著作权归作者所有

共有 人打赏支持
粉丝 2
博文 222
码字总数 199010
作品 0
黄浦
PowerShell的内网渗透之旅(一)

  内网渗透一直以来都是一个热门话题,试想在一个大型的内网环境下,当我们拿到了内网windows机器后,我们该如何通过他们去获取更多的所需资源,这就需要我们进行内网渗透了。然而在内网渗...

FreeBuf ⋅ 05/14 ⋅ 0

PowerShell管道和括号——PowerShell从零开始系列之六

本期主要介绍多个命令之间的衔接——管道 PowerShell通过管道把命令互相连接起来,通过传输第一个命令,将其作为第二个命令Cmdlet的输入,使其联合运行 应用管道符可以极大的提高效率,原本需...

Liuzw_37 ⋅ 05/08 ⋅ 0

【Powershell】早期操作系统如何更新安装Windows PowerShell 4.0

http://social.technet.microsoft.com/wiki/contents/articles/21016.how-to-install-windows-powershell-4-0.aspx Windows PowerShell 4.0 is part of the Windows Management Framework 4.......

xifalniang ⋅ 2016/09/02 ⋅ 0

使用 Ansible 管理 Windows

前言 本文主要介绍在如何使用 Ansible 管理 Windows 客户端,Ansible 官方提供了一个很方便的安装脚本,对于外网用户来说安装真的很轻松,可惜我遇到的问题是如何在内网部署,有相同烦恼的小...

xjtuhit ⋅ 06/01 ⋅ 0

PowerShell 在线教程

https://www.pstips.net/powershell-online-tutorials PowerShell 在线教程 本文目录 Powershell交互式 Powershell变量 Powershell数组和哈希表 Powershell管道 Powershell使用对象 Powershe......

chenhao_asd ⋅ 05/25 ⋅ 0

AD域控中的 powershell 命令

PS C:Usershongzhi> Get-Help get-* Name Category Synopsis ---- -------- -------- Get-Verb Function Get-Verb [[-verb] ] [-Verbose] [-Debug] [-ErrorAction ] [-WarningAction......

122269875 ⋅ 05/21 ⋅ 0

输入、过滤和输出——PowerShell三分钟(八)

今天的三分钟给大家归纳一下PowerShell日常对数据的输入过滤和输出的处理 PowerShell输入数据的方式有很多种,包括直接输入字符、导入数据、捕获界面输入等 对于较少的信息,可以直接手工在P...

Liuzw_37 ⋅ 05/28 ⋅ 0

Situational Awareness

原文:https://pentestlab.blog/2018/05/28/situational-awareness/ 传统的内部侦察测试使用Windows内置命令,如net view、net user等,以获取主机和域信息。因为蓝色团队可以监视这些命令并...

招魂怪 ⋅ 06/15 ⋅ 0

Powershell内网渗透利器之PowerSploit

  0×00 过渡   之前提到当在执行powershell脚本时,由于默认策略的缘故,是会报错的,因此也出现了几种逃过的情况:   本地权限绕过:PowerShell.exe -ExecutionPolicy Bypass -File ...

FreeBuf ⋅ 05/16 ⋅ 0

PowerView:一个可以帮助你躲避检测的内网信息收集脚本

  一旦我们渗透进了内网,我们往往需要尽可能多的了解以及收集内网的信息,这将决定我们下一步的提权和渗透行为。而在内部侦察中,传统的方式是使用Windows内置命令(如net view,net use...

FreeBuf ⋅ 06/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

内核线程、轻量级进程、用户线程

线程与进程概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位 一个进程的组成...

117 ⋅ 18分钟前 ⋅ 0

elasticsearch2.4.6升级为elasticsearch-5.5.0的经历

将elasticsearch-5.5.0 中的配置 path.data 指向原来的数据路径 即 path.data: /usr/local/src/elasticsearch-2.4.6/data 注意: elasticsearch-5.5.0 需要将jdk版本升级到1.8...

晨猫 ⋅ 19分钟前 ⋅ 1

lvm讲解 磁盘故障小案例

1

oschina130111 ⋅ 23分钟前 ⋅ 0

那些提升开发人员工作效率的在线工具

本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的。 Hollis偏爱使用...

时刻在奔跑 ⋅ 35分钟前 ⋅ 0

restful风格 实现DELETE PUT请求 的web.xml的配置

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframe......

泉天下 ⋅ 40分钟前 ⋅ 0

Shell数组

Shell数组 Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数...

蜗牛奔跑 ⋅ 50分钟前 ⋅ 0

nmap为了开发方便 可以做简单的修改

因为nmap扫描是默认使用的是nse脚本,但是在开发的过程中需要修改后缀(主要是因为后缀为lua才能显示高亮,所以这里用一个取巧的办法) nse_main.lua文件中我们找到如下代码 local t, path = cn...

超级大黑猫 ⋅ 54分钟前 ⋅ 0

springmvc获取axios数据为null情况

场景:前端用了vue没有用ajax与后台通信,用了axios,但是在代码运行过程中发现axios传递到后台的值接受到数据为null。 问题原因:此处的问题在与axios返回给后台的数据为json类型的,后台接...

王子城 ⋅ 56分钟前 ⋅ 0

hadoop技术入门学习之发行版选择

经常会看到这样的问题:零基础学习hadoop难不难?有的人回答说:零基础学习hadoop,没有想象的那么难,也没有想象的那么容易。看到这样的答案不免觉得有些尴尬,这个问题算是白问了,因为这个...

左手的倒影 ⋅ 56分钟前 ⋅ 0

806. Number of Lines To Write String - LeetCode

Question 806. Number of Lines To Write String Solution 思路:注意一点,如果a长度为4,当前行已经用了98个单元,要另起一行。 Java实现: public int[] numberOfLines(int[] widths, Str...

yysue ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部