Powershell 创建文件,安全组和DFS链接

简介:

最近工作需要,需要创建80多个文件夹,300多个对应的安全组,把某部门的一堆用户放进对应的组,然后把这些文件夹都设置成DFS的Target的共享对象,然后拷贝文件。


这些工作手工操作的话实在是太繁琐了,豆子考虑用powershell来实现这些功能,毕竟以后也用得着。这里把我的脚本备忘一下,以便日后参考:


基本思路和实现其实都很简单,有个别地方dos命令和powershell的特殊符号无法直接识别,需要一些小技巧处理:


基本过程

  1. 创建用户组

  2. 添加用户到组

  3. 创建新的共享文件夹,添加成新的DFS对象,配置访问权限

  4. Robocopy 拷贝文件内容



上面4个小任务,豆子很屌丝的写了4个对应的小脚本,当然放在一个里面也是可以实现的。


脚本1就是从某个文件里面读取客户名,然后创建对应的组,然后根据我公司的访问要求进行嵌套,具体情况可以根据实际NTFS的需求来更改。里面的Try Catch我也写的很随意,Catch应该根据具体的报错进行输出,这里我都简单化了。


script 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
$groups import-csv  c:\temp\newgroups.csv
foreach ( $group  in  $groups ){
if ( $group .name  -eq  " "){}
else{
$name1=" group.fs.clients. "+$group.name.trim()
$name2=$name1+" .apollo.rw "
$name3=$name1+" .apollo.ro "
try{
New-ADGroup -Name $name1 -GroupCategory Security -GroupScope Global -DisplayName $name1 -Path " OU=clients,OU=File System,OU=MCU GROUPS, OU=- MCU.LOCAL -,DC=MITCH,DC=MITCHELLS,DC=COM,DC=AU " -Description " Root Folder Group Container "
write-host $name1 "  is created "
}
catch
{
write-host $name1 "  is already created "
}
try{
New-ADGroup -Name $name2 -GroupCategory Security -GroupScope Global -DisplayName $name2 -Path " OU=clients,OU=File System,OU=MCU GROUPS, OU=- MCU.LOCAL -,DC=MITCH,DC=MITCHELLS,DC=COM,DC=AU
write-host $name2 "  is created "
}
catch
{
write-host $name2 "  is already created "
}
try{
New-ADGroup -Name $name3 -GroupCategory Security -GroupScope Global -DisplayName $name3 -Path " OU=clients,OU=File System,OU=MCU GROUPS, OU=- MCU.LOCAL -,DC=MITCH,DC=MITCHELLS,DC=COM,DC=AU
write-host $name3 "  is created "
}
catch
{
write-host $name3 "  is already created "
}
try{
Add-ADGroupmember $name1 $name2,$name3 
write-host $name2 "  and  " $name3 "  are added into  " $name1
}
catch
{
write-host $name2 "  and  " $name3 "  are already into  " $name1
}
try{
Add-ADGroupmember group.dfs.root.business.clients $name1
write-host $name1 "  is added into group.dfs.root.business.clients "
}
catch
{
write-host $name1 "  is already  in  group.dfs.root.business.clients "
}
write-host ""
}

脚本里面读取的文本格式如下所示

wKiom1P6kbfB2ep9AABh9y91qzI259.png


我们可以指定一个日期,然后查看是否成功创建了这些组,比如我是上周5创建的,然后这个博客是周一写的,所以随手查询一下上周四以后我创建的新组是啥


wKiom1P6k5qwI18cAAAhG25m5W0609.png

类似的,第二个脚本就是一个双重循环,添加成员到组就是了,也很简单。trim的目的是为了去掉Excel文档里面的结束空格字符。


script 2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$users = get-content  c:\temp\apollousers.csv
$groups = get-content  c:\temp\apollogroups.csv
foreach ( $user  in  $users ){
$username = $user .trim()
if ( $username  -eq  " ") {
}
else
{
write-host $username
foreach($group in $groups){
try{
add-adgroupmember -identity $group.trim() -member $username
write-host $group
}
Catch
{
write-host " Already added into  " $group.trim()
}
}
}
write-host "  "
}


第三个脚本稍微花了我点时间,因为我里面调用的是DOS命令的icacls来更改权限,不太想用Powershell的set-acl 命令,因为太麻烦,我不想花时间去查.net class。但是 icacls并不能很好的识别powreshell传递的变量,必须用$()的形式才能工作。


另外dfsutil 要求我的服务器必须安装DFS feature, new-smbshare是Powershell 4.0里面的命令,因此只能运行在安装了.net4 的 windows 8 平台之上。


script3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$clients import-csv  c:\temp\dfs1.csv
foreach ( $client  in  $clients ){
if ( $client .name  -eq  " "){}
else{
$name1=" group.fs.clients. "+$client.name.trim()
$name2=$name1+" .apollo.rw "
$name3=$name1+" .apollo.ro "
$dir=" M:\DataDisk_1\DFSLinks\clients- "+$client.name.trim()
$dir2=" \\mitch.mitchells.com.au\business\clients\ "+$client.name.trim()
$dir3=" \\auvicfs00.mitch.mitchells.com.au\clients- "+$client.name.trim()+" $ "
$nswdfs00=" \\aunswdfs00\e$\DFSroot-business\clients\ "+$client.name.trim()
$nswdfs01=" \\aunswdfs01\e$\DFSroot-business\clients\ "+$client.name.trim()
$vicdfs00=" \\auvicdc00\e$\DFSroot-business\clients\ "+$client.name.trim()
$vicdfs01=" \\auvicdc01\e$\DFSroot-business\clients\ "+$client.name.trim()
$perm1=':(R)'
$perm2=':(OI)(CI)(F)'
$perm3=':(OI)(CI)(R)'
$sharename=" clients- "+$client.name.trim()+" $ "
write-host $sharename
mkdir $dir\apollo
New-SmbShare -name " $( $sharename ) " -Path $dir -FullAccess Everyone -cachingmode none
icacls $dir /grant " $( $name1 ) $perm1 "
icacls $dir\apollo /grant " $( $name2 ) $perm2 "
icacls $dir\apollo /grant " $( $name3 ) $perm3 "
dfsutil link add $dir2 $dir3
icacls $nswdfs00 /grant " $( $name1 ) $perm1 "
icacls $nswdfs01 /grant " $( $name1 ) $perm1 "
icacls $vicdfs00 /grant " $( $name1 ) $perm1 "
icacls $vicdfs01 /grant " $( $name1 ) $perm1 "
}
}


创建完了之后,可以通过Share和DFS进行确认。


第四个脚本就是简单的robocopy脚本,我这里不需要保留源文件的权限,所以简单的


robocopy source destination /E 就可以了










本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1544278,如需转载请自行联系原作者
目录
相关文章
|
网络协议 网络安全
Powershell免杀(无文件落地免杀)
无文件落地 顾名思义,无需将恶意文件传到目标服务器/机器上,直接利用powershell的特性加载到内存执行。为了在红队行动中更隐蔽的实施攻击以及横向移动,同时还可以解决目标不出网只能通过dns上线时的棘手问题,利用powershell可以避免一行行echo。 通过两种方式进行无文件落地的免杀,一种是出网的情况,另一种为不出网情况。 声明: 文章内容仅供网络安全爱好者学习使用,请勿用文章中提到的技术或工具做违法的事情,否则后果自负。
1139 0
|
3月前
|
存储 JSON JavaScript
|
3月前
PowerShell快速修改多个文件的名称
【8月更文挑战第28天】在PowerShell中批量重命名文件可通过以下方法实现:1)使用`Rename-Item`命令逐一重命名;2)通过循环批量处理特定模式的文件名更改;3)利用正则表达式进行复杂模式匹配与替换。操作前请确保验证命令并备份文件。
210 1
|
6月前
|
定位技术 Python
PowerShell批量修改、替换大量文件的文件名
PowerShell批量修改、替换大量文件的文件名
134 1
|
6月前
|
前端开发 微服务 Windows
PowerShell 命令窗口执行 pnpm 命令报错 无法加载文件 pnpm.ps1,因为在此系统上禁止运行脚本
PowerShell 命令窗口执行 pnpm 命令报错 无法加载文件 pnpm.ps1,因为在此系统上禁止运行脚本
|
Windows
powershell配置anaconda及解决【无法加载文件C:\Users\xxx\Documents\WindowsPowerShell\profile.ps1,因为在此系统上禁止运行脚本】的问题
powershell配置anaconda及解决【无法加载文件C:\Users\xxx\Documents\WindowsPowerShell\profile.ps1,因为在此系统上禁止运行脚本】的问题
2559 0
|
安全 Linux 网络安全
新一代--Powershell 无文件挖矿病毒
Powershell 无文件挖矿病毒
|
存储 运维 Linux
【运维】PowerShell编程 目录文件相关方法的封装与案例详解
本文实现一个目录管理类,归纳了 Powershell 中常用的文件路径方法。这些方法可以迅速方便的用于 Powershell 编写大型运维脚本中。以简单使用为目的封装常用目录文件操作。完成源代码在作者的github上可以找到。
191 0
|
Web App开发 前端开发 JavaScript
vbs学习,书籍,看书笔记(5) 客户端web脚本 .Power shell 使用 脚本文件的类型2
vbs学习,书籍,看书笔记(5) 客户端web脚本 .Power shell 使用 脚本文件的类型2
vbs学习,书籍,看书笔记(5) 客户端web脚本 .Power shell 使用 脚本文件的类型2
|
Java Shell 程序员
Power Shell 脚本——基于curl自动批量获取FTP服务器上的日志文件
Power Shell 脚本——基于curl自动批量获取FTP服务器上的日志文件
291 0
Power Shell 脚本——基于curl自动批量获取FTP服务器上的日志文件