PowerShell 在普通用户下使用管理员权限运行
在普通用户桌面下使用特定用户权限来运行程序
开始使用一段时间 PowerShell 之后,应该会发现有不少东西是要管理员权限才能运行,但是公司内大部分人的权限不是管理员才是常态。
在 Windows 桌面使用中有个小技巧,就是按着 Shift 再去对程序右键,右键菜单会多出一个以其他用户身份运行,在弹出的对话框里面输入管理员账号,这个程序就会运行在管理员权限下了。
但正常情况下,对着 PowerShell 的.ps1 脚本这样 Shift+右键
是没有这个选项给你的,虽然你可以先 Shift+右键
来以管理员运行 PowerShell.exe
和 PowerShell_ISE.exe
,再去打开.ps1 脚本文件来让.ps1 脚本以管理员权限运行,本来 Shift+右键
就有点麻烦了,这样套娃来运行就更麻烦了。
CMD 脚本的.bat 文件倒是可以用 Shift + 右键来操作,所以有不少简单的脚本我还是会习惯直接拿.bat 来写。
PowerShell 中的 -Credential “凭据”
在 PowerShell 的学习使用中会时不时看到有些命令有这样一个参数 "-Credential"
——“凭据”,这个就是用来让命令以指定用户来运行的参数。
例如:
以指定用户凭据来运行命令
1 | # 弹窗让你输入账号密码获取对应账号的权限 |
这样你就能以你刚刚输入的账号权限来运行 regedit.exe
注册表编辑器了
但是不是所有命令都支持加 "-Credential"
参数的,我希望整个脚本都以管理员运行,有什么方法吗?
检查脚本是否为管理员权限运行,不是就重新以指定用户凭据运行脚本
1 | # 检测是否为管理员权限的函数 |
要是我连账号密码都不想输入,想直接丢给普通用户用,有什么方法吗?
用户凭据账号密码直接写在脚本中
不要把管理员凭据明文写入到脚本中给普通用户使用,这是个极高风险的操作。
1 | # 管理员凭据 |
直接明文也太危险了,有没有更安全一点方法?
用户凭据的密码在本机加密后再取用
首先先把密码给转成安全字符,然后再加密,加密后的密码只有这台计算机才能还原。
1 | # 输入密码转成安全字符串 |
然后到用的时候
1 | # 密码文件路径 |
由于
ConvertTo-SecureString
接受的就是字符串,可以不从文件文件获取,直接写在脚本里也行,例如:
$SecureAdminUserPassword = ConvertTo-SecureString -String "01000000d08c9ddf0115d111……e98c0ab0f1a9f2e251611f9"
但是不推荐这样,你把密码文件分离开来的话,放在共享文件服务器还是什么别的地方,还能用访问权限来保护一下。
反正就是一串字符,能存字符就行,拆开放也行,再加密也行,可以发散一下思路来增加授权限制来间接保护一下,写死在脚本直接一锅端。
安全是安全了,就算加密文件丢了,不在对应的电脑上解密也用不了,但是我又不想每台电脑都生成一次,能不能通用一点?
用户凭据的密码以密钥加密后再取用
1 | # 生成一个随机的Key,随便把导出成文件 |
-key
参数本质上也是字符串数组,也可以直接写进脚本里面,但也是不推荐这样的。
$Key = (3,4,2,3,56,34,254,222,1,1,2,23,42,54,33,233,1,34,2,7,6,5,35,43)
$StandardString = ConvertFrom-SecureString $SecureString -Key $Key
ConvertFrom-SecureString
也可以不用-key
参数,用-SecureKey
,但按文件分开存放的增加限制的思路的话,其实区别不大……
然后到用的时候
1 | # Key文件路径 |
把脚本打包成 exe
除了上面这几中加密分开存放的方面外,还有一个方法可以增加一定的安全性,把脚本打包成 exe。
之前我在 PowerShell 入门教程推荐和常用代码片段 - tjxwork (tjxblog.com) 里面有提到一个 PowerShell 开发工具
SAPIEN PowerShell Studio 强大的 PowerShell GUI 设计器和脚本调试器 (sapien.com)
这个软件可以把 PowerShell 脚本打包成 exe,也可以嵌入凭据,打包出来的 exe 可以按嵌入的凭据来直接运行,他们说嵌入的凭据是加密的。
但有没有脚本内容有没有额外的加密我就没留意了,但总的来说光打包成 exe 这个就能拦住大部分人了,组合起来使用能相对更安全一点。
参考
淺談 PowerShell 中的密碼字串加密處理 - 黑暗執行緒 (darkthread.net)
PowerShell 脚本中的密码 - sparkdev - 博客园 (cnblogs.com)
ConvertFrom-SecureString (Microsoft.PowerShell.Security) - PowerShell | Microsoft Learn
ConvertTo-SecureString (Microsoft.PowerShell.Security) - PowerShell | Microsoft Learn
补充
不管怎么说,把通用的管理员凭据,写入一个或者多个文本文件里面,在普通用户下运行来自动使用。
这种行为总是不太安全的,各种方法混合验证来使用会相对的更安全一点。
毕竟 SecureString Class
安全字符串 这个东西本来就不是非常安全的选择。
平台兼容 / DE0001:不应使用安全字符串 (github.com)
原文作者:tjxwork
原文链接:https://www.tjxblog.com/blog/2023-0005
发布时间:2023-02-15