缘起
需求:根据文本内容批量添加相关权限,相关共享文件夹实际名称与文本提供的名称存在部分差异,但需要根据此类文本批量加入相关权限。
实现效果
首先是如下图的excel表格
然后复制这些内容到文本
根据文本内容批量添加相关权限。
实现方式
对文本内容进行切片,以空格、顿号、逗号、制表符的方式进行划分。然后以匹配关键字的方式如“访问”、“编辑”,进行不同的权限划分。
附源码及地址:
# 定义主目录路径
$baseFolderPath = "C:\共享文件夹" # 基础路径
$userFile = "C:\Users\Administrator\Desktop\权限分配列表.txt" # 替换为实际的 TXT 文件路径
# 读取用户文件的每一行
Get-Content $userFile | ForEach-Object {
# 按空格分隔每一行的内容
# $parts = $_ -split '\s+'
$parts = $_ -split '[\s,\t、]+' # 正则表达式包含空格、制表符、逗号和顿号
if ($parts.Length -ge 8) {
$username = $parts[0]
$folder2 = $parts[5] # 组文件夹
$folder3 = $parts[6] # 公共目录文件夹
$permissionType = $parts[7]
# 设置 NTFS 权限类型
$ntfsPermission = if ($permissionType -like "*访问*") {
"(OI)(CI)(R)" # 只读权限
} elseif ($permissionType -like "*编辑*" -or $permissionType -like "*读写*" -or $permissionType -like "*保存*") {
"(OI)(CI)(M)" # 修改权限
} else {
"(OI)(CI)(R)" # 默认读权限
}
# 设置共享权限类型
$sharePermission = if ($permissionType -like "*访问*") {
"Read" # 共享只读权限
} elseif ($permissionType -like "*编辑*" -or $permissionType -like "*读写*" -or $permissionType -like "*保存*") {
"Change" # 共享更改权限
} else {
"Read" # 默认共享只读权限
}
# 处理 folder2(组文件夹)路径,去掉“组”字
$folder2WithoutGroup = if ($folder2 -like "*组") {
$folder2 -replace "组$", "" # 去掉“组”字(结尾)
} else {
$folder2 # 如果没有“组”字,保持原样
}
# 构建完整的文件夹路径
$fullPath1 = Join-Path -Path $baseFolderPath -ChildPath $folder2 # 原始组文件夹路径
$fullPath2 = Join-Path -Path $baseFolderPath -ChildPath $folder3 # 公共目录文件夹路径
$fullPath3 = Join-Path -Path $baseFolderPath -ChildPath $folder2WithoutGroup # 去掉“组”字后的文件夹路径
# 为每个文件夹路径分配权限
$folders = @($fullPath1, $fullPath2, $fullPath3)
foreach ($folderPath in $folders) {
# 检查文件夹路径是否存在
if (-Not (Test-Path $folderPath)) {
Write-Output "路径 $folderPath 不存在,跳过该路径。"
continue
}
# 使用 icacls 设置 NTFS 权限
icacls "$folderPath" /grant ${username}:$ntfsPermission /t
Write-Host "已为用户 $username 在文件夹 $folderPath 分配 NTFS $ntfsPermission 权限。" -ForegroundColor Yellow
# 检查共享是否存在
$netShareName = (Get-Item $folderPath).Name # 使用文件夹名称作为共享名称
if (Get-SmbShare -Name $netShareName -ErrorAction SilentlyContinue) {
# 如果共享存在,添加共享权限
Grant-SmbShareAccess -Name $netShareName -AccountName "$username" -AccessRight $sharePermission -Force
Write-Host "已为用户 $username 在共享 $netShareName 分配共享 $sharePermission 权限。" -ForegroundColor Yellow
} else {
Write-Output "共享 $netShareName 不存在,跳过共享权限分配。"
}
}
}
else {
Write-Output "行格式不匹配,跳过:$_"
}
}
Write-Output "所有用户权限已成功添加。"
感想
写完这个的脚本,基本上主要的批量加权限的工作内容也搞定了,剩下的也没什么编写脚本的需求,有的估计是简单的批处理。
同事的想法是:在公司待一至二年,写脚本耗费时间过于麻烦,没必要交给下一任处理(和他交接的就是我...),不如把精力放在考证,以及相关专业上精进。
我的想法:尽量让工作轻松点,剩下的时间也好考证什么的。
以前有个HCNP,当然放现在已经很不值钱了,IE也掉价。没办法,不想卷也得卷。
|