PowerShell: Converter cadeia de IPs separados por vírgulas para o objeto IPAddress

3

Estou trabalhando com o cmdlet Get-DhcpServerv4Scope e estou tentando atrair vários escopos para uma variável com a opção -scopeid .

Get-DhcpServerv4Scope -scopeid 10.1.0.0,10.1.1.0 

No entanto, se eu fizer isso:

$IP = "10.2.0.0,10.1.0.0"
Get-DhcpServerv4Scope -scopeid $IP

Eu recebo o erro:

Get-DhcpServerv4Scope : Cannot process argument transformation on parameter 'ScopeId'. Cannot convert value "10.2.0.0,10.1.0.0" to type "System.Net.IPAddress[]". Error: "Cannot convert value "10.2.0.0,10.1.0.0" to type "System.Net.IPAddress". Error: "An invalid IP address was specified.""

Alguém tem uma ideia de como fazer essa conversão?

Edit: Aqui está o script em que estou tentando encaixar isso. Eu gostaria de ter uma maneira de apontar esse script em um servidor e reconstruir todos os escopos. agora eu envio os escopos em um arquivo delimitado por tabulações, depois copio & cole-os no Get-dhcpv4scope para armazenar todos os escopos em uma variável. Estou aberto a sugestões:

#GetScopes
$ScopeExclusions = Get-DhcpServerv4ExclusionRange
[string]$ScopesCSV=Get-DhcpServerv4Scope | Select ScopeID | convertto-
csv -notypeinformation
$ScopesCSV.replace('" ', ',').replace('"', '').replace('ScopeId,', '') 
| out-file c:\users\aturner\desktop\csv.txt
**Copy contents from file to clipboard**
$Scopes=Get-DhcpServerv4Scope -scopeid *PasteScopeCSVListHere* | select 
ScopeId,Name,Description,SubnetMask,StartRange,EndRange,LeaseDuration

#Delete Scopes
$Scopes | % { Remove-DhcpServerv4Scope -ScopeId $_.scopeid -force}

#Rebuild Scopes
$Scopes | % {Add-DhcpServerv4Scope -Name $_.name -Description 
$_.description -SubnetMask $_.SubnetMask -StartRange $_.StartRange -
EndRange $_.EndRange -LeaseDuration 8.00:00:00 }
$ScopeExclusions | % {Add-DHCPServerv4ExclusionRange -ScopeID $_.ScopeID -
StartRange $_.StartRange -EndRange $_.EndRange}

Novo código:

#GetScopes
$ScopeExclusions = Get-DhcpServerv4ExclusionRange
[string]$ScopesArray=Get-DhcpServerv4Scope | Select ScopeID | convertto-csv -notypeinformation
$ScopesCSV=$ScopesArray.replace('" ', ',').replace('"', '').replace('ScopeId,', '') 
$ScopeReservations = Get-DhcpServerv4Scope | Get-DhcpServerv4Reservation | select *
$Scopes=Get-DhcpServerv4Scope -scopeid $ScopesCSV.Split(',') | select ScopeId,Name,Description,SubnetMask,StartRange,EndRange,LeaseDuration

#Delete Scopes
$Scopes | % { Remove-DhcpServerv4Scope -ScopeId $_.scopeid -force}

#Rebuild Scopes
$Scopes | % {Add-DhcpServerv4Scope -Name $_.name -Description $_.description -SubnetMask $_.SubnetMask -StartRange $_.StartRange -EndRange $_.EndRange -LeaseDuration 8.00:00:00 }
$ScopeReservations | % {Add-DhcpServerv4Reservation -ScopeID $_.ScopeID -IPAddress $_.IPAddress -ClientId $_.ClientID -Description $_.Description -Name $_.Name -Type $_.Type}
New 
    
por Adam Turner 19.04.2017 / 00:33

3 respostas

4

$IPobj = $IP | ConvertFrom-Csv -Delimiter "," -Header "ip1", "ip2"
Get-DhcpServerv4Scope -scopeid $IPobj.ip1, $IPobj.ip2

No entanto, seu principal problema é que $IP é uma string, enquanto que quando você passa manualmente 10.1.0.0,10.1.1.0 como parâmetros, você está passando 2 strings.

Seria melhor criar $IP como uma matriz:

$IP = @("10.2.0.0", "10.1.0.0")
Get-DhcpServerv4Scope -scopeid $IP[0],$IP[1]

Desta forma, você pode criar scripts / loop através da matriz, se tiver vários escopos.

Adam perguntou como fazer isso dinamicamente e, embora eu não saiba de onde estamos obtendo "10.2.0.0" e "10.1.0.0", você só precisa continuar a preencher o array $IP com todos os IDs de escopo que você precisa verificar e faça o loop da seguinte forma:

foreach ($scopeid in $IP) { Get-DhcpServerv4Scope -scopeid $scopeid }

