吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 926|回复: 29
上一主题 下一主题
收起左侧

[其他原创] 【powershell】域用户人员增删、文件授权、组织单元与域用户恢复

  [复制链接]
跳转到指定楼层
楼主
hoochanlon 发表于 2024-10-28 11:24 回帖奖励

前言

本次内容非常多,花费了一个月左右,从现状需求到代码实现,额外花了三天,在家写好了文章。在虚拟机上域环境 CSYLQ 测试,做好的代码现已上线生产域控,逻辑都是相通的。

这次还学到了一手如何恢复删除的组织单元与域用户,收获颇多,也分享出来。这一系列操作,拆分成多篇文章的话,就会显得太零散,不系统。为了完整性还是尽量写全一点。

所有操作已整理成 powershell 模板,模板地址:https://github.com/hoochanlon/scripts/tree/main/d-pwsh-dc

三大主题:

  1. 批量添加、删除域用户
  2. 批量对人员进行文件夹授权
  3. 组织单元与域用户还原

批量添加、删除域用户

缘起

由于每个消费业务的同事都需要登录域用户上机操作的,分配不同的组长,因此有着不同组长共享文件夹访问权限,以及通用的质检文件夹访问权限,这就需要根据人事已提供的 ”域控权限申请登记表“,繁复的进行对人员的域账户添加及相关文件授权。

批量添加域用户

一、以添加新用户到组织单元【生产团队】里的子级【售后】单元为例

二、域名以 CSYLQ 为例

三、初始密码固定,登录需要更改初始密码,域用户都在其业务的组织单元内。

# 导入Active Directory模块
Import-Module ActiveDirectory

# 测试一行命令
# New-ADUser -Name "王光光" -SamAccountName "王光光" -UserPrincipalName "王光光@CSYLQ.com" `
#            -Path "OU=消费业务,OU=生产团队,DC=CSYLQ,DC=com" -GivenName "光光" -Surname "王" `
#            -AccountPassword (ConvertTo-SecureString "Mima12345" -AsPlainText -Force) `
#            -Enabled $true -ChangePasswordAtLogon $true

<# 参考资料:https://learn.microsoft.com/en-us/powershell/module/activedirectory/new-aduser?view=windowsserver2022-ps #>

# 读取txt文件中的用户列表
$filePath = "C:\Users\Administrator\Desktop\添加用户.txt"  # 替换为实际的文件路径
$userList = Get-Content -Path $filePath  # -Encoding UTF8

# 固定密码
$password = "Mima12345"

