吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 338|回复: 6
上一主题 下一主题
收起左侧

[其他原创] 【powershell】转换文件夹安全权限为对应的共享权限(项目)

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

背景

需求:公司域控及共享服务器硬件升级,由普通的台式主机更换成专业的服务器。这就需要搭建备域控,并对共享文件进行完整的迁移。

文件迁移工具实测后对比

FMST

看了 虎头 - 利用FSMT进行文件服务器迁移及整合 提到的FSMT,光是找资源都费了老半天,在server2019上使用较为麻烦,需要额外安装 .net2.0,以及界面老旧,看英文也挺不方便。安装上了,但操作有报错提示,于是不再深究,直接换方案了。

Windows迁移工具

老收藏家 - 浅谈NTFS权限迁移与共享权限迁移(上) 提到安装 ,也就是Windows迁移工具。

当时安装完,使用时一直处于以下状态,于是也放弃了。

  • 正在打开连接。请在目标服务器上运行 Receive-SmigServerData。
  • 正在打开连接。请在源服务器上运行 Send-SmigServerData。
  • Send-SmigServerData : 开始连接的传输失败。
  • 此 cmdlet 无法连接到目标服务器。有关详细信息,请转到 Windows Server 2016 TechCenter,参阅《文件服务迁移指南》中“疑难解答”部分的“数据迁移连接”。

其他方法

老收藏家 - 浅谈NTFS权限迁移与共享权限迁移(下) 提到的 Permcopy 使用效果不理想,以及相关搜索到的注册表导入的方式,也行不通。

编写脚本实现

Robocopy可虽然以保留NTFS安全权限,但共享权限需要重新设置。,且在其他工具使用不理想的情况下,开始编写脚本实现。

于是方案成型:Robocopy + powershell

共享文件夹权限规则:

  • 共享“读取” ;安全仅勾选“只读”。
  • 共享“读取”、“更改”;安全权限“读取”、“列出文件内容“、”读取和执行“、”修改“、”写入“。

在只有用户安全权限配置的基础上转成对应的共享权限,也就是安全权限为”只读“,转成共享权限”读取“。

编写脚本实现安全权限转换对应的共享权限,首先打开共享设置

共享文件夹的名称往往与文件夹的实际名称相同,一来是系统默认便是如此,二来方便管理。

附源码及地址:

# 接收用户输入的文件夹路径
$folderPath = Read-Host -Prompt "请输入文件夹路径(例如:C:\共享文件夹\质检)"

# 接收用户输入的共享名称
$shareName = Read-Host -Prompt "请输入共享名称(例如:质检)"

try {
    # 获取文件夹的 NTFS 安全权限
    $acl = Get-Acl -Path $folderPath

    # 禁用文件夹的权限继承,并将现有的继承权限转换为显式权限
    $acl.SetAccessRuleProtection($true, $false)
    Set-Acl -Path $folderPath -AclObject $acl
    Write-Output "已禁用权限继承并设置显式权限。"
} catch {
    Write-Output "获取文件夹权限或禁用继承时出错: $_"
    exit
}

# 建立有效的 NTFS 用户权限列表
$ntfsUsers = @{ }

foreach ($access in $acl.Access) {
    $user = $access.IdentityReference.Value
    $permissions = $access.FileSystemRights.ToString()

    if ($permissions.Contains("FullControl")) {
        $ntfsUsers[$user] = "Full"
    }
    elseif ($permissions.Contains("Modify")) {
        $ntfsUsers[$user] = "Change"
    }
    elseif ($permissions.Contains("ReadAndExecute") -or $permissions.Contains("Read")) {
        $ntfsUsers[$user] = "Read"
    }
    else {
        Write-Output "未匹配权限类型:$permissions,跳过用户 $user 的共享权限设置"
    }
}

# 定义例外列表,仅适用于 NTFS 权限(不加入共享权限)
$exceptionList = @(
    "CREATOR OWNER", 
    "SYSTEM", 
    "Users", 
    "Administrators", 
    "BUILTIN\Administrators", 
    "NT AUTHORITY\SYSTEM", 
    "NT AUTHORITY\Authenticated Users"
)

try {
    # 清除现有的共享权限,确保只为 NTFS 权限中非例外用户添加共享权限
    Get-SmbShareAccess -Name $shareName | ForEach-Object {
        Revoke-SmbShareAccess -Name $shareName -AccountName $_.AccountName -Force
    }
    Write-Output "已清除现有共享权限。"

    # 设置共享权限为 NTFS 权限中非例外用户的权限
    foreach ($user in $ntfsUsers.Keys) {
        if (-not $exceptionList.Contains($user)) {
            try {
                # 检查用户是否为SID格式(避免没有账户名的错误)
                if ($user -match "^S-\d-\d+-(\d+-){1,14}\d+$") {
                    Write-Output "跳过SID格式用户 $user 的共享权限设置。"
                } else {
                    Grant-SmbShareAccess -Name $shareName -AccountName $user -AccessRight $ntfsUsers[$user] -Force
                    Write-Output "已为用户 $user 设置共享权限:$ntfsUsers[$user]"
                }
            } catch {
                Write-Output "为用户 $user 设置共享权限时出错(账户名与安全标识无映射): $_"
            }
        }
    }
} catch {
    Write-Output "清除共享权限时出错: $_"
}

