Importação em massa para o AD powershell

1

Estou tentando importar uma lista de funcionários para o AD usando o powershell. O script precisa atualizar objetos do AD existentes.

O problema que tenho é que alguns usuários terão números de celular alguns números internos e alguns apenas uma extensão, quando eu executar o comando Set-ADuser em sua forma mais básica parece falhar sempre que um valor é em branco.

Não sou muito bom em escrever scripts, alguém pode me explicar por que o script abaixo não funciona? E se assim for, alguém poderia sugerir como fazê-lo funcionar? Felicidades

Import-module ActiveDirectory

$CSVPath = "c:\scripts\ictdepartment2.csv" 
$csvData = Import-CSV $CSVPath -delimiter "," -Header ("SamaccountName","identity","Title","Company","Department","Description","Office","OfficePhone","IPPhone","MobilePhone") 


##

foreach ($line in $csvData) 
{
$accountTable = @{ 
'SamaccountName'= $line.SamaccountName 
'identity'= $line.identity
'title'= $line.title 
'company'= $line.company 
'department'= $line.department 
'description'= $line.description 
'office'= $line.office
'officephone'= $line.officephone 
'IPPhone'= $line.ipPhone 
'mobilephone'= $line.mobilephone 
}
}

##

ForEach($line in $csvData) 
{
$SamaccountName = $line.SamaccountName
$identity = $line.identity
$title = $line.title 
$company = $line.company 
$department = $line.department 
$description = $line.description 
$office = $line.office
$officephone = $line.officephone
$IPPhone = $line.ipPhone 
$mobilephone = $line.mobilephone 
}

##

ForEach($line in $csvData) 
{
if ($officephone -ne $null)
{Set-ADUser -Identity $SamaccountName -OfficePhone $officephone}
if ($mobilephone -ne $null)
{Set-ADUser -Identity $SamaccountName -MobilePhone $mobilephone}
if ($ipphone -ne $null)
{Set-ADUser -Identity $SamaccountName -replace @{ipPhone=$ipphone}}

Set-ADUser -Identity $SamaccountName -Company $Company -Department $Department -Description $Description -Office $office -Title $title
}

Se eu usar os comandos a seguir, ele funciona, no entanto, assim que eu adicionar a instrução if $ null, ele falhará novamente: (

ForEach($line in $csvData) 
{ 
Get-ADUser -Filter "SamAccountName -eq '$($line.samaccountname)'" |
Set-ADUser -Replace @{ipphone=$ipphone}
}

ForEach($line in $csvData) 
{ 
Get-ADUser -Filter "SamAccountName -eq '$($line.samaccountname)'" |
Set-ADUser -Company $Company -Department $Department -Description $Description -MobilePhone $mobilephone -Office $office -OfficePhone $officephone -Title $title
}
    
por Dan 12.11.2015 / 10:17

1 resposta

5

$null e uma cadeia vazia ("") são dois tipos de dados diferentes para o powershell. Substitua qualquer instância de $null por "" e você deve ser bom. Quase todos os cmdlets fornecidos pelo MS estão definidos como [ValidateNotNull] .

Gostaria de expandir um pouco o que é $Null . Powershell é um shell OOP (Object Oriented Programming) com ganchos diretos em .Net. $Null é um marcador de posição e um objeto que não representa nada. Não se preocupe em entender completamente $Null neste ponto, muitas pessoas (até mesmo alguns programadores) não entendem $Null ao enésimo grau.

Então, por que isso é relevante agora? Deixe-me ligá-lo a ESTA REFERÊNCIA , mas vou copiar as informações relevantes aqui ...

...you cannot use $null to mean "no parameter value." A parameter value of $null overrides the default parameter value.

No seu caso, você está tentando equacionar o conteúdo de uma variável ao objeto $Null , isso nunca corresponderá porque somente $Null é -eq para $Null .

Uma string vazia ("") é um objeto String sem um valor. É por isso que você deseja usá-lo com operadores de comparação (-eq, -lt, -ge) para avaliar outras strings.

    
por 12.11.2015 / 16:41