まず、スクリプトの記述やトラブルシューティングが苦手なので、ここにいます:)
静的IPアドレスを使用しているWindowsドメインネットワーク内のすべてのコンピューターを検索しようとしています。オンラインで簡単な調査を行ったところ、次のことがわかりました このPowerShellスクリプト 次のようになります。
param (
[string]$LDAPFilter = '(name=*)',
[switch]$Verbose
)
Get-ADComputer -LDAPFilter $LDAPFilter |
% `
{
$name = $_.DNSHostName;
if ($Verbose.IsPresent)
{ Write-Host -ForegroundColor Yellow "Connecting to $name..." }
$ints = Get-WmiObject -ErrorAction SilentlyContinue -ComputerName $name `
-Query "select IPAddress, DefaultIPGateway from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE and DHCPEnabled=FALSE";
if ($ints -ne $null)
{
foreach ($int in $ints)
{
foreach ($addr in $int.IPAddress)
{
$ip = $null
if ($addr -match "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}")
{
$ip = $addr
$gw = $null
foreach ($gw_addr in $int.DefaultIPGateway)
{
if ($gw_addr -match "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}")
{
$gw = $gw_addr
break
}
}
if ($ip -ne $null)
{
$info = New-Object PSObject -Property `
@{
Name = $name
IP = $ip
Gateway = $gw
}
$info
if ($Verbose.IsPresent)
{ Write-Host -ForegroundColor Yellow $info }
}
}
}
}
}
} |
Select-Object Name, IP, Gateway
私のActive Directoryサーバーでこれを実行しようとしましたが、問題は次のように実行中にスクリプトがエラーを出すことです。
Missing expression after unary operator '-'.
At C:\Users\Administrator.MyDomain\Desktop\ComputersWithStaticIP.ps1:24 char:8
+ - <<<< Query "select IPAddress, DefaultIPGateway from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE an
d DHCPEnabled=FALSE";
+ CategoryInfo : ParserError: (-:String) [], ParseException
+ FullyQualifiedErrorId : MissingExpressionAfterOperator
スクリプトから「-」を削除する方法をたどると、代わりにこのエラーが発生しました。
ForEach-Object : Cannot bind parameter 'Process'. Cannot convert the " " value
of type "System.String" to type "System.Management.Automation.ScriptBlock".
At C:\Users\Administrator.MyDomain\Desktop\ComputersWithStaticIP.ps1:18 char:2
+ % <<<< `
+ CategoryInfo : InvalidArgument: (:) [ForEach-Object], Parameter
BindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerSh
ell.Commands.ForEachObjectCommand
何が悪いのですか?または、スクリプトを実行するためにスクリプトから何を追加/削除する必要がありますか?
おかげで、
何が悪いのですか?
バックティック `は行継続文字であり、「単項演算子の後に式がない」という最初のエラーは、PowerShellが-Query行を前の行の一部として認識していないように見えます。
おそらく、スクリプトのコピーの前の行の最後にある `が欠落しているか、コピー/貼り付け/フォント/エディターコードの奇妙なコードなどによってアポストロフィに置き換えられている可能性があります。
または、スクリプトを実行するためにスクリプトから何を追加/削除する必要がありますか?
それの大部分を削除してください、それはあなたが望むもののために複雑で醜く冗長です。
なぜWin32_NetworkAdapterConfiguration
についてクエリを実行し、それらをints
と呼ぶのですか?これはso誤解を招く表現です。
なぜIPAddress
、addr
、_ip
、IP
のようになっているのですか?
なぜGatewayAddress
、gw_addr
、次にgw
、次にGateway
と呼ぶのですか?
-eq $null
のテストは必要ないようです。空のシーケンスでforeach
を使用しようとすると、期待どおりに機能します(スキップしてください)。
正規表現を使用して、IPv6アドレスの代わりにIPv4アドレスを取得する-便利ですが、ひどいです。 IPv6アドレスはそれらを区切るために:
を使用し、IPv4アドレスは.
を使用するため、IPv4アドレスのみが必要な場合は、アドレスで.
を探してください。
住所をコピーして、結果のリストを作成し、リストからすべてを選択するのはなぜですか?
ゲートウェイアドレスについてさえ気にしていますか?
この時点でIPアドレスを処理しているブロック内にいるときに、IPアドレスが空であるかどうかをテストして、この時点でIPアドレスをnullにできないようにしてください。
それが役に立たないのに、なぜ全体がget-computers % { code } | select results
を使用してチェーンになっているのですか?
私はそれを少し剪定して名前を変更し、次のより明確で単純な構造に到達しました:
.
を検索してIPv4アドレスを特定しますコンピュータ名とこのIPv4アドレスを表示します。
param (
[string]$LDAPFilter = '(name=*)'
)
$wmiQuery = "select IPAddress, DefaultIPGateway from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE and DHCPEnabled=FALSE"
$computers = (Get-ADComputer -LDAPFilter $LDAPFilter)
foreach ($computer in $computers) {
$networkAdapters = (Get-WmiObject -ErrorAction SilentlyContinue -ComputerName $computer.DNSHostName -Query $wmiQuery)
foreach ($networkAdapter in $networkAdapters) {
foreach ($ip in $networkAdapter.IPAddress)
{
if ($ip -match "\.")
{
Write-Host $($computer.DNSHostName), $ip }
}
}
}
私はこれを完全にテストしていませんが、1台のコンピューターに対して機能し、名前と静的IPのみを表示します。
N.B.接続できないコンピューターの名前は表示されませんが、元のコンピューターの名前は表示されません。
Webページがコードを分割する方法に注意する必要があります。これは、すべてのコンピューターをテストしたくない場合にOUで機能する変更後のバージョンで、実行時に少し情報が表示されます。
############################################################################
##
## Script, that returns list of computers with first statically configured
## IP Address and Default Gateway.
## Requires Active Directory Module
##
## Version: 1.0
## Author: [email protected]
## Date: 07#23#2012
##
############################################################################
# %Debug Arguments%='"Value1" "-Verbose"'
param ( [string]$LDAPFilter = '(name=*)', [switch]$Verbose )
import-module ActiveDirectory
# $LDAPFilter = '(name=*)'
# $Verbose = $True
if ($Verbose.IsPresent)
{
$VerboseModeString = "enabled."
$VerboseModeVar = $True
}
Else
{
$VerboseModeString = "not enabled."
$VerboseModeVar = $False
}
# $VerboseModeVar = $True
Write-Host "Verbose mode is $VerboseModeString" -ForegroundColor Magenta
# LDAP Paths:
$Singapore_OU = "OU=Singapore,OU=APAC,OU=TopOU,DC=MyDomain,DC=com"
$BC_OU = "OU=BC,OU=Australia,OU=APAC,OU=TopOU,DC=MyDomain,DC=com"
$MAL_OF_OU = "OU=KL Office,OU=Malaysia,OU=APAC,OU=TopOU,DC=MyDomain,DC=com"
$HK_OU = "OU=HK Warehouse,OU=Hong Kong,OU=APAC,OU=TopOU,DC=MyDomain,DC=com"
Get-ADComputer -SearchBase $HK_OU -LDAPFilter $LDAPFilter | % `
{
$name = $_.DNSHostName;
if ($VerboseModeVar)
{ Write-Host -ForegroundColor Yellow "Connecting to $name..." }
$ints = Get-WmiObject -ErrorAction SilentlyContinue -ComputerName $name -Query "select IPAddress, DefaultIPGateway from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE and DHCPEnabled=FALSE";
if ($ints -ne $null)
{
foreach ($int in $ints)
{
foreach ($addr in $int.IPAddress)
{
$ip = $null
if ($addr -match "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}")
{
$ip = $addr
$gw = $null
foreach ($gw_addr in $int.DefaultIPGateway)
{
if ($gw_addr -match "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}")
{
$gw = $gw_addr
break
}
}
if ($ip -ne $null)
{
$info = New-Object PSObject -Property `
@{
Name = $name
IP = $ip
Gateway = $gw
}
$info
if ($Verbose.IsPresent)
{ Write-Host -ForegroundColor Yellow $info }
}
}
}
}
}
else
{
if ($Verbose.IsPresent)
{
Write-Host "--> Could not contact the computer $Name" -ForegroundColor Red
}
}
} |
Select-Object Name, IP, Gateway
私はプロジェクトでこれを使用して、ADドメインコントローラーを再構築し、DNSの変更が必要な静的IPを見つけて100%動作させました!