Переменная Powershell $ null в операторе IF по умолчанию имеет значение true, а ручная проверка - false - PullRequest
0 голосов
/ 27 сентября 2018

Добрый день!Надеюсь, что все привыкли к теплым напиткам и снегоступам.

Я работаю над сценарием создания пользователя для AD и столкнулся с некоторым странным поведением.Цель здесь состоит в том, чтобы проверить, существует ли уже SAMID человека, и если да, добавить «1» к SAMID.

Например, давайте использовать «Jaina Proudmoore» в качестве нашего пользователя.

import-csv $inputCSV | foreach {
$FullName = $_.FullName
$company = $_.Company
$Givenname = $fullname.Split(" ")[0]
$Surname = $fullname.split(" ")[1]
$firstInitial = ($fullname.substring(0,1)).ToLower()
$surnameLower = $surname.ToLower()
$GivennameLower = $Givenname.ToLower()
$samid = $firstInitial + $surnameLower

$samidcheck = get-aduser $samid
if ($samid -ne $null) {
$samid = $samid + 1
}

$Description = "Created By NewUserCreation Script $DateFormat"
$global:Department = $_.Department
$Title = $_.Title
$Office = $_.Office
$StreetAddress = $_.StreetAddress
$PostalCode = $_.PostalCode
$ManagerFullName = $_.Manager
$ManagerDN = (get-aduser -filter 'Name -like $ManagerFullName').DistinguishedName
$Country = "CA"
$co = "Canada"
$OfficePhone = $_.OfficePhone
$MobilePhone = $_.MobilePhone
$countryCode = "124"
$City = $_.Location
$GroupSourceUser = $_.GroupSourceUser
$GroupSourceUserDN = (get-aduser -filter "Name -like '$GroupSourceUser'").DistinguishedName

$ADUserCheck = get-aduser -Filter 'Name -like $FullName' -ErrorAction SilentlyContinue

В этом случае проверка SAMID должна дать мне:

$samidcheck = get-aduser jproudmoore

Если бы я должен был выполнить это вручную:

get-aduser : Cannot find an object with identity: 'jproudmoore' under: 'DC=home,DC=local'.
At line:1 char:1
+ get-aduser jproudmoore
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (jproudmoore:ADUser) [Get-ADUser], ADIdentityNotFoundException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException,Microsoft.ActiveDirectory.Management.Commands.GetADUser

Если я правильно понимаю, это означаетmsgstr "пользователь не найден".Поэтому мой SAMID должен быть создан как «jproudmoore».Тем не менее, сценарий создает «jproudmoore1», как если бы он обнаружил, что выходной сигнал НЕ является нулевым.

if ($samid -ne $null) {

Так как произошла ошибка, когда объект не найден, я бы предположил, что выходные данные действительно не равны нулюи, следовательно:

$samid = $samid + 1
}

Что мне здесь не хватает?Я чувствую, что это что-то очевидное.

Заранее спасибо за ваше время и прекрасную неделю!

  • РЕДАКТИРОВАТЬ -

Я также пробовал это вручную:

$test = get-aduser jproudmoore
if (!$test) {write-host "variable is null"}
PS > variable is null

Если я здесь прав, то это означает, что проверка SAMID не должна была добавлять "1".

1 Ответ

0 голосов
/ 03 октября 2018

Благодаря Джейкобу , в моем коде обнаружена ошибка:

$samidcheck = get-aduser $samid
if ($samid -ne $null) {
$samid = $samid + 1
}

Должно быть

$samidcheck = get-aduser $samid
if ($samidcheck -ne $null) {
$samid = $samid + 1
}

Спасибо также iRon зассылка на проверку $ null в Powershell: Как проверить массив $ null в PowerShell .Читатели остерегаются: первое чтение того, как ведет себя Powershell, вызвало у меня головную боль.

TLDR: ошибка кодера новичка конечного пользователя!Мой плохой, но спасибо всем за помощь.Удачной недели!

...