O código acima passa por cada entrada em $IP , armazenando-a temporariamente em $scopeid e usando-a como parâmetro para chamar o cmdlet Get-DhcpServerv4Scope .

    
por 19.04.2017 / 01:17
3

Há um nativo [ipaddress] cast que deve facilitar bastante isso.

$csvIPs = "10.2.0.0,10.1.0.0"
$IP = $csvIPs.Split(',') | %{ [ipaddress]$_ }
Get-DhcpServerv4Scope -scopeid $IP

Eu não tenho um sistema de teste com DHCP em execução no momento, mas eu acho que você pode nem precisar do elenco de [ipaddress] e poderia apenas passar com o .Split(',') porque o Powershell deve ser inteligente o suficiente para pegue as strings IP individuais e converta-as para você como fez no seu primeiro snippet de código.

$IP = "10.2.0.0,10.1.0.0"
Get-DhcpServerv4Scope -scopeid $IP.Split(',')
    
por 19.04.2017 / 03:40
2

Vamos responder à pergunta imediata: por que seu primeiro exemplo funciona, mas seu segundo exemplo não? Vamos começar com porque o primeiro trabalho. Envolve os diferentes Modos de análise do PowerShell.

Seu primeiro exemplo (trabalhos):

Get-DhcpServerv4Scope -scopeid 10.1.0.0,10.1.1.0

No seu primeiro exemplo, o PowerShell está no modo de análise de comandos porque sua linha começa com um comando. No Modo de Comando, o PowerShell irá citar automaticamente argumentos para um comando para você, já que citar tudo o tempo todo quando estiver trabalhando em seu shell seria realmente irritante! Isso significa que está citando os valores do seu endereço IP não-qualificado para você, transformando-os em strings e o ',' (operador Comma) está combinando as duas strings em uma matriz. Como o parâmetro é IPAddress [] (array do objeto IPAddress), ele tenta converter suas strings para IPAddress e é bem-sucedido, já que elas são entradas individuais em uma matriz e IPAddress sabe como analisar 1 string nesse formato e cria um endereço IP objeto com ele. Pelo menos, tenho 90% de certeza de que uma combinação dessas três coisas (operador de vírgula / matriz, modo de análise de comandos e transmissão) é o motivo pelo qual isso funciona.

NOTA: Mais especificamente, o modo de comando pode ser chamado de modo de argumento (como em argumentos para um comando), o outro modo sendo chamado de modo de expressão. No meu antigo livro do PowerShell, acabei de vê-lo chamado modo de comando, mas o documento atual fala sobre o modo de argumento.

Do documento:

In argument mode, each value is treated as an expandable string unless it begins with one of the following special characters: dollar sign ($), at sign (@), single quotation mark ('), double quotation mark ("), or an opening parenthesis (().

Seu segundo exemplo:

$IP = "10.2.0.0,10.1.0.0"
Get-DhcpServerv4Scope -scopeid $IP

Na primeira linha, você está apenas criando uma string, "10.2.0.0,10.1.0.0" . O PowerShell permitirá que você crie a string como quiser e a deixe sozinha. Mesmo se você omitiu as aspas duplas, perceberá que o PowerShell não fará a mesma coisa que o Exemplo 1 ... e isso é porque ele está no Modo de Expressão e não irá citar automaticamente o seu strings para você neste modo. Quando tento não recebo nada atribuído. Você provavelmente viu isso também.

Na segunda linha do seu exemplo, não há nada de especial que o PowerShell faça - é apenas uma string que tem uma vírgula - não vai inspecionar e modificar sua string, ela apenas passará adiante , onde ele não conseguirá analisar em um IPAddress porque não é o formulário válido e o método de análise que IPAddress só pode manipular um único endereço IP e não uma seqüência separada por vírgulas deles.

Esta parte pode ser corrigida ajustando a linha como Pedro sugeriu em uma matriz. por exemplo:

$IP = @("10.2.0.0","10.1.0.0")

Pode então ser passado diretamente:

Get-DhcpServerv4Scope -ScopeId $IP

No entanto, você não especificou se pretende processar apenas alguns escopos. Eu não vejo um comentário sobre você editando seu CSV para excluir certos escopos (ou em seu código), então você poderia pular TODOS estes neste caso e apenas chamar Get-DhcpServerv4Scope sem qualquer argumento -ScopeId e ele retornará todos escopos . Você pode pular tudo isso para o CSV e voltar ao trabalho.

Não está claro para mim a razão para a reconstrução do escopo, já que parece que você está potencialmente descartando concessões existentes de 8 dias (se elas tiverem o mesmo que era antes, talvez tenham sido configuradas como muito curtas primeiro) e Pode haver conflitos de endereço se o servidor o realocar antes que os clientes com essas concessões expirem. Talvez eu esteja perdendo alguma coisa. Apenas tome cuidado, seja qual for o seu objetivo final, e boa sorte!

    
por 19.04.2017 / 07:31