powershell - 在 Windows 10 上创建本地用户作为管理员组的一部分
问题描述
设置:
我们都在域环境中。Active Directory 是 Windows Server 2012 R2
客户端工作站混合了 Windows 10 版本(1703 和 1709)
需要在所有工作站上创建用户“Servis”并将其放置到本地管理员组。我将输入一个带有主机名的文本文件。
这是我试图让它工作的脚本,但没有成功。
已创建用户,但未将用户添加到本地管理员组。
这是我得到的错误:
在 WinNT://WS-TEST 上创建 Service23 时出错:检索成员“add”时发生以下异常:“找不到网络路径。
$computers = Get-Content -path C:\Scripts\CreateLocalUser\New\Computers.txt
$username = "Servis"
$password = "P4$$w0rd!@#"
Foreach ($computer in $computers) {
$users = $null
$computer = [ADSI]"WinNT://$computername"
Try {
$users = $computer.psbase.children | select -expand name
if ($users -like $username) {
Write-Host "$username already exists" -ForegroundColor Green
}
Else {
$user_obj = $computer.Create("user", "$username")
$user_obj.SetPassword($password)
$user_obj.SetInfo()
$user_obj.Put("description", "$username")
$user_obj.SetInfo()
$user_obj.psbase.invokeset("AccountDisabled", "False")
$user_obj.SetInfo()
$users = $computer.psbase.children | select -expand name
if ($users -like $username) {
Write-Host "$username has been created on $($computer.name)"
$group = [ADSI]("WinNT://" + $computername + "/administrators,group")
$group.add("WinNT://" + $computername + "/" + $username + ",user")
}
Else {
Write-Host "$username has not been created on $($computer.name)"
}
}
}
Catch {
Write-Host "Error creating $username on $($computer.path): $($Error[0].Exception.Message)"
}
}
解决方案
使用SecureString格式的密码正确定义凭据后,创建本地管理员是一个 2 步过程:
创建用户
将该用户添加到本地管理员组
这几行是所需的powershell代码:
$username = "Servis"
$password = ConvertTo-SecureString -AsPlainText "P4$$w0rd!@#" -Force
New-LocalUser "$username" -Password $password -FullName "$username" -Description "Local admin $username"
Add-LocalGroupMember -Group "Administrators" -Member "$username"
如果你想让你的脚本更健壮,你应该考虑创建一些 Pester 测试并将这些检查添加到你的脚本中:
- 验证您的文件是否存在
- 验证文件的内容(如果是 IP 或带有正则表达式的 FQDN)
- 在连接之前测试主机是否可达(例如 Test-Connection -computername $computer -count 1 -quiet)
- 使用带有计算机名和参数列表(用户名、密码)的调用命令
- 检查用户是否创建成功并且是管理员组的成员,如果没有抛出错误
- 编写一个日志文件以跟踪所有已完成的任务(由谁、何时在什么主机上等)。
如果您有兴趣,我在 www.scriptinglibrary.com 上写了一篇关于完成此任务的更好方法的博客文章。
推荐阅读
- python - 利用 Celery Gevent Worker + RabbitMQ 的全并发
- sql - 关于 coalesce 和 Datediff 的说明(末尾为 0)
- autofac - 在 xunit 测试中触发 MassTransit 消费者时遇到问题
- android - 显示键盘时片段正在向上移动
- apache-flink - 如何将静态(缓存数据)发送到 Flink 中的 Operator 大约每 2 小时刷新一次
- python-3.x - 用 unittest.mock.ANY 填充剩余的 kwarg
- som - SOM 地图和集群树状图在 R 中不匹配?
- python - 特征选择和低 Pearson's R
- java - 列出 AWS Cloud Directory 中对象的 GrandChildern 和 GrandParents
- jquery - JQuery单击以使用陷入循环的数组来识别元素