首页 > 解决方案 > 我正在尝试为我的所有 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 中的项目作为字符串传递?

谢谢你的帮助。

标签: powershellinvoke-commandimport-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让您轻松查看其中的内容。


推荐阅读