# 循环处理用户列表
foreach ($userName in $userList) {
    # 尝试创建用户
    try {
        New-ADUser -Name $userName -SamAccountName $userName -UserPrincipalName "$userName@csylq.com" `
                   -Path "OU=售后,OU=生产团队,DC=CSYLQ,DC=com" `
                   -AccountPassword (ConvertTo-SecureString $password -AsPlainText -Force) `
                   -Enabled $true -ChangePasswordAtLogon $true

        Write-Host "用户 $userName 已成功创建。"
    } catch {
        Write-Host "创建用户 $userName 时发生错误: $_"
    }
}

# 暂停脚本
Read-Host "按 Enter 键继续..."

批量删除域用户

# 导入Active Directory模块
Import-Module ActiveDirectory

# 读取txt文件中的用户列表
$filePath = "C:\Users\Administrator\Desktop\删除用户.txt"  # 替换为实际的文件路径
$userList = Get-Content -Path $filePath # -Encoding UTF8

# 循环删除用户
foreach ($user in $userList) {
    try {
        Remove-ADUser -Identity $user -Confirm:$false -ErrorAction Stop
        Write-Host "已删除用户: $user"
    } catch {
        Write-Host "用户 $user 不存在,已忽略错误。"
    }
}

# 暂停脚本
Read-Host "按 Enter 键继续..."

批量对人员进行文件夹授权

相关要求:

  • 读取权限说明:共享权限:读取;安全权限(NTFS权限)读取。
  • 编辑、读写权限说明:共享权限:读取、更改;安全权限:读取、读取和执行、列出文件内容、修改、写入。

质检文件夹权限是通用的,所以可以做成规模化的脚本执行。组员不同所属组长的文件夹权限,可以用简单的命令形式执行。

单个文件夹批量授权

起手

从最简单的起手,单个用户设置文件夹权限。其他相关处理,可参考这篇文章:suv789 - 当使用 PowerShell 管理 Active Directory(AD)域用户时,以下是一些初级的示例和操作:PowerShell 在进行 AD 域用户管理时的强大功能和灵活性。PowerShell 在自动化和管理 Active Directory 域用户方面的强大能力,能够高效处理复杂的管理任务和安全操作

<#安全权限#>

# 安全权限设置为只读。
icacls "C:\共享文件夹\谢多意组" /grant "csylq\王诗语:(OI)(CI)(R)" /t # /t 表示递归

# 安全权限设置为编辑
icacls "C:\共享文件夹\樊小华" /grant "csylq\王诗语:(OI)(CI)(M)" /t

# 安全权限设置为读取、读取和执行、列出文件内容
icacls "C:\共享文件夹\谢多意组" /grant "csylq\王诗语:(OI)(CI)(RX)" /t

# 删除用户文件夹权限
icacls "C:\共享文件夹\谢多意组" /remove "csylq\王诗语" /t

<#共享权限#>

# 读写权限
Grant-SmbShareAccess -Name "樊小华组" -AccountName "csylq\王诗语" -AccessRight Change -Force

# 只读权限
Grant-SmbShareAccess -Name "谢多意组" -AccountName "csylq\王诗语" -AccessRight Read -Force

# 完全控制
Grant-SmbShareAccess -Name "朱爱梅组" -AccountName "csylq\王诗语" -AccessRight Full -Force

# 删除权限
Revoke-SmbShareAccess -Name "谢多意组" -AccountName "csylq\王诗语" -Force

<#
同一用户不能同时使用 -ReadAccess 和 -ChangeAccess,因为这会产生冲突。
你需要选择一种权限方式,要么是读取,要么是修改(Change 权限已经包含了读取权限)。
所以在这种情况下,给用户直接赋予 Change 权限就足够了,因为它包括读取和写入权限。
之所以精准定位是因为共享名称唯一,共享文件夹改名变成独立的非共享文件夹。
#>
成型

以批量授权用户质检文件夹访问权限只读为例

# 定义共享名称和文件夹路径
$shareName = "质检"  # 共享名称
$folderPath = "C:\共享文件夹\质检"  # 共享文件夹的实际路径
$domainUsersFile = "C:\Users\Administrator\Desktop\质检名单.txt"  # 包含用户的txt文件路径(不带域名)

# 定义域名
$domain = "CSYLQ"

# 读取txt文件,假设每行是一个用户名(不带域名)
$domainUsers = Get-Content -Path $domainUsersFile

foreach ($user in $domainUsers) {
    # 为每个用户加上域名前缀
    $fullUserName = "$domain\$user"

    Write-Host "正在为用户 $fullUserName 添加权限..."

    # 1. 添加共享权限(只读)
    try {
        Grant-SmbShareAccess -Name $shareName -AccountName $fullUserName -AccessRight Read -Force
        Write-Host "共享权限:用户 $fullUserName 已被授予只读访问权限。"
    } catch {
        Write-Host "共享权限:无法为用户 $fullUserName 添加访问权限,可能该用户已存在或发生其他错误。"
    }

    # 2. 添加NTFS权限(只读)
    try {
        # 使用icacls命令授予用户只读权限
        # 显式 vs 继承权限:普通权限界面显示的是显式设置的权限,而“高级”选项中还会显示从父文件夹或其他权限继承而来的权限。
        # $icaclsCommand = "icacls `"$folderPath`" /grant `"${fullUserName}:(R)`" /t" # 隐示权限
        #(OI) 是“对象继承”,表示权限将应用到文件夹内的文件。
        #(CI) 是“容器继承”,表示权限将应用到文件夹内的子文件夹。
        $icaclsCommand = "icacls `"$folderPath`" /grant `"${fullUserName}:(OI)(CI)R`" /t" # 显示权限
        # 将字符串转换为命令
        Invoke-Expression $icaclsCommand
        Write-Host "NTFS权限:用户 $fullUserName 已被授予只读访问权限。"
    } catch {
        Write-Host "NTFS权限:无法为用户 $fullUserName 添加访问权限,可能发生错误。"
    }
}

