我目前正在编写一个PowerShell脚本,用于从服务器列表上的本地管理员组中远程删除用户。CSV标头是Computer和Name。对于用户(名称)的每个条目,都与服务器(计算机)匹配。
前男友。
Computer,Name
Server1,User1
Server1,User2
Server2,User1
脚本:
$List = Import-CSV C:\temp\LocalAdmin.CSV
$user = $List.Name
$objGroup = $List.Computer
write-host "Removing user" $user "from server" $objGroup "local admin group:" -ForegroundColor Green
Invoke-Command -ComputerName $objGroup -ScriptBlock {Remove-LocalGroupMember -Group "Administrators" -Member $using:user }
write-host "Completed."
当脚本运行时,它在第一次运行时运行得非常好,但随后它逐行运行脚本,以确定有多少行导致它多次尝试删除用户。有人能帮我修正一下这个逻辑吗?这几乎就像是将CSV读取为数组而不是列表。我很感谢你的帮助!
2条答案
按热度按时间xwbd5t1u1#
我会说:
没有经过测试,但这应该是您的起点。
hfyxw5xn2#
至于你尝试了什么:
假设
$List
包含对象的数组,每个元素包含一个表示CSV文件行的对象,$List.Name
和$List.Computer
类似地返回数组的属性(列)值,这由PowerShell的member-access enumeration提供因此,
$using:user
指的是所有用户名的数组,跨所有服务器。虽然
Remove-LocalGroupMember
的-Member
参数接受数组,但您的方法有两个问题:-ErrorAction Ignore
忽略这一点)。由于给定的服务器名称可能在CSV中出现*多次**,因此从第二次调用该服务器开始,目标用户就已经被删除了--这就是您看到的问题。
TheStingPilot's helpful answer提供了一个有效的解决方案:逐个循环表示CSV行的对象,并为每个目标服务器调用
Invoke-Command
,手边只有用户名。这种方法的缺点是,当您将多个计算机名传递给
Invoke-Command
的-Computer
参数(默认情况下,一次最多可并行定位32台计算机;您可以使用以下命令修改该数字)时,您会放弃并行执行的好处,这取决于目标计算机的数量-ThrottleLimit
)。要避免对给定服务器的多次调用,同时保留并行执行的好处:
Invoke-Command
调用,并让每台远程计算机在其中查找相关用户名并对其执行操作。