2017-02-23 122 views
2

我正在尝试搜索多个服务器以查看是否存在特定的注册表项。测试路径PowerShell问题

它看起来像下面的代码工作,但当我开始添加密钥的最后部分,它停止“发现”的东西。我可以开始添加a*,然后ab*作为最后一个键,但只要我到达第三个字符或者我知道的完整字符串,就会返回False,表示它没有找到它。

$servers = Get-Content c:\input.txt | ` 
    Select-Object @{l='ComputerName';e={$_}},@{l='KeyExist';e={Test-Path "HKLM:\System\CurrentControlSet\services\*abcdefg*" }} 
$servers | Format-Table -AutoSize 
+0

你不检查远程注册表。每次只有你自己的电脑。双*是多余的。 – Matt

+0

您是否打算在*不同的计算机上测试注册表路径?您当前的命令只是检查本地计算机上的注册表,对于从文件中输入的每个服务器名称 –

+0

对于远程注册表,您应该这样做:'$ reg = [Microsoft.Win32.RegistryKey] :: OpenRemoteBaseKey(“ LocalMachine“, $ _。machinename); $ key = $ reg.OpenSubkey($ keyname); $ value = $ key.GetValue('AutoAdminLogon')' –

回答

0

您可以查看远程注册表这样的:

因此,对于每个服务器将获得注册表值,它将值存储在ArrayList和显示最终结果。

目前在你的代码中,你基本上只在本地检查。

​​

注:更改占位符相应

+0

使用此方法,您将失去值与机器名称之间的关联 –

+0

那么应该是最佳方式。你能不能让我知道。我不想使用get-itemproperty或get-itempropertyvalue –

+2

而不是使用ArrayList,你应该输出一个具有两个属性的对象(使用'[pscustomobject]'类型加速器或'New-Object psobject'),然后分配整个'foreach(){}'循环到变量 –

1

你的问题是,你运行Test-Path在本地计算机上的每个远程服务器名称。不幸的是,Test-Path不支持查询远程注册表。

你可以使用WMI:

$RegProv = [wmiclass]"\\$servername\root\default:StdRegProv" 
if($RegProv.EnumKey(2147483650,"System\CurrentControlSet\services").sNames -like 'abc*'){ 
    # key starting with abc exists 
} 

把它包在你的计算性能是这样的:

@{Name='KeyExists';Expression={[bool](([wmiclass]"\\$_\root\default:StdRegProv").EnumKey(2147483650,"System\CurrentControlSet\services").sNames -like 'abc*')}} 
相关问题