try {
    # 移除非 NTFS 列表中的用户,并为例外用户添加自定义 NTFS 权限
    foreach ($access in $acl.Access) {
        $user = $access.IdentityReference.Value
        if (-not $ntfsUsers.ContainsKey($user) -and -not $exceptionList.Contains($user)) {
            $acl.RemoveAccessRule($access)
            Write-Output "已移除用户 $user 的NTFS权限"
        }
    }

    # 删除 Everyone 的共享和 NTFS 权限
    Revoke-SmbShareAccess -Name $shareName -AccountName "Everyone" -Force
    $acl.Access | Where-Object { $_.IdentityReference -eq "Everyone" } | ForEach-Object { $acl.RemoveAccessRule($_) }
    Write-Output "已删除 Everyone 的共享和 NTFS 权限。"

    # 添加例外列表中的系统账户权限
    $usersRule = New-Object System.Security.AccessControl.FileSystemAccessRule("Users", "ReadAndExecute, ListDirectory, Read", "ContainerInherit, ObjectInherit", "None", "Allow")
    $adminsRule = New-Object System.Security.AccessControl.FileSystemAccessRule("BUILTIN\Administrators", "FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
    $systemRule = New-Object System.Security.AccessControl.FileSystemAccessRule("NT AUTHORITY\SYSTEM", "FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
    $creatorOwnerRule = New-Object System.Security.AccessControl.FileSystemAccessRule("CREATOR OWNER", "FullControl", "ContainerInherit, ObjectInherit", "InheritOnly", "Allow")

    # 将新的规则添加到 ACL 中
    $acl.AddAccessRule($usersRule)
    $acl.AddAccessRule($adminsRule)
    $acl.AddAccessRule($systemRule)
    $acl.AddAccessRule($creatorOwnerRule)

    # 将更改后的 ACL 应用到文件夹
    Set-Acl -Path $folderPath -AclObject $acl
    Write-Output "共享和 NTFS 权限设置已完成,保留了系统级用户,并已删除多余的成员。"
} catch {
    Write-Output "设置或更新 NTFS 权限时出错: $_"
}

最后

这次域控及共享服务器迁移项目,让我印象最深的有四件事:

  1. 服务器组建 RAID 的过程。网上的操作大多是常规流程,按部就班地在 BIOS 中配置好,一切流程看似顺利,没有遇到任何报错参考。结果实际操作起来,折腾了一整天,最后咨询服务器供应商才发现,原来是 RAID 驱动下载错了,而且正确的驱动也没加载上。

  2. 做了域控替换项目后才了解到,企业域控主机不仅仅只做域控,通常还配置了其他功能,比如文件共享。根据以上,我猜测要是有些企业在域控上安装了 ERP、MES 等服务端应用,这无疑大大增加了迁移的复杂性,真是非常让人头大的一件事。

  3. 在项目即将启动时,就需要提前收集相关资料,联系项目中涉及的应用负责人和使用人员,做好整体规划和统筹。同时,需要与供应商沟通,获取实施报价及相关技术支持。这些工作量往往很大,难以由一人完成,因此应及时向领导反馈需求,以确保获得充分的支持。

  4. 写 word 文档、排版真的好累,像在考公、考高项写论文...

实际项目往往需要综合考虑多方面因素,而不仅仅是解决单一问题。项目的成功依赖于人力、物力的合理配置以及各个流程的协调推进,只有在这些环节逐步完成后,项目才能顺利上线。在写项目方案的过程中,还涉及文字排版的问题,在咨询相关排版专业人士后,总算妥善解决。

项目已在上周顺利完成,耗时1.5周左右,最终方案已交稿审阅。所以,这次就发我写的项目方案模板,略加修改就可以用了,方案效果排版如图:

该方案也能给坛友在word文字排版、项目流程处理上的一些参考。文字排版可照瓢画葫芦,思路方面,我个人经验,按这个思路顺序做方案:

  1. 实施背景
  2. 方案思路及操作步骤
  3. 可能出现的问题及影响和应对
  4. 计划实施时间
  5. 已出现的难点和问题解决
  6. 总结

相对来说,这样有助于更快地积累项目经验,也能在面试或方案展示中条理清晰地表达思路和细节。

域控及文件共享服务器迁移方案v_YYYYMMDD.rar

146.3 KB, 下载次数: 9, 下载积分: 吾爱币 -1 CB

点评

必须的肯定 这么优秀的教程  发表于 2024-11-13 09:26

免费评分

参与人数 2吾爱币 +9 热心值 +2 收起 理由
q314956820 + 2 + 1 我很赞同!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

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

沙发
frh35860 发表于 2024-11-12 13:00
哇~很棒的样子,共享服务器是不是也要添加对应的用户名?
3#
kevinyou816 发表于 2024-11-12 13:12
4#
zhouhehe 发表于 2024-11-12 13:21
5#
 楼主| hoochanlon 发表于 2024-11-12 13:26 |楼主
frh35860 发表于 2024-11-12 13:00
哇~很棒的样子,共享服务器是不是也要添加对应的用户名?

共享服务器没做专门的共享服务器配置,就是做了简单的文件夹共享。共享文件肯定需要对应的用户名的,然后根据他的职务设定具体哪个文件夹权限,是读写还是只读。
6#
RYL959 发表于 2024-11-12 13:38
感谢分享!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-22 10:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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