none
PowerShell - Автоматическое заполнение атрибутов пользтвателей AD RRS feed

  • Вопрос

  • Добрый день!

    Есть такая задача - заполнить атрибуты пользователей на вкладке General, Address и Telephone.

    Входная информация в виде excel файла, допустим первый столбец имя пользователя, второй телефон, третий должность и т.д.

    В ADCI есть метод Put(). Понимаю как вручную просвоить по одному методу каждому пользователю. Но вот скриптик рабочий бы.

    21 декабря 2010 г. 12:08

Ответы

  • >В такоам варианте будут проблемы с синхронизацией автономных файлов. Дело в том, что синхронизация проводится сетевого ресурса, а не использованных на нём файлов, поэтому в Вашем случае синхронизация будет ресурса \\server\share, то есть - всех профилей! Ну и будет ругань, так как, учётка пользователя доступа к чужим профилям не получит.

    А можно сделать по другому: например, я банально отключаю кэширование на уровне расшаренной папки для сетевого ресурса, где хранятся перемещаемые профили. Включать кэширование для перемещаемого профиля нет никакой необходимости, IMHO.


    my blog: http://shserg.ru/
    • Помечено в качестве ответа KazunEditor 22 июля 2011 г. 12:07
    22 июля 2011 г. 6:03
  • Качаем http://www.quest.com/powershell/activeroles-server.aspx ,остальные и читает справку по Set-QadUser(http://wiki.powergui.org/index.php/Set-QADUser) пункт Parameters.

    Import-Csv users.csv | %{set-qaduser -identity $_.username -PhoneNumber $_.telephone }

     

    Или без QAD.

     

    Import-Csv users.csv | % { $objUser = [ADSI]“LDAP://$($_.username)”
    
    $objUser.put(“description”,$_.descr)
    
    $objUser.put(“PhysicalDeliveryOfficeName”, $_.office)
    
    $objUser.put(“telephoneNumber”, $_.telphone)
    
    $objUser.put(“mail”, $_.mail)
    
    $objUser.setInfo()
    
    }

     

    Атрибуты можно посмотреть,скажем здесь - http://www.winzero.ca/Active-Directory-users.htm

    • Предложено в качестве ответа Vasily GusevModerator 21 декабря 2010 г. 16:13
    • Помечено в качестве ответа malkinfedor 24 декабря 2010 г. 9:42
    21 декабря 2010 г. 13:50
    Отвечающий
  • >Ошибка таже

    Так и причина та же. Причем здесь атрибут "имя"? (да и нет такого атрибута, они все имеют аглицкие наименования).

    Запустите ADSIEdit.msc и посмотрите чему равен атрибут cn для этого пользователя, именно его содержимое должно быть указано вами в cn=...


    blog: http://shss.wordpress.com/
    • Помечено в качестве ответа malkinfedor 24 декабря 2010 г. 13:05
    24 декабря 2010 г. 10:04
  • $OU = "cn=susik,ou=users,ou=voronezh,dc=corp,dc=test,dc=loc"
    Get-QADUser -SearchRoot $OU `
    | Set-QADUser -HomeDrive "Y:" `
    | FT DisplayName, HomeDrive -auto


    my blog: http://shserg.ru/
    • Помечено в качестве ответа KazunEditor 21 июля 2011 г. 19:47
    21 июля 2011 г. 18:16
  • кстати, назначил homeDrive, потом все отработало... но если не назначено, то затык будет, видимо.

    в фильтре стоит только у кого он назначен,других не ищет,чтобы искал всех и назначал им homeDrive,не зависимо,прописан он или нет.

    $path = [adsi]"LDAP://ou=test,dc=contoso,dc=com"
    $obj = New-Object adsisearcher($path , "(objectClass=user)")
    $users = $obj.FindAll()
    
    foreach ($user in $users)
    {
    	$user = [adsi]$user.path
    	$user.put("homeDrive", "Z:") 
    	$user.SetInfo()
    }
    


    • Помечено в качестве ответа KazunEditor 21 июля 2011 г. 19:48
    21 июля 2011 г. 19:36
    Отвечающий
  • класс! спасибо, работает! :)

    раз уж так все хорошо, и, если не трудно, то можно я расширю задачу :)

    в скором времени нужно будет менять 3 вещи:

    1. profilePath

    2. homePath

    3. homeDrive

    как все запихнуть в один скрипт?

    Все тоже самое.

    $path = [adsi]"LDAP://ou=test,dc=contoso,dc=com"
    $obj = New-Object adsisearcher($path , "(objectClass=user)")
    $users = $obj.FindAll()
    
    foreach ($user in $users)
    {
    	$user = [adsi]$user.path
    	$user.put("profilePath", "\\server\share\profile\user") 
    	$user.put("homeDirectory", "\\server\share\home\user") 
    	$user.put("homeDrive", "Z:") 
    	$user.SetInfo()
    }
    


    • Предложено в качестве ответа StuffStuff 21 июля 2011 г. 20:29
    • Помечено в качестве ответа KazunEditor 21 июля 2011 г. 21:56
    21 июля 2011 г. 19:58
    Отвечающий
  • Не по вопросу, но всё-таки. Уже больно знакомый "подход", только у меня было через DFS - \\domen.ru\files$\profiles\%username%. как я понял, у Вас сетевой ресурс даже не profiles, а profiles всего лишь папка на сетевом ресурсе.

    В такоам варианте будут проблемы с синхронизацией автономных файлов. Дело в том, что синхронизация проводится сетевого ресурса, а не использованных на нём файлов, поэтому в Вашем случае синхронизация будет ресурса \\server\share, то есть - всех профилей! Ну и будет ругань, так как, учётка пользователя доступа к чужим профилям не получит.

    Поэтому настоятельно рекомендую перестроить структуру. Я собрал через DFS следующее:
    \\domain.ru\files$\users\%username%\profile
    \\domain.ru\files$\users\%username%\home

    и, естественно, и profile, и home - самостоятельные сетевые ресурсы для каждого юзера. Создаются скриптом, права - скриптом, в DFS цепляю скриптом. И никаких проблем с автономными файлами и синхронизацией.


    С Уважением, Бетке Сергей Сергеевич, http://sergey-s-betke.blogs.novgaro.ru
    • Помечено в качестве ответа KazunEditor 22 июля 2011 г. 12:07
    22 июля 2011 г. 5:52

Все ответы

  • Качаем http://www.quest.com/powershell/activeroles-server.aspx ,остальные и читает справку по Set-QadUser(http://wiki.powergui.org/index.php/Set-QADUser) пункт Parameters.

    Import-Csv users.csv | %{set-qaduser -identity $_.username -PhoneNumber $_.telephone }

     

    Или без QAD.

     

    Import-Csv users.csv | % { $objUser = [ADSI]“LDAP://$($_.username)”
    
    $objUser.put(“description”,$_.descr)
    
    $objUser.put(“PhysicalDeliveryOfficeName”, $_.office)
    
    $objUser.put(“telephoneNumber”, $_.telphone)
    
    $objUser.put(“mail”, $_.mail)
    
    $objUser.setInfo()
    
    }

     

    Атрибуты можно посмотреть,скажем здесь - http://www.winzero.ca/Active-Directory-users.htm

    • Предложено в качестве ответа Vasily GusevModerator 21 декабря 2010 г. 16:13
    • Помечено в качестве ответа malkinfedor 24 декабря 2010 г. 9:42
    21 декабря 2010 г. 13:50
    Отвечающий
  • Спасибо, думаю поможет, только ошибка выскакивает. Гугл пишет что не может найти элемент AD, но связь с DC есть, тестовый пользователь такой тоже есть.

    При получении элемента "put" произошло следующее исключение: "Неизвестная ошибк

    а (0x80005000)"

    строка:1 знак:13

    + $objUser.put <<<< ("PhysicalDeliveryOfficeName","IT")

        + CategoryInfo          : NotSpecified: (:) [], ExtendedTypeSystemExceptio

       n

        + FullyQualifiedErrorId : CatchFromBaseGetMember

    22 декабря 2010 г. 11:58
  • 0x80005000 ("The specified directory service attribute or value does not exist"). Under a heavy load, the global catalog server may fail to authenticate client by using Kerberos

    http://support.microsoft.com/kb/324433/en-us


    blog: http://shss.wordpress.com/
    22 декабря 2010 г. 14:28
  • Какой ещё QAD?? О чем Вы?? Только Microsoft!

    Import-Module ActiveDirectory
    Import-Csv users.csv | %{Set-ADUser -Identity (Get-ADUser -Filter "SAMAccountName -eq ""$($_.username)""") -Description $_.Description -OfficePhone $_.OfficePhone -Title $_.Title}

    Можно также засунуть все аттрибуты пользователя в хэш-таблицу и использовать аргумент -Replace командлета Set-ADUser, таким образом можно получить доступ к совершенно любым аттрибутам пользователя.

    Подробнее читайте тут:

    http://technet.microsoft.com/en-us/library/dd378937(WS.10).aspx

    http://blogs.msdn.com/b/adpowershell/archive/2009/02/25/ad-powershell-quick-start-guide.aspx


    Решаю проблемы...
    22 декабря 2010 г. 19:30
  • Какой ещё QAD?? О чем Вы?? Только Microsoft!

     

    Import-Module ActiveDirectory
    Import-Csv users.csv | %{Set-ADUser -Identity (Get-ADUser -Filter "SAMAccountName -eq ""$($_.username)""") -Description $_.Description -OfficePhone $_.OfficePhone -Title $_.Title}

     

    Можно также засунуть все аттрибуты пользователя в хэш-таблицу и использовать аргумент -Replace командлета Set-ADUser, таким образом можно получить доступ к совершенно любым аттрибутам пользователя.

    Подробнее читайте тут:

    http://technet.microsoft.com/en-us/library/dd378937(WS.10).aspx

    http://blogs.msdn.com/b/adpowershell/archive/2009/02/25/ad-powershell-quick-start-guide.aspx


    Решаю проблемы...
    С чего такая уверенность,что есть DC Windows Server 2008 R2 ? QAD в отличие не имеет таких ограничений.
    22 декабря 2010 г. 20:30
    Отвечающий
  • 0x80005000 ("The specified directory service attribute or value does not exist"). Under a heavy load, the global catalog server may fail to authenticate client by using Kerberos

    http://support.microsoft.com/kb/324433/en-us


    blog: http://shss.wordpress.com/

    к сожалению не очень силен в английском, тут хотфикс надо устонавливать на сервер? или на стороне клиента с которого скрипт запускаю?

    23 декабря 2010 г. 6:23
  • там написано, что подобная ошибка может возникать, ели сервер, несущий GC, сильно загружен.


    blog: http://shss.wordpress.com/
    23 декабря 2010 г. 6:52
  • С чего такая уверенность,что есть DC Windows Server 2008 R2 ? QAD в отличие не имеет таких ограничений.

    Иного не указано.
    Решаю проблемы...
    23 декабря 2010 г. 14:43
  • >Иного не указано.

    Вы меня простите, пожалуйста, но там ни только иного (иного по отношению к чему?), там ... никакого не указано.


    blog: http://shss.wordpress.com/
    23 декабря 2010 г. 15:13
  • Извиняюсь за долгое отстутсвие.

    DC на Server 2003 R2.

    Из второго поста пока пытась применить метод без QAD, так как пока не силен в PS решил пойти от простого, что б найти в чем кроется ошибка. Просто пытаюсь присвоить конкретному юзеру конкретнуый атрибут.

     

    $objUser = [ADSI]“LDAP://cn=susik.a,ou=users,ou=voronezh,dc=corp,dc=test,dc=loc” 
    $objUser.put(“Initials”,"IT")
    $objUser.setInfo()
    

    Появляется такая ошибка

    При получении элемента "put" произошло следующее исключение: "Такой объект на с
    ервере отсутствует.
    "
    строка:1 знак:13
    + $objUser.put <<<< ("Initials","IT")
        + CategoryInfo          : NotSpecified: (:) [], ExtendedTypeSystemExceptio
       n
        + FullyQualifiedErrorId : CatchFromBaseGetMember

    Поясните пожалуйста какой объект не находится.

    • Изменено malkinfedor 24 декабря 2010 г. 11:21
    24 декабря 2010 г. 6:48
  • >Поясните пожалуйста какой объект не находится.

    По всей видимости, этот: [ADSI]“LDAP://cn=susin.a,ou=users,ou=voronezh,dc=corp,dc=ertelecom,dc=loc”


    blog: http://shss.wordpress.com/
    24 декабря 2010 г. 7:04
  • >Поясните пожалуйста какой объект не находится.

    По всей видимости, этот: [ADSI]“LDAP://cn=susik.a,ou=users,ou=voronezh,dc=corp,dc=test,dc=loc”


    blog: http://shss.wordpress.com/


    cn=susin.a - тут я так понимаю должно быть имя пользователя пред-Windows 2000?

     

    • Изменено malkinfedor 24 декабря 2010 г. 11:20
    24 декабря 2010 г. 7:14
  • >cn=susin.a - тут я так понимаю должно быть имя пользователя пред-Windows 2000?

    CN - это common name

    This property is a combination of the givenName and SN attributes joined together

    http://www.dotnetactivedirectory.com/Understanding_LDAP_Active_Directory_User_Object_Properties.html

    http://www.computerperformance.co.uk/Logon/LDAP_attributes_active_directory.htm


    blog: http://shss.wordpress.com/
    24 декабря 2010 г. 7:48
  • Изменил атрибут Имя через оснастку для этого юзера на susin, инициалов нет.

    $objUser = [ADSI]“LDAP://cn=susik,ou=users,ou=voronezh,dc=corp,dc=test,dc=loc” 
    $objUser.put(“Initials”,"IT")
    $objUser.setInfo()
    Ошибка таже.
    • Изменено malkinfedor 24 декабря 2010 г. 11:20
    24 декабря 2010 г. 9:36
  • >Ошибка таже

    Так и причина та же. Причем здесь атрибут "имя"? (да и нет такого атрибута, они все имеют аглицкие наименования).

    Запустите ADSIEdit.msc и посмотрите чему равен атрибут cn для этого пользователя, именно его содержимое должно быть указано вами в cn=...


    blog: http://shss.wordpress.com/
    • Помечено в качестве ответа malkinfedor 24 декабря 2010 г. 13:05
    24 декабря 2010 г. 10:04
  • >Ошибка таже

    Так и причина та же. Причем здесь атрибут "имя"? (да и нет такого атрибута, они все имеют аглицкие наименования).

    Запустите ADSIEdit.msc и посмотрите чему равен атрибут cn для этого пользователя, именно его содержимое должно быть указано вами в cn=...


    blog: http://shss.wordpress.com/

    Да, теперь все работает, буду пробовать из CVS файла импортировать. Хотя у вас в блоге нашел статью где решается подобная задача с внесением телефонов.
    24 декабря 2010 г. 14:35
  • Добавлю свои 5 копеек: http://sergey-s-betke.blogs.novgaro.ru/powershell-zagruzhaem-importiruem-telefonnuyu-knigu-v-ad-iz-csv. Рабочий пример с загрузкой телефонных номеров. Естественно - можно и другие атрибуты добавить. Там же ссылка на другую статью о том, как применить ADpowershell командлеты для windows 2003 DC.


    С Уважением, Бетке Сергей Сергеевич, http://sergey-s-betke.blogs.novgaro.ru
    8 февраля 2011 г. 20:17
  • Помогите с аналогичной проблемой!

    Нужно заменить значение homeDrive для всех в пользователей в контейнере. а если возможно, то и в подконтейнерах. подскажите синтаксис!

    то есть что-то типа этого

    $objUser = [ADSI]“LDAP://cn=susik,ou=users,ou=voronezh,dc=corp,dc=test,dc=loc” 
    $objUser.put(“Initials”,"IT")
    $objUser.setInfo()

    но нужно не для конкретного пользователя, а для всех в контейнере.

    заранее спасибо!



    21 июля 2011 г. 18:04
  • Помогите с аналогичной проблемой!

    Нужно заменить значение homeDrive для всех в пользователей в контейнере. а если возможно, то и в подконтейнерах. подскажите синтаксис!

    заранее спасибо!

    Как-то так:

    $path = [adsi]"LDAP://ou=test,dc=contoso,dc=com"
    $obj = New-Object adsisearcher($path , "(homeDrive=*)")
    $users = $obj.FindAll()
    
    foreach ($user in $users)
    {
    	$user = [adsi]$user.path
    	$user.put("homeDrive", "H:") 
    	$user.SetInfo()
    }
    
    


    21 июля 2011 г. 18:11
    Отвечающий
  • $OU = "cn=susik,ou=users,ou=voronezh,dc=corp,dc=test,dc=loc"
    Get-QADUser -SearchRoot $OU `
    | Set-QADUser -HomeDrive "Y:" `
    | FT DisplayName, HomeDrive -auto


    my blog: http://shserg.ru/
    • Помечено в качестве ответа KazunEditor 21 июля 2011 г. 19:47
    21 июля 2011 г. 18:16
  • Помогите с аналогичной проблемой!

    Нужно заменить значение homeDrive для всех в пользователей в контейнере. а если возможно, то и в подконтейнерах. подскажите синтаксис!

    заранее спасибо!

    Как-то так:

     

    $path = [adsi]"LDAP://ou=test,dc=contoso,dc=com"
    $obj = New-Object adsisearcher($path , "(homeDrive=*)")
    $users = $obj.FindAll()
    
    foreach ($user in $users)
    {
    	$user = [adsi]$user.path
    	$user.put("homeDrive", "H:") 
    	$user.SetInfo()
    }
    
    


    что-то не работает... скрипт отрабатывает, но не изменяет ничего...

    21 июля 2011 г. 18:58
  • $OU = "cn=susik,ou=users,ou=voronezh,dc=corp,dc=test,dc=loc"
    Get-QADUser -SearchRoot $OU `
    | Set-QADUser -HomeDrive "Y:" `
    | FT DisplayName, HomeDrive -auto


    my blog: http://shserg.ru/

    недопонял, как это использовать...
    21 июля 2011 г. 18:59
  • Помогите с аналогичной проблемой!

    Нужно заменить значение homeDrive для всех в пользователей в контейнере. а если возможно, то и в подконтейнерах. подскажите синтаксис!

    заранее спасибо!

    Как-то так:

     

    $path = [adsi]"LDAP://ou=test,dc=contoso,dc=com"
    $obj = New-Object adsisearcher($path , "(homeDrive=*)")
    $users = $obj.FindAll()
    
    foreach ($user in $users)
    {
    	$user = [adsi]$user.path
    	$user.put("homeDrive", "H:") 
    	$user.SetInfo()
    }
    
    


    что-то не работает... скрипт отрабатывает, но не изменяет ничего...

    Скрипт полностью рабочий ,проверяйте путь,права доступа.
    21 июля 2011 г. 19:00
    Отвечающий
  • Помогите с аналогичной проблемой!

    Нужно заменить значение homeDrive для всех в пользователей в контейнере. а если возможно, то и в подконтейнерах. подскажите синтаксис!

    заранее спасибо!

    Как-то так:

     

    $path = [adsi]"LDAP://ou=test,dc=contoso,dc=com"
    $obj = New-Object adsisearcher($path , "(homeDrive=*)")
    $users = $obj.FindAll()
    
    foreach ($user in $users)
    {
    	$user = [adsi]$user.path
    	$user.put("homeDrive", "H:") 
    	$user.SetInfo()
    }
    
    


    что-то не работает... скрипт отрабатывает, но не изменяет ничего...

    Скрипт полностью рабочий ,проверяйте путь,права доступа.
    блин... все проверил, права в порядке, пути тоже... да и ошибок не плюет никаких... но изменений нет :(
    А если homeDrive не был назначен до этого, это как-то влияет?

    21 июля 2011 г. 19:10
  • Вывод покажите:

    $path = [adsi]"LDAP://ou=test,dc=contoso,dc=com"
    $obj = New-Object adsisearcher($path , "(homeDrive=*)")
    $users = $obj.FindAll()
    
    foreach ($user in $users)
    {
    	$user = [adsi]$user.path
    	"UserName: {0} homeDrive: {1} " -f $user.cn[0],$user.homedrive[0]
    }
    


    21 июля 2011 г. 19:17
    Отвечающий
  • Exception calling "FindAll" with "0" argument(s): "An operations error occurred
    .
    "
    At C:\changehp3.ps1:3 char:22
    + $users = $obj.FindAll <<<< ()
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : DotNetMethodException

    Cannot index into a null array.
    At C:\changehp3.ps1:8 char:46
    +     "UserName: {0} homeDrive: {1} " -f $user.cn[ <<<< 0],$user.homedrive[0]
        + CategoryInfo          : InvalidOperation: (0:Int32) [], RuntimeException
        + FullyQualifiedErrorId : NullArray
    21 июля 2011 г. 19:31
  • кстати, назначил homeDrive, потом все отработало... но если не назначено, то затык будет, видимо.
    21 июля 2011 г. 19:32
  • кстати, назначил homeDrive, потом все отработало... но если не назначено, то затык будет, видимо.

    в фильтре стоит только у кого он назначен,других не ищет,чтобы искал всех и назначал им homeDrive,не зависимо,прописан он или нет.

    $path = [adsi]"LDAP://ou=test,dc=contoso,dc=com"
    $obj = New-Object adsisearcher($path , "(objectClass=user)")
    $users = $obj.FindAll()
    
    foreach ($user in $users)
    {
    	$user = [adsi]$user.path
    	$user.put("homeDrive", "Z:") 
    	$user.SetInfo()
    }
    


    • Помечено в качестве ответа KazunEditor 21 июля 2011 г. 19:48
    21 июля 2011 г. 19:36
    Отвечающий
  • класс! спасибо, работает! :)

    раз уж так все хорошо, и, если не трудно, то можно я расширю задачу :)

    в скором времени нужно будет менять 3 вещи:

    1. profilePath

    2. homePath

    3. homeDrive

    как все запихнуть в один скрипт?

    21 июля 2011 г. 19:50
  • класс! спасибо, работает! :)

    раз уж так все хорошо, и, если не трудно, то можно я расширю задачу :)

    в скором времени нужно будет менять 3 вещи:

    1. profilePath

    2. homePath

    3. homeDrive

    как все запихнуть в один скрипт?

    Все тоже самое.

    $path = [adsi]"LDAP://ou=test,dc=contoso,dc=com"
    $obj = New-Object adsisearcher($path , "(objectClass=user)")
    $users = $obj.FindAll()
    
    foreach ($user in $users)
    {
    	$user = [adsi]$user.path
    	$user.put("profilePath", "\\server\share\profile\user") 
    	$user.put("homeDirectory", "\\server\share\home\user") 
    	$user.put("homeDrive", "Z:") 
    	$user.SetInfo()
    }
    


    • Предложено в качестве ответа StuffStuff 21 июля 2011 г. 20:29
    • Помечено в качестве ответа KazunEditor 21 июля 2011 г. 21:56
    21 июля 2011 г. 19:58
    Отвечающий
  • сказал мне вот так вот:

    Exception calling "FindAll" with "0" argument(s): "An operations error occurred
    .
    "
    At D:\12345.ps1:3 char:22
    + $users = $obj.FindAll <<<< ()
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : DotNetMethodException

    You cannot call a method on a null-valued expression.
    At D:\12345.ps1:8 char:11
    +     $user.put <<<< ("profilePath", "\\server\share\profile\user")
        + CategoryInfo          : InvalidOperation: (put:String) [], RuntimeExcept
       ion
        + FullyQualifiedErrorId : InvokeMethodOnNull

    You cannot call a method on a null-valued expression.
    At D:\12345.ps1:9 char:11
    +     $user.put <<<< ("homeDirectory", "\\server\share\home\user")
        + CategoryInfo          : InvalidOperation: (put:String) [], RuntimeExcept
       ion
        + FullyQualifiedErrorId : InvokeMethodOnNull

    You cannot call a method on a null-valued expression.
    At D:\12345.ps1:10 char:11
    +     $user.put <<<< ("homeDrive", "Z:")
        + CategoryInfo          : InvalidOperation: (put:String) [], RuntimeExcept
       ion
        + FullyQualifiedErrorId : InvokeMethodOnNull

    You cannot call a method on a null-valued expression.
    At D:\12345.ps1:11 char:15
    +     $user.SetInfo <<<< ()
        + CategoryInfo          : InvalidOperation: (SetInfo:String) [], RuntimeEx
       ception
        + FullyQualifiedErrorId : InvokeMethodOnNull

    21 июля 2011 г. 20:09
  • сказал мне вот так вот:

    Exception calling "FindAll" with "0" argument(s): "An operations error occurred
    .
    "
    At D:\12345.ps1:3 char:22
    + $users = $obj.FindAll <<<< ()
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : DotNetMethodException

    You cannot call a method on a null-valued expression.
    At D:\12345.ps1:8 char:11
    +     $user.put <<<< ("profilePath", "\\server\share\profile\user")
        + CategoryInfo          : InvalidOperation: (put:String) [], RuntimeExcept
       ion
        + FullyQualifiedErrorId : InvokeMethodOnNull

    You cannot call a method on a null-valued expression.
    At D:\12345.ps1:9 char:11
    +     $user.put <<<< ("homeDirectory", "\\server\share\home\user")
        + CategoryInfo          : InvalidOperation: (put:String) [], RuntimeExcept
       ion
        + FullyQualifiedErrorId : InvokeMethodOnNull

    You cannot call a method on a null-valued expression.
    At D:\12345.ps1:10 char:11
    +     $user.put <<<< ("homeDrive", "Z:")
        + CategoryInfo          : InvalidOperation: (put:String) [], RuntimeExcept
       ion
        + FullyQualifiedErrorId : InvokeMethodOnNull

    You cannot call a method on a null-valued expression.
    At D:\12345.ps1:11 char:15
    +     $user.SetInfo <<<< ()
        + CategoryInfo          : InvalidOperation: (SetInfo:String) [], RuntimeEx
       ception
        + FullyQualifiedErrorId : InvokeMethodOnNull

    По этому пути никаких пользователей не нашел(FindAll ),поэтому выполнять нечего ($null).
    

    21 июля 2011 г. 20:13
    Отвечающий
  • Вы правы! нашел ошибку :) спасибо!

    последний вопрос! :)

    дело в том, что имя пользователя каждый раз новое... то есть имя папки в концу пути \\server\share\profiles\%username%

    нужно как-то подменять на логин пользователя...

    это возможно?

    21 июля 2011 г. 20:25
  • Вы правы! нашел ошибку :) спасибо!

    последний вопрос! :)

    дело в том, что имя пользователя каждый раз новое... то есть имя папки в концу пути \\server\share\profiles\%username%

    нужно как-то подменять на логин пользователя...

    это возможно?

    $prof = "\\server\share\profiles\"+$user.sAMAccountname
    

    21 июля 2011 г. 20:30
    Отвечающий
  • Вы правы! нашел ошибку :) спасибо!

    последний вопрос! :)

    дело в том, что имя пользователя каждый раз новое... то есть имя папки в концу пути \\server\share\profiles\%username%

    нужно как-то подменять на логин пользователя...

    это возможно?

    $prof = "\\server\share\profiles\"+$user.sAMAccountname
    

    а как это интегрировать сюда?

    $path = [adsi]"LDAP://ou=test,dc=contoso,dc=com"
    $obj = New-Object adsisearcher($path , "(objectClass=user)")
    $users = $obj.FindAll()
    
    foreach ($user in $users)
    {
    	$user = [adsi]$user.path
    	$user.put("profilePath", "\\server\share\profile\user") 
    	$user.put("homeDirectory", "\\server\share\home\user") 
    	$user.put("homeDrive", "Z:") 
    	$user.SetInfo()
    }
    
    22 июля 2011 г. 5:23
  • все, понял :) спасибо!!!
    22 июля 2011 г. 5:29
  • Не по вопросу, но всё-таки. Уже больно знакомый "подход", только у меня было через DFS - \\domen.ru\files$\profiles\%username%. как я понял, у Вас сетевой ресурс даже не profiles, а profiles всего лишь папка на сетевом ресурсе.

    В такоам варианте будут проблемы с синхронизацией автономных файлов. Дело в том, что синхронизация проводится сетевого ресурса, а не использованных на нём файлов, поэтому в Вашем случае синхронизация будет ресурса \\server\share, то есть - всех профилей! Ну и будет ругань, так как, учётка пользователя доступа к чужим профилям не получит.

    Поэтому настоятельно рекомендую перестроить структуру. Я собрал через DFS следующее:
    \\domain.ru\files$\users\%username%\profile
    \\domain.ru\files$\users\%username%\home

    и, естественно, и profile, и home - самостоятельные сетевые ресурсы для каждого юзера. Создаются скриптом, права - скриптом, в DFS цепляю скриптом. И никаких проблем с автономными файлами и синхронизацией.


    С Уважением, Бетке Сергей Сергеевич, http://sergey-s-betke.blogs.novgaro.ru
    • Помечено в качестве ответа KazunEditor 22 июля 2011 г. 12:07
    22 июля 2011 г. 5:52
  • >В такоам варианте будут проблемы с синхронизацией автономных файлов. Дело в том, что синхронизация проводится сетевого ресурса, а не использованных на нём файлов, поэтому в Вашем случае синхронизация будет ресурса \\server\share, то есть - всех профилей! Ну и будет ругань, так как, учётка пользователя доступа к чужим профилям не получит.

    А можно сделать по другому: например, я банально отключаю кэширование на уровне расшаренной папки для сетевого ресурса, где хранятся перемещаемые профили. Включать кэширование для перемещаемого профиля нет никакой необходимости, IMHO.


    my blog: http://shserg.ru/
    • Помечено в качестве ответа KazunEditor 22 июля 2011 г. 12:07
    22 июля 2011 г. 6:03
  • Абсолютно с Вами согласен, коллега, для профилей я также отключаю кеширование. Приведу ещё аргумент в пользу моей схемы. У Вас 200 пользователей, и вдруг - у Вас вторая площадка, Вы строите сайт. А где перемещаемые профили? и начались проблемы... в моем случае - в DFS перекинул ссылку на файловый сервер в новом сайте (только для переехавших пользователей), или вообще репликацию организовал - и всё ok.

    Но и первый аргумент остаётся в силе. Я так думаю, вопрошающий просто не договорил: вслед за profile пойдёт и home. А там уже и кеширование не помешает, мягко говоря...


    С Уважением, Бетке Сергей Сергеевич, http://sergey-s-betke.blogs.novgaro.ru
    22 июля 2011 г. 11:11