powershell - 我正在尝试为我的所有 Windows 服务器列出所有登录用户的列表
问题描述
我正在尝试使用 powershell 获取服务器名称列表并列出c:\users
.
我想最终将它写入一个文件,但现在我只是想将它们列出到控制台。
$m = import-csv -Path .\serverlist.csv
$m | Foreach-Object {
$flist = Invoke-Command -Computername $_ -ScriptBlock {
Get-Childitem -Path C:\users -Directory
}
write-host $flist
}
当我尝试运行脚本时,我得到
Invoke-Command : One or more computer names are not valid. If you are trying to pass a URI, use the -ConnectionUri parameter,
or pass URI objects instead of strings.
At C:\Users\omurac\Desktop\scripts\TestSnip\ImportorEachObject.ps1:4 char:32
+ ... { $flist = Invoke-Command -Computername $_ -ScriptBlock {Get-Childit ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (System.String[]:String[]) [Invoke-Command], ArgumentException
+ FullyQualifiedErrorId : PSSessionInvalidComputerName,Microsoft.PowerShell.Commands.InvokeCommandCommand
如果我从 $m 变量执行写入主机,它会显示以下列表:
Name= server1
name=server2
nAME= SERVER3
ETC...
有没有办法确保它将 csv 中的项目作为字符串传递?
谢谢你的帮助。
解决方案
既然已经有了电脑列表,最好这样Invoke-Command
使用
$serverlist = Import-Csv -Path .\serverlist.csv
$folderlist = Invoke-Command -ComputerName $serverlist.name -ScriptBlock {
Get-Childitem -Path C:\users -Directory
}
foreach
这将在每个服务器上异步运行(在 windows powershell 5.1 中默认最多 32 个),而不是在循环中一次运行一个。
默认返回的属性之一是PSComputerName
让您知道哪些文件夹属于哪个服务器。这是上述代码返回的默认成员的完整列表。
Name MemberType
---- ----------
GetType Method
ToString Method
BaseName NoteProperty
LinkType NoteProperty
Mode NoteProperty
PSChildName NoteProperty
PSComputerName NoteProperty
PSDrive NoteProperty
PSIsContainer NoteProperty
PSParentPath NoteProperty
PSPath NoteProperty
PSProvider NoteProperty
PSShowComputerName NoteProperty
RunspaceId NoteProperty
Target NoteProperty
Attributes Property
CreationTime Property
CreationTimeUtc Property
Exists Property
Extension Property
FullName Property
LastAccessTime Property
LastAccessTimeUtc Property
LastWriteTime Property
LastWriteTimeUtc Property
Name Property
Parent Property
Root Property
收集完信息后,$folderlist
您可以查看、导出等。
我想指出/推荐的另一件事是变量的命名。很容易忽略单数和复数变量,我们总是看到一个看起来像这样的循环
foreach($username in $usernames){do something on $usernames}
反之亦然,因此通常的做法是将它们命名为描述性的,就像在我的示例中一样。$serverlist
并$folderlist
让您轻松查看其中的内容。
推荐阅读
- java - TableRow 正在提供反向 TextViews
- java - 多态性 + 重载 - 如何调用子类的多态/重载方法?
- sql-server - Azure Devops,在构建中测试部署
- mysql - 错误 2013 (HY000): 查询期间失去与 MySQL 的连接
- .htaccess - .htaccess - 重写,第一个参数可选
- html - 如何以 HTML 格式提交联系表格并接收电子邮件
- c# - 在 IQueryable 的 Select 语句中是否有 string.Join() 的替代方法?
- oracle - 在Oracle中选择多级类型
- java - Windows 应用程序:切换到嵌套在同一窗口内的 iframe 窗口
- c - gdb false 可以重新创建帧的寄存器吗?