2015-02-07 25 views
0

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

$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 

最后的查询将有通过删除*和比较操作进行修改。结果中的制造商会指出它是VMware,Hyper-V还是物理服务器(例如Dell)。我不需要修改最终查询的帮助。 select *将假定它可以在远程服务器上工作。

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

保存该密码的文件是否需要加密?这可以在Windows Server 2003的远程服务器上工作吗?我回顾了我在网上找到的其他脚本。 “cat C:\ password.txt”部分似乎不适合我。我尝试了convertTo-string和securestring选项。这两个也造成了错误。

回答

2

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

总之,从那里你可以这样做:

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

在你的脚本,现在可以装载凭证只需通过运行

$cred = Import-Clixml -Path .\cred.xml 

这是坚持凭证到磁盘的推荐方式。显然,如果你需要为每个你想查询的服务器提供一个唯一的证书,那么这样做效果不好 - 你最好使用一个域帐户,它是所有服务器上的管理员(假设你的服务器实际上被连接到了一个域)。

+0

当我把这行写入脚本时, 'code' $ cred | Import-Clixml -Path。\ cred.xml'代码' 我得到一个错误。 (我把绝对完整的C:\ ... \ cred.xml路径放进去,但我认为这不是问题。)我得到“输入对象不能绑定到该命令的任何参数,因为命令不需要流水线输入,或者输入及其属性不匹配任何采用流水线输入的参数...“ 我对此解决方案感兴趣。我做错了什么? – Jennifer33 2015-02-09 20:23:49

+0

抱歉,代码中出现错字。现在更新它。 – Trondh 2015-02-09 20:29:05

0

检查出this script from the Technet Scrip t存储库,它几乎正是你需要做的。

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

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

由于您需要研究诸如bios,制造商和型号等各个领域的期望,并且使用脚本进行一些繁重工作以获得正确答案,因此自行创建此类工具需要很多工作;我强烈建议你改用这个功能。

+0

我试图使用链接指向我的脚本。该票据(在顶部评论)试图解释,你可以用这个修改为$凭据变量: $凭证= GET-凭据 修改后的脚本给出了这样的错误: 后“=”缺少表达。 在H:\ gcvs.ps1:45 char:65 + [System.Management.Automation.PSCredential] $ Credential = <<<< Get-Credential + CategoryInfo:ParserError:(=:String)[],ParentContainsErrorRecordException + FullyQualifiedErrorId:MissingExpressionAfterToken 如何获得脚本的工作? – Jennifer33 2015-02-09 20:26:51

+0

你可以将你的完整代码放在粘贴文件夹中(为了隐私起见,将其设置为在24小时内过期)。我会看看它并帮助你找到错误。 – FoxDeploy 2015-02-09 22:20:24

相关问题