2014-09-16 7 views
0

Мне дана задача, которая была бы идеальна для Powershell, и воспользовалась возможностью, чтобы изучить язык сценариев Powershell.Powershell If Statementments and Syntax

У меня есть CSV-файл с двумя colums:

Name, Active 

Я хочу, чтобы захватить имя каждой записи с отключенным в колонке. С этим именем я хочу проверить AD и проверить, отключены они или нет. В конечном счете, если они не отключены, я хочу их отключить, но я не хочу, чтобы вы, ребята, портили мне всю забаву!

Вот где я нахожусь, я не знаю, возможно ли следующее, но так как сейчас есть синтаксические ошибки.

$file = 'C:\scripts\users.csv' 
$test = Import-CSV $file | Where-Object {$_.Active -like "disable*"} | Select-Object Name 

foreach($user in $test){ 
    if (Get-AdUser -LDAPFilter "(samaccountname=*$user*)" | Select-Object Enabled){ 
     Write-Host $user + "is active" 
    } 
} 

Спасибо за любую помощь.

Редактировать: Я исправил ошибку синтаксиса, и теперь скрипт будет запущен, но нет выхода. Я знаю, что есть пользователи, которые все еще активны, поэтому определенно должен быть какой-то вывод.

ответ

2

Вы так близки, но мне кажется, что вам нужен аргумент -ExpandProperty для Select-Object.

if ((Get-AdUser $user | Select-Object -ExpandProperty Enabled)){ 

В противном случае это не является логическим ответом True/False, но вместо этого он является объектом с одним свойством, что свойство быть включено. Значение этого свойства будет логическим значением true/false, но если все, что вы хотите, это значение, которое вы должны сначала расширить свойство.

Редактировать: Кроме того, вам не нужна команда Write-Host (и многие люди скажут вам, чтобы вы не использовали ее, если не хотите писать на экран и ничего больше). Вы можете просто эту строку только "$user is active", так как двойные кавычки будут автоматически расширять строку.

Я полагаю, вы могли бы упростить его дальше, делая что-то вроде:

get-aduser -filter {SAMAccountName -eq "$user" -and Enabled -eq $true} | ForEach{ $_.samaccountname + " is enabled." } 

Это займет место вашего всего блока ForEach.

+1

Или 'if ((Get-AdUser $ user) .Enabled) {...}'. –

+0

Здравствуйте, спасибо за комментарий! Я внедрил ваше предложение и теперь получаю следующую ошибку: Get-ADUser: невозможно привязать параметр «Identity».Невозможно преобразовать значение «@ {Name = JMONFALCON}», чтобы ввести –

+0

. Может ли попробовать что-то вроде этого? Get-ADUser -Filter {samaccountname -eq $ user} ' – Matt

0

застроить filterstring следующим

$filterstring = "samaccountname=*{0}*" -f $user

0

Select-Object возвращает массив объектов из Enabled. Ваше If заявление:

if(Get-ADUser disabledUser | Select-Object enabled){Write-host "Enabled"} 
Enabled 

Это должно было быть ложным? Случилось так, что If оценил заполненный отчет. Он не был пустым, так что это было $ true

Что вам следует использовать -ExpandProperty. Это получит исходное значение от enabled, и это приведет к правильному утверждению if.

if(Get-ADUser disabledUser | Select-Object -ExpandProperty enabled){Write-host "Enabled"}