多个文件夹批量授权

对生产作业1、生产作业2文件夹进行批量授权相关用户读写操作。

# 定义共享名称和文件夹路径
$shares = @(
    # 定义了一个包含两个共享的数组 $shares。在循环中,我们为每个用户和每个共享依次添加权限。
    # 这样,用户将同时获得对“生产作业1”和“生产作业2”两个文件夹的访问权限。
    @{ Name = "生产作业1"; Path = "C:\共享文件夹\生产作业1" },
    @{ Name = "生产作业2"; Path = "C:\共享文件夹\生产作业2" }
)

$domainUsersFile = "C:\Users\Administrator\Desktop\生产作业名单.txt"  # 包含用户的txt文件路径(不带域名)

# 定义域名
$domain = "CSYLQ"

# 读取txt文件,假设每行是一个用户名(不带域名)
$domainUsers = Get-Content -Path $domainUsersFile

foreach ($user in $domainUsers) {
    # 为每个用户加上域名前缀
    $fullUserName = "$domain\$user"

    foreach ($share in $shares) {
        Write-Host "正在为用户 $fullUserName 添加权限到共享 $($share.Name)..."

        # 1. 添加共享权限(只读)
        try {
            Grant-SmbShareAccess -Name $share.Name -AccountName $fullUserName -AccessRight Change -Force
            Write-Host "共享权限:用户 $fullUserName 已被授予 $($share.Name) 的只读访问权限。"
        } catch {
            Write-Host "共享权限:无法为用户 $fullUserName 添加访问权限到 $($share.Name),可能该用户已存在或发生其他错误。"
        }

        # 2. 添加NTFS权限(只读)
        try {
            $icaclsCommand = "icacls `"$($share.Path)`" /grant `"${fullUserName}:(OI)(CI)(M)`" /t" # 显示权限
            # 将字符串转换为命令
            Invoke-Expression $icaclsCommand
            Write-Host "NTFS权限:用户 $fullUserName 已被授予 $($share.Name) 的只读访问权限。"
        } catch {
            Write-Host "NTFS权限:无法为用户 $fullUserName 添加访问权限到 $($share.Name),可能发生错误。"
        }
    }
}

批量删除文件夹权限的未知用户残留

如果用户此前在相关文件夹有对应的共享、安全权限,常规直接删除用户会留下残留,如图。

删除安全权限

删除文件夹未知用户的安全权限
# 定义共享文件夹路径
$folderPath = "C:\共享文件夹\生产作业2"

# 获取文件及文件夹的现有权限
$acl = Get-Acl -Path $folderPath

# 查找并删除所有未知用户(使用 SID 表示的权限)
$acl.Access | Where-Object { $_.IdentityReference -match "^S-1-" } | ForEach-Object {
    $acl.RemoveAccessRule($_)
}

# 应用更改后的 ACL
Set-Acl -Path $folderPath -AclObject $acl

Write-Output "已成功删除文件夹 $folderPath 中的未知用户权限"

删除根目录中所有文件夹中包含未知用户的安全权限
# 定义根文件夹路径
$folderPath = "C:\共享文件夹"  # 替换为实际路径

