用于查询没有密码提示的远程Windows服务器的PowerShell脚本

时间:2015-02-07 16:03:53

标签: windows powershell

如何编写PowerShell 4.0脚本以返回Windows 2003,2008和2012服务器的虚拟化与物理状态?我想知道这些服务器是否是虚拟的。我想在中央Windows服务器上运行该脚本。该脚本将与远程服务器交互。我知道要在各个服务器上运行的PowerShell命令会告诉我。但我希望它一次检查许多远程服务器。这是我的一个服务器的基本(尚未工作)脚本,但它不起作用:

$ComputerName = "greatServer"
$UserName = "greatServer\jdoe"
$Password = Get-Content C:\Users\jdoe\Documents\password.txt
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $UserName , $Password

Get-WmiObject -Query "select * from win32_computersystem"

这是我得到的错误:

New-Object : Cannot find an overload for "PSCredential" and the argument count: "2".
At C:\Users\jdoe\Documents.pass.ps1:4 char:15 + $Credential = New-Object -TypeName System.Management.Automation.PSCredential -Ar ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo InvalidOperation: (:) [New-Object], MethodException + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

必须使用remove *和比较操作修改最终查询。结果中的制造商将指示它是VMware,Hyper-V还是物理服务器(例如,Dell)。我不需要修改最终查询的帮助。 select *将起作用,假设它可以在远程服务器上运行。

我真的想要帮助解决我遇到的错误。我编写了一个工作脚本,但它要求用户手动输入密码。我只是想帮助使脚本非交互式(并禁止提示)。我没有成功通过密码参数来解决交互式密码输入要求。

保存该密码的文件是否需要加密?这适用于Windows Server 2003的远程服务器吗?我查看了我在网上找到的其他脚本。 “cat C:\ password.txt”部分似乎对我不起作用。我尝试了convertTo-string和securestring选项。这两个都导致了错误。

2 个答案:

答案 0 :(得分:2)

更好的方法是安全地存储凭证。您需要使用将运行脚本的同一用户执行此操作(这意味着您可能必须以运行脚本的serviceaccount身份登录到该服务器)。

无论如何,从那里你可以做到:

$cred = get-credential # Type in the greatserver credential
$cred | Export-Clixml -Path .\cred.xml

在您的脚本中,您现在只需运行

即可加载凭据
$cred = Import-Clixml -Path .\cred.xml

这是将凭据保存到磁盘的推荐方法。显然,如果您要为每个要查询的服务器要求一个唯一的凭据,这将无法正常工作 - 您最好使用域帐户,该帐户是所有服务器的管理员(前提是您的服务器实际连接到域名。)

答案 1 :(得分:0)

查看this script from the Technet Scrip t存储库,它几乎完全符合您的需要。

确定计算机是否为虚拟机的关键是查询Win32_Bios和Win32_ComputerSystem类以检查Bios.Serial和ComputerSystem.Model和Manufacturer。

脚本的工作方式是获取这些查询的结果,然后检查序列号字段是否包含VMware,Xen,Microsoft或其他内容。

要自己创建这样的工具需要做很多工作,因为你需要研究bios,制造商和模型等各个领域的期望,并用脚本做一些繁重的工作来获得正确的答案;我强烈建议您改用此功能。