PowerShell系列八:工具开发
  ymimIgn1vImn 2023年11月02日 43 0

抽象

抽象是一个应对复杂性的工具,抽象可以让复杂的事情简单化,那么抽象是什么呢我的理解是对事物命名。 举个例子:个子小、声音大、元气满满、可爱、极乐净土 = 美依礼芽。 想象一个场景,两个二次元宅男,在讨论"极乐净土"的演唱者。 甲说:"那个 ‘个子小、声音大、元气满满、可爱’ 的女生,唱的 ‘在那明月升起之时,点亮红色的灯笼,点亮红色的灯笼。。。。。。。。。。。。真是太棒了。", 乙说:"我还喜欢 ‘个子小、声音大、元气满满、可爱’ 的女生唱的<青鸟的歌词.........>" 正常情况可能是: 甲说:"美依礼芽的MV极乐净土真是太棒了!" 乙说:"嗯,她的青鸟也超棒!"

需求

IT管理员一个主要的工作就是对各种资源配置权限,文件系统的权限是所有资源中修改权限最频繁的。 配置权限很繁琐,所以希望能开发一个简单的工具,来简化文件系统的权限配置。

  1. 添加用户对文件或目录的访问权限(读,修改,全部)
  2. 移除用户对文件或目录的访问权限
  3. 修改用户对文件的访问权限
  4. 查看用户对文件的访问权限

现状分析

配置文件系统的权限,目前有三种方式:

  1. GUI 文件或者目录的属性->安全->高级。
  2. PowerShell的 'Set-Acl'
  3. icacls实用工具

GUI点击太繁琐,不能批量和自动化。Set-Acl有点反人类,icacls目前是最优选。 如果您去读一下icacls的帮助,Shell中输入 icacls /? 如果没有足够的背景知识,看起来一头雾水,不知道写的是写什么鬼。

开发工具

我们开发一个能够完成需求里的四项的工具

Get-Access
Add-Access
Remove-Access
Reset-Access

思路是我们包装icacls,让它变的更易用,很多工具或者cmdlet都是包装函数。屏蔽了很少用的选项,提供一些默认参数,让完成常见任务变的更容易。 最简单的就是cmdlet就是Reset-Access让我们来完成它。 注意:使用资源的时候判空是一种好习惯。 还原默认权限

function Reset-Access {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]
        $Path
    )
    if(Test-Path $Path)
    {
       if((Get-Item $Path).PSIsContainer){
            icacls $Path /reset /t /c
       }else{
          icacls $Path /reset /c
       }
     }else{
          Write-Warning "$Path 是无效路径,请检查!"
     }
}

查询访问权限

function Get-Access {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]
        $Path,

        [Parameter(Mandatory = $False)]
        $User = $False
    )
    if(Test-Path $Path)
    {
        if(-not $User){
            icacls.exe $Path
        }else{
            if(Get-LocalUser $User -ErrorAction SilentlyContinue)
            {
                if((Get-Item $Path).PSIsContainer){
                    icacls.exe $Path /findsid $User /t 
                }else{
                    icacls.exe $Path /findsid $User
                }
            }
            else{
                Write-Warning "用户 $User 不存在!"
            }
        }
    }else{
        Write-Warning "$Path 是无效路径,请检查!"
    }
}

删除访问权限

function Remove-Access {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]
        $Path,

        [Parameter(Mandatory = $true)]
        [string]
        $User

    )
    try{
        if(Test-Path $Path){
            if(Get-LocalUser $User -ErrorAction SilentlyContinue){                
                if((get-item $Path).PSIsContainer){
                    icacls.exe $Path /inheritance:d /t /c
                    icacls.exe $Path /remove:g $User /t /c
                }
                else
                {
                icacls.exe $Path /inheritance:d /c
                icacls.exe $Path /remove:g $User /c
                }
            }else{
                Write-Warning "用户 $User 不存在!"
            }
        }else{
            Write-Warning "$Path 不是有效路径,请检查。"
        }
    }catch{throw "操作执行失败,可能是完整性级别的问题。"}
}

添加访问权限

function Add-Access {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]
        $Path,

        [Parameter(Mandatory = $true)]
        [string]
        $User,

        [Parameter(Mandatory = $true)]
        [ValidateSet("Read", "Modify", "Full")]
        [string]
        $Access
    )
    if(Test-Path $Path)
    {
        if(Get-LocalUser -Name $User -ErrorAction SilentlyContinue)
        {
            $a = switch ($Access)
                        {
                            'Read' {'R'}
                            'Modify' {'M'}
                            Default {'F'}
                        }
             if((Get-Item $Path).PSIsContainer){
                  icacls $Path /grant "${User}:(OI)(CI)($a)" /t /c
              }else{
                  icacls.exe $Path /grant "${User}:($a)" /c
              }

        }else{
            Write-Warning "用户 $User 不存在!"
        }

    }else{
        Write-Warning "$Path 是无效路径,请检查!"
    }
}

Example

Reset-Access -Path {c:\test | c:\t.txt}
Get-Access -Path {c:\test | c:\t.txt}
Get-Access -Path c:\t.txt -User Bob
Remove-Access -Path c:\t.txt -User Bob
Add-Access -Path c:\t.txt | c:\test -User lucky -Access {Read | Modify | Full}

还有测试和文档,懒得写了,也就是个简单的Demo

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  eHipUjOuzYYH   2023年12月10日   26   0   0
  oIa1edJoFmXP   2023年12月07日   24   0   0
  yx99X8RMvAE0   2023年11月05日   57   0   0
  GjOrjd4Oi2LO   2023年11月19日   33   0   0
  iVwMSWHBbZ8g   2023年11月02日   57   0   0
  8EMeTXf3DiYc   2023年11月02日   57   0   0
  9JCEeX0Eg8g4   2023年11月13日   35   0   0
  pYJRma5xFTve   2023年11月13日   23   0   0
  8EMeTXf3DiYc   2023年11月02日   64   0   0
  OidTDJjkUiJ3   2023年11月02日   35   0   0
  EeGZtZT5Jsfk   2023年11月13日   31   0   0
  6tuRdFP5lxfF   2023年12月06日   28   0   0
  ymimIgn1vImn   2023年11月13日   18   0   0