Показать полную графическую версию : Измение атрибутов в полльзователей в АД. Ошибки Operator Not supported
allegwiz
07-08-2015, 12:47
Подскажите как исправить ошибку. Делаю обновление атрибутов пользователей.
Import-Module ActiveDirectory
$Users = Import-Csv -Delimiter ";" -Path "C:\AD\ad-import.csv"
Foreach ($CurrentUser in $Users) {
$Name = $CurrentUser.Name
$Surname = $CurrentUser.Surname
$Email = $CurrentUser.EMail
$Phone = $CurrentUser.Phone
$Organization = $CurrentUser.Organization
$JobTitle = $CurrentUser.JobTitle
$Login = (Get-ADuser –Filter {GivenName –eq $Name –and Surname –eq $Surname}).SamAccountName #ищем юзера с заданным именем и фамилией и возвращаем его логин
Set-ADUser $Login –EmailAddress $Email –MobilePhone $Phone –Company $Organization –Title $JobTitle
В итого запуска ошибки:
Get-ADUser : Ошибка анализа запроса: "GivenName –eq $Name –and Surname –eq $Surname" Сообщение об ошибке: "Operator Not supported: " с расположением в: "11".
строка:21 знак:21
+ $Login = (Get-ADuser <<<< –Filter {GivenName –eq $Name –and Surname –eq $Surname}).SamAccountName #ищем юзера с заданным именем и фамилией и возвращаем его логин
+ CategoryInfo : ParserError: (:) [Get-ADUser], ADFilterParsingException
+ FullyQualifiedErrorId : Ошибка анализа запроса: "GivenName –eq $Name –and Surname –eq $Surname" Сообщение об ошибке: "Operator Not supported: " с расположением в: "11".,Microsoft.ActiveDirectory.Management.Commands.GetADUser
Set-ADUser : Не удается проверить аргумент для параметра "Identity". Аргумент имеет значение NULL. Укажите аргумент, не имеющий значение NULL, после чего повторите выполнение команды.
строка:23 знак:11
+ Set-ADUser <<<< $Login –EmailAddress $Email –MobilePhone $Phone –Company $Organization –Title $JobTitle
+ CategoryInfo : InvalidData: (:) [Set-ADUser], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.SetADUser
Измените знак - в фильтре:
PS > [int][char]"-" -Символ, который сейчас в Filter и PowerShell его не воспринимает
8211
PS > [int][char]"-" - Символ который должен быть в Filter
45
(Get-ADuser -Filter {GivenName -eq $Name -and Surname -eq $Surname}).SamAccountName
И лучше:
Get-ADuser -Filter {GivenName -eq $Name -and Surname -eq $Surname} | Set-ADUser -EmailAddress $Email -MobilePhone $Phone -Company $Organization -Title $JobTitle
allegwiz
07-08-2015, 13:22
это ошибка первого варианта.
Get-ADUser : Переменная: "Name" обнаружена в выражении: $Name не имеет определения.
строка:21 знак:21
+ $Login = (Get-ADuser <<<< -Filter {GivenName -eq $Name -and Surname -eq $Surname}).SamAccountName #ищем юзера с заданным именем и фамилией и возвращаем его логин
+ CategoryInfo : InvalidArgument: (:) [Get-ADUser], ArgumentException
+ FullyQualifiedErrorId : Переменная: "Name" обнаружена в выражении: $Name не имеет определения.,Microsoft.ActiveDirectory.Management.Commands.GetADUser
Set-ADUser : Не удается проверить аргумент для параметра "Identity". Аргумент имеет значение NULL. Укажите аргумент, не имеющий значение NULL, после чего повторите выполнение команды.
строка:23 знак:11
+ Set-ADUser <<<< $Login –EmailAddress $Email –MobilePhone $Phone –Company $Organization –Title $JobTitle
+ CategoryInfo : InvalidData: (:) [Set-ADUser], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.SetADUser
Это ошибка второго.
Get-ADUser : Переменная: "Name" обнаружена в выражении: $Name не имеет определения.
строка:21 знак:11
+ Get-ADuser <<<< -Filter {GivenName -eq $Name -and Surname -eq $Surname} | Set-ADUser -EmailAddress $Email -MobilePhone $Phone -Company $Organization -Title $JobTitle
+ CategoryInfo : InvalidArgument: (:) [Get-ADUser], ArgumentException
+ FullyQualifiedErrorId : Переменная: "Name" обнаружена в выражении: $Name не имеет определения.,Microsoft.ActiveDirectory.Management.Commands.GetADUser
Переменная: "Name" обнаружена в выражении: $Name не имеет определения. - Переменная $Name пустая, проблема в том что $CurrentUser.Name передает пустое значение. Проверяйте вывод:
Import-Csv -Delimiter ";" -Path "C:\AD\ad-import.csv"
и
Import-Csv -Delimiter ";" -Path "C:\AD\ad-import.csv" | Select Name
PS. Файл C:\AD\ad-import.csv - должен быть в кодировке UTF8.
allegwiz
07-08-2015, 13:41
Спасибо, помогло. А можно чтобы проверяло по значению cn.
allegwiz
10-08-2015, 17:40
Подскажите а как использовать функции в данном скрипте. Вроде Есть функция userset с параметром ($CurrentUser) и функция Provision с параметром ($user). Но с помощью функций не получается делать обновление атрибутов.
А можно чтобы проверяло по значению cn. - Можно, использовать фильтр по CN.
Get-ADuser -Filter {cn -eq $cn}
Я не знаю, о каких функциях идет речь. Но функций userset,Provision - таких нет и не было. Обновление атрибутов происходит через командлет Set-ADUser .
allegwiz
10-08-2015, 18:13
http://forum.oszone.net/post-2242418.html
Здесь используются функции.
В Powershell вывел список функций. get-command -CommandType function
allegwiz
18-08-2015, 16:06
Обновление атрибутов пользователей из csv работает. Подскажите как в этом же скрипте добавить перемещение пользователя в свой контейнер из csv!
Добавить, скажем, Path в скрипт - должно быть DistinguishedName (как пример для Users: CN=Users,DC=Contoso,DC=Com или OU: OU=MyTest,DC=Contoso,DC=Com)
$path = $CurrentUser.Path
Get-ADuser -Filter {GivenName -eq $Name -and Surname -eq $Surname} | Set-ADUser -EmailAddress $Email -MobilePhone $Phone -Company $Organization -Title $JobTitle -PassThru | Move-ADObject -TargetPath $path
allegwiz
19-08-2015, 09:27
Import-Module ActiveDirectory
$Users = Import-Csv -Delimiter ";" -Path "C:\AD\ad-import5.csv"
$path = "OU=123456,DC=point,DC=pro"
Foreach ($CurrentUser in $Users) {
$Name = $CurrentUser.Name
$Surname = $CurrentUser.Surname
$Email = $CurrentUser.EMail
$Phone = $CurrentUser.Phone
$Organization = $CurrentUser.Organization
$JobTitle = $CurrentUser.JobTitle
$path = $CurrentUser.Path
$DistinguishedName = $CurrentUser.DistinguishedName
$Login = Get-ADuser -Filter {GivenName -eq $Name -and Surname -eq $Surname} | Set-ADUser -EmailAddress $Email -MobilePhone $Phone -Company $Organization -Title $JobTitle | Move-ADObject -TargetPath $path
}
В csv поле path
Я правильно понял? Ошибок нет и не переносит, только атрибуты правит.
$path либо вручную указывать, либо в из csv. В одном месте должно быть, а не в 2.
$path = "OU=123456,DC=point,DC=pro" - 1
$path = $CurrentUser.Path - 2
И скопируйте повторно код, который я привел постом выше, а то видимо трудно с первого раза скопировать без ошибок.
allegwiz
19-08-2015, 09:50
Спасибо работает. Просто хотел чтобы в csv путь писать конечный.
allegwiz
19-08-2015, 13:04
Еще вопрос. Получается что в csv для работы скрипта должны быть заполнены все поля. У меня некоторые пользователи не с полной информацией.
Set-ADUser : replace
C:\AD\Мои скрипты\Тесты\test.ps1:37 знак:46
+ Get-ADuser -Filter {cn -eq $cn} | Set-ADUser <<<< -MobilePhone $Phone -Company $Organization -Title $JobTitle -City $City -Department $Department -PassThru | Move-ADObject -TargetPath $path
+ CategoryInfo : InvalidOperation: (CN=last111 firs...DC=point,DC=pro:ADUser) [Set-ADUser], ADInvalidOperationException
+ FullyQualifiedErrorId : replace,Microsoft.ActiveDirectory.Management.Commands.SetADUser
Пустые значения нельзя передавать, можно $null.
$prop = Write-Output EMail Phone Organization JobTitle
Foreach ($CurrentUser in $Users) {
$Name = $CurrentUser.Name
$Surname = $CurrentUser.Surname
$prop | Foreach {
if($CurrentUser."$_") {
Set-Variable -Name "$_" -Value $CurrentUser."$_" -Force
}
else {
Set-Variable -Name "$_" -Value $null -Force
}
}
$path = $CurrentUser.Path
$Login = Get-ADuser $Name | Set-ADUser -EmailAddress $Email -MobilePhone $Phone -Company $Organization -Title $JobTitle -PassThru | Move-ADObject -TargetPath $path
}
allegwiz
20-08-2015, 10:59
Есть атрибут ipPhone - (IP-телефон). Никак не получается добавить его в изменение атрибутов.
Set-ADUser .... -Replace @{ipPhone=$ipphone}
allegwiz
25-08-2015, 11:05
Подскажите, а как Set-ADUser .... -Replace @{ipPhone=$ipphone} это значение передать. "Пустые значения нельзя передавать, можно $null."
Делать проверку,что есть значение:
if($ipphone) {
Set-ADUser $User -Replace @{"ipphone" = $val}
}
allegwiz
25-08-2015, 13:10
Я правильно понял? Мне нужно если это поле ipphone не заполнено скрипт выполнялся.
Как вот здесь. Если в csv не полная информация передаем значения $null.
$prop = Write-Output EMail Phone Organization JobTitle
Foreach ($CurrentUser in $Users) {
$Name = $CurrentUser.Name
$Surname = $CurrentUser.Surname
$prop | Foreach {
if($CurrentUser."$_") {
Set-Variable -Name "$_" -Value $CurrentUser."$_" -Force
}
else {
Set-Variable -Name "$_" -Value $null -Force
}
}
$path = $CurrentUser.Path
$Login = Get-ADuser $Name | Set-ADUser -EmailAddress $Email -MobilePhone $Phone -Company $Organization -Title $JobTitle -PassThru | Move-ADObject -TargetPath $path
}
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.