# 递归遍历指定文件夹及其子文件夹
Get-ChildItem -Path $folderPath -Recurse | ForEach-Object {
    # 获取当前文件或文件夹的 ACL
    $acl = Get-Acl -Path $_.FullName

    # 查找所有未知用户(SID 格式且没有解析为用户名的账户)
    $unknownSIDs = $acl.Access | Where-Object { $_.IdentityReference -match "^S-1-" }

    # 删除每个未知用户的权限
    foreach ($rule in $unknownSIDs) {
        $acl.RemoveAccessRule($rule)
        Write-Output "已删除文件/文件夹 $($_.FullName) 中的未知用户权限: $($rule.IdentityReference.Value)"
    }

    # 将更改后的 ACL 应用到文件或文件夹
    Set-Acl -Path $_.FullName -AclObject $acl
}

Write-Output "已成功删除文件夹 $folderPath 中所有未知用户的安全权限"

删除共享权限

删除未知用户共享权限
# 定义共享名称
$shareName = "生产作业2"  # 替换为实际共享名称

# 获取共享的访问权限
$accessRules = Get-SmbShareAccess -Name $shareName

# 筛选未知用户(匹配 AccountName 包含 SID 的条目)
$unknownSIDs = $accessRules | Where-Object { $_.AccountName -match "S-1-" }

# 遍历并删除每个未知用户的共享权限
foreach ($rule in $unknownSIDs) {
    $unknownSID = $rule.AccountName
    Write-Output "正在删除共享 '$shareName' 中的未知用户权限: $unknownSID"
    Revoke-SmbShareAccess -Name $shareName -AccountName $unknownSID -Force
}

Write-Output "已成功删除共享 '$shareName' 中所有未知用户的权限"

删除所有共享文件夹中的未知用户权限
# 获取所有共享
$shares = Get-SmbShare

# 遍历每个共享
foreach ($share in $shares) {
    $shareName = $share.Name
    Write-Output "正在处理共享文件夹: $shareName"

    # 获取当前共享的访问权限
    $accessRules = Get-SmbShareAccess -Name $shareName

    # 筛选未知用户(匹配 SID 格式的账户)
    $unknownSIDs = $accessRules | Where-Object { $_.AccountName -match "S-1-" }

    # 删除每个未知用户的共享权限
    foreach ($rule in $unknownSIDs) {
        $unknownSID = $rule.AccountName
        Write-Output "  删除共享 '$shareName' 中的未知用户权限: $unknownSID"
        Revoke-SmbShareAccess -Name $shareName -AccountName $unknownSID -Force
    }
}

Write-Output "已成功删除所有共享文件夹中的未知用户权限"

组织单元与域用户还原

组织单元还原

删除组织单元

support.huawei.com - AD上删除OU失败,提示没有权限删除

你没有足够的权限删除,或者该对象受保护,以防止意外删除。

在“Active Directory用户和计算机”窗口中,点击菜单栏上的“查看”,然后选择“高级功能”。这一步是为了显示更多高级选项,包括组织单元的属性设置。

或者右键【查看】选择【高级功能】

在【属性】里反向勾选【防止对象意外删除】

记得转移用户,否则连在组内的用户也会一并删除。

恢复组织单元

有时过滤器条件过于具体,导致无法匹配到对象。例如,如果使用了特定的 samAccountName 或 Name 值,但在AD中不存在这个精确的值,那么搜索将返回空结果。可以尝试 ObjectClass 过滤器,以确保返回所有被删除的OU,而不是基于名称的特定过滤器。

一、查询被删除的组织单元

Get-ADObject -Filter { ObjectClass -eq "organizationalUnit" } -IncludeDeletedObjects -SearchBase (Get-ADDomain).DeletedObjectsContainer

二、找到相关GUID

Restore-ADObject -Identity "e419292d-bbf3-4d9d-9b09-34cac1676367"

域用户还原

