抽象
抽象是一个应对复杂性的工具,抽象可以让复杂的事情简单化,那么抽象是什么呢我的理解是对事物命名。 举个例子:个子小、声音大、元气满满、可爱、极乐净土 = 美依礼芽。 想象一个场景,两个二次元宅男,在讨论"极乐净土"的演唱者。 甲说:"那个 ‘个子小、声音大、元气满满、可爱’ 的女生,唱的 ‘在那明月升起之时,点亮红色的灯笼,点亮红色的灯笼。。。。。。。。。。。。真是太棒了。", 乙说:"我还喜欢 ‘个子小、声音大、元气满满、可爱’ 的女生唱的<青鸟的歌词.........>" 正常情况可能是: 甲说:"美依礼芽的MV极乐净土真是太棒了!" 乙说:"嗯,她的青鸟也超棒!"
需求
IT管理员一个主要的工作就是对各种资源配置权限,文件系统的权限是所有资源中修改权限最频繁的。 配置权限很繁琐,所以希望能开发一个简单的工具,来简化文件系统的权限配置。
- 添加用户对文件或目录的访问权限(读,修改,全部)
- 移除用户对文件或目录的访问权限
- 修改用户对文件的访问权限
- 查看用户对文件的访问权限
现状分析
配置文件系统的权限,目前有三种方式:
- GUI 文件或者目录的属性->安全->高级。
- PowerShell的 'Set-Acl'
- 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