我以为我在Powershell方面非常擅长,但是我从来不需要使用用户凭据。 但是,现在我正在找工作,在一次面试中,我被赋予测试任务来编写脚本,该脚本应该:
- 检查用户帐户的可用性和状态(启用/禁用)。
- 检查帐户是否包含在管理员组中
- 如果没有帐户,则创建一个帐户并将其添加到管理员组,选中“禁止更改用户密码”和“密码未过期”框
- 如果该帐户存在,但已被禁用或未包含在Administrators组中,则启用该帐户并将其添加到Administrators组中,选中“拒绝用户密码更改”和“密码未过期”框
- 该脚本不应依赖于操作系统的语言。
我以为没有什么复杂的,所以我决定检查的第一件事是计算机上的Admin用户。 我三思而后行,命令如下:
Get-User admin
然后我得到一个错误
Get-User : "Get-User" , , .
感到有些吃惊,因为我不认识这样有用的命令,并发现
Get-User命令仅在Powershell Console for Exchange中有效。 要使用本地用户,必须使用
Get-Localuser ,对于域
用户必须使用
Get-Aduser 。 意识到自己的错误,我开车去了:
Get-Localuser admin
并得到了答案
Name Enabled Description
好吧,现在检查用户是否在这里并不重要,但是在这里我再次在等待另一个发现。 事实证明,使用条件if语句并不是那么容易。
事实是,如果用户在系统中,则输出的值不是true,而是启用或禁用此帐户的完整数据集,包括用户的名称,描述。 如果没有用户,则powershell会引发错误。 在Internet上闲逛之后,我发现出于这些目的,最好使用
try catch运算符。
$user = 'admin' try { Get-LocalUser $user -ErrorAction Stop | Out-Null write-host $user -foregroundcolor Green } Catch { write-host $user -foregroundcolor Red }
我添加了$用户变量,使更改整个脚本中的用户名更加容易。 ErrorAction Stop是必需的,因此脚本不会由于错误而在此步骤中中断。 签名| 分隔管道步骤,Out-Null将隐藏错误文本输出。 我还添加了带有突出显示的文本输出,以方便检查脚本。
接下来,我想检查该帐户是启用还是禁用。 正如我已经说过的,Get-LocalUser命令生成一整套数据,为了进行验证,我只需要选择一个值为true或false的Enabled参数。 为此,我使用了以下命令:
(Get-LocalUser $user).enabled
确保其正常工作后,我进行了以下检查并添加了用户启用命令。
$user = 'admin' if ((Get-LocalUser $user).enabled -eq "True") { write-host -foregroundcolor Green } else { write-host -foregroundcolor Red Enable-LocalUser $user write-host -foregroundcolor Green }
要启用用户,自然有必要在管理员权限下运行控制台。
在任务的第二段中,有必要确定用户是否是管理员组的成员。 要检查用户是否在特定组中,有一个Get-LocalGroupMember命令。 但是,管理员组的名称与操作系统的语言不同。 因此,我不得不使用标准的SID S-1-5-32-544。 我也尝试了一下。
$user = 'admin' try { Get-LocalGroupMember -SID S-1-5-32-544 -Member $user -ErrorAction Stop | Out-Null write-host $user -foregroundcolor Green } Catch { write-host $user -foregroundcolor Red Add-LocalGroupMember -SID S-1-5-32-544 -Member $user write-host $user -foregroundcolor Green }
如果用户不是该组的成员,则将管理员添加到该组中。
在下一阶段,我的任务是确定用户是否禁用了密码更改设置。 然后我遇到了另一个陷阱。 事实是,如果用户具有不受限制的密码,则PasswordExpires参数不会返回任何值。 并且如果禁用此复选框,则不同的用户将具有不同的密码更改日期。 我仍然想出了一种解决这种情况的方法:
if ((Get-LocalUser $user).PasswordExpires -eq $null) { write-host -foregroundcolor Green } else { write-host -foregroundcolor Red set-LocalUser $user -PasswordNeverExpires:$true write-host -foregroundcolor Green }
接下来,我需要创建一个用户。 我也没想到这里也不会等到我。 使用命令创建用户时
new-LocalUser -User $user -password P@ssW0rD!
返回错误:
"Password". "P@ssW0rD!" "System.String" "System.Security.SecureString".
事实是-password参数应该使用SecureString而不是通常的文本字符串。 为此,我制作了$ password变量并将其转换为securestring。
$password = convertto-securestring "P@ssW0rD!" -asplaintext -force
和脚本本身来创建用户并将其添加到管理员组
new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user
完成的脚本考虑了我通过这种方式获得的所有条件:
$user = 'admin' $password = convertto-securestring "P@ssW0rD!" -asplaintext -force try { Get-LocalUser $user -ErrorAction Stop | Out-Null cls write-host $user -foregroundcolor Green if ((Get-LocalUser $user).enabled -eq "True") { write-host -foregroundcolor Green } else { write-host -foregroundcolor Red Enable-LocalUser $user write-host -foregroundcolor Green } if ((Get-LocalUser $user).PasswordExpires -eq $null) { write-host -foregroundcolor Green } else { write-host -foregroundcolor Red set-LocalUser $user -PasswordNeverExpires:$true write-host -foregroundcolor Green } try { Get-LocalGroupMember -SID S-1-5-32-544 -Member $user -ErrorAction Stop | Out-Null write-host $user -foregroundcolor Green } Catch { write-host $user -foregroundcolor Red Add-LocalGroupMember -SID S-1-5-32-544 -Member $user write-host $user -foregroundcolor Green } } Catch { cls write-host $user -foregroundcolor Red new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user write-host $user -foregroundcolor Green }
投稿后
但是,将管理员密码存储在脚本中并不是最佳的安全做法。 为此,您可以使用密码哈希,而不是密码本身。
$user = 'admin1' $hash = "01000000d08c9ddf0115d1118c7a00c04fc297eb0100000048baf1b47a72d845b4eeda8659da9fd70000000002000000000010660000000100002000000004d2a3bf03aac92c2e172dc002d1fe8759da4655850462aface5c25f52921e05000000000e8000000002000020000000bfa652b6f7cc6845e3cee1831b54ab93dc272d0b2203024c3de8bc4789a2698a10000000923fb50dcf01125913534d0c1ba6d827400000002757df7d8a8b39c8e84b81323acff1d72419580a0022cf610926e5f081a2e895320088d482eb407f8157aad82f091abee7427b357e871d12238a8f74131238e7" $hash $password = ConvertTo-SecureString -String $hash $password new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user
为了获得密码哈希,可以使用以下脚本
$Secure = Read-Host -AsSecureString $Secure $hash = ConvertFrom-SecureString -SecureString $Secure $hash
要求从键盘输入密码。
还有一点奖金可以显示所有禁用的记录
Get-LocalUser | Where-Object {$_.enabled -eq $false}
我希望我花费的时间可以帮助某人的工作。 对于您自己来说,不要忘记这种宝贵的经验会很有用。