恢复域用户以前在文件夹的共享权限及安全权限都会复原,从未知用户变回来的。

恢复域用户

小k2023 - 恢复AD用户误删,给你3种方案!

张三没有删除前 Deleted 后面是空值,同时也可查出一些同名的被删除。

Get-ADObject -Filter {samaccountname -eq " 张三"} -IncludeDeletedObjects

第一种方式

https://learn.microsoft.com/zh-tw/powershell/module/activedirectory/restore-adobject?view=windowsserver2022-ps

Restore-ADObject -Identity fc9ef534-e4b4-4bda-b894-4e91797d233e"" -NewName "张三1" -TargetPath "OU=生产团队,DC=CSYLQ,DC=COM"

第二种方式

https://www.manageengine.cn/ad-recovery-manager/powershell-backup-active-directory-restore-cmdlets.html

(Get-ADObject -SearchBase (get-addomain).deletedobjectscontainer -IncludeDeletedObjects -filter "samaccountname -eq '王诗诗'") | Restore-ADObject -NewName "王诗诗"

恢复账户后,通常需要设置密码强度来启用账户

Set-ADAccountPassword -Identity "王诗诗" -NewPassword (ConvertTo-SecureString -AsPlainText "Mima123" -Force)

Enable-ADAccount -Identity "王诗诗"
  1. 如果操作对象的组织单元也没了,恢复则会报错:由于对象的父类不是未范例化就是被删除了,所以不能执行操作。
  2. 如果重名:试图给目录添加一个名称已在使用中的对象。

图形界面

【管理工具】选择 【active directory 管理中心】(DSAC)

启用回收站

注意:回收站一旦开启将无法禁用,效果还挺好。

免费评分

参与人数 12威望 +1 吾爱币 +32 热心值 +12 收起 理由
arsleeli + 1 + 1 我很赞同!
chenxingfeng + 1 + 1 我很赞同!
soyol + 1 + 1 谢谢提供思路,点赞
iSummerice + 1 + 1 谢谢@Thanks!
windindind + 1 + 1 我很赞同!
苏紫方璇 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ziyerain + 2 + 1 谢谢@Thanks!
Tianmoy + 1 + 1 我很赞同!
_ever_ + 1 + 1 用心讨论,共获提升!
bcmgzht + 1 + 1 我很赞同!
top777 + 1 + 1 谢谢@Thanks!
grekevin + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

  • · 1|主题: 21, 订阅: 0

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
 楼主| hoochanlon 发表于 2024-10-28 12:40 |楼主
ABuSiDeLuoYin 发表于 2024-10-28 12:21
收藏一下,一直不知道windows上这个组织和区域是干嘛用的

加入域,统一分配账户登录,然后组策略集中管理所有主机系统设置。写字楼超过500-600人以上,基本上要用域管理了,200-300号人不加域,工作组也可以管得过来。
推荐
windindind 发表于 2024-10-29 08:17
曾经使用过excel的公式生成批处理命令,然后复制到cmd去执行的方式批量添加域用户
但是批量删除、文件授权以及恢复都没有试过
学到了
沙发
ren9007 发表于 2024-10-28 11:37
3#
lazhou 发表于 2024-10-28 11:38
大佬厉害,下载学习,谢谢大佬分享!
4#
Kls673M 发表于 2024-10-28 11:45
感谢分享, 不过很少用到这套共享
5#
redapple2015 发表于 2024-10-28 11:56
看着功能强大。支持一上了
6#
iismajia 发表于 2024-10-28 11:59
赞一个,收藏起来。
7#
nocky 发表于 2024-10-28 12:08
学习乐,非常有用!
8#
ABuSiDeLuoYin 发表于 2024-10-28 12:21
收藏一下,一直不知道windows上这个组织和区域是干嘛用的
10#
bachelor66 发表于 2024-10-28 13:12
厉害,有没有非域管理的脚本用啊?                  
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-1 06:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表