imageЭта статья посвящена автоматизации операций по созданию, перемещению и увольнению людей в соответствии с кадровыми изменениями, сделанными в 1С.

Принцип работы скрипта заключается в парсинге выгружаемых из 1С данных пользователя и присвоении этих данных переменным скрипта с дальнейшим их использованием.

В нашей компании после заведения пользователя в 1C создается CSV файл с данными, пример ниже:
document type userName FIO Department Department
прием на работу USERtester1 Иванов Иван Иванович Диспонент Отдел диспозиции и оформления документов
перемещение USERtester2 Петров Иван Иванович Менеджер по пролонгации Отдел кредитования и страхования
увольнение USERtester3 Сидоров Иван Иванович Менеджер по пролонгации Отдел кредитования и страхования

Скрипт содержит три функции (usrcreate; usrmove; usrdelete) в соответствии с типами операций:

Прием на работу


Ищем шаблон пользователя на основе должности и названия отдела, после нахождения получаем необходимые атрибуты и группы, записываем их в нового пользователя, вместе с тем создается и подключается домашняя папка, а также привязывается почтовый адрес. На почту отправляется отчет с именем пользователя, ФИО и списком групп, в которые он был добавлен.

Кадровое перемещение


Находим шаблон пользователя по новой должности и новому отделу сотрудника, с которого мы получаем новый список групп и адрес OU, после нахождения удаляем старые группы у перемещаемого пользователя и добавляем его в новые, одновременно переносим его в OU, соответствующий новому отделу (если есть такое деление в AD), и меняем должности на новые соответственно. На почту отправляется отчет с новыми должностью, отделом и группами.

Увольнение


Отключаем почтовый ящик, удаляем пользователя из всех групп, перемещаем его в папку для отключенных пользователей и отключаем его аккаунт. На почту отправляется отчет о том, что пользователь отключен и уволен.

Скрипт включает в себя ряд проверок:

Проверка на необходимость запуска оснасток Exchange и Active Directory


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

Проверка на существование данных для обработки в переменных $getstaff|$movestaff|$delstaff


Для запуска функций создания, перемещения и удаления пользователей.

Проверка на существование создаваемого пользователя


Для проверки дубликатов заданий на создание пользователя.

Проверка на существование сетевой папки пользователя


Для обхода ошибки о существовании папки.

Проверка должности и департамента


Для проверки на дублирование заявки на перемещение, когда пользователь уже был перемещен на новую должность.

Проверка на увольнение пользователя


Для проверки на дублирование заявки на увольнение, когда пользователь уже был уволен.

Описание переменных скрипта:
$smtpserv Почтовая отправка(Сервер)
$smtpfrom Почтовая отправка(От кого)
$smtpto Почтовая отправка(Кому)
$opertype Тип операции над пользователем
$usrname SamAccountName
$FIO Фамилия Имя Отчество
$curdate Текущая дата в формате день.месяц.год
$del Элемент массива $delstaff
$delstaff Данные пользователя для увольнения
$department Отдел
$dir Место куда 1С выгружает CSV
$get Элемент массива $getstaff
$getstaff Данные пользователя для приема на работу
$groups Список скопированных групп для отчета
$move Элемент массива $movestaff
$movestaff Данные пользователя для кадрового перемещения
$newusername Имя
$newusersurname Фамилия
$Position Должность
$sdel Разспличенный $del
$sget Разспличенный $get
$smove Разспличенный $move
$shablon SamAccountName шаблона пользователя
$spisokf Список файлов в директории выгрузки из 1С
$todayf Файл в котором находятся кадровые изменения за сегодняшний день
$usrcopyfrom Шаблон пользователя
$usrexist Логин пользователя для проверки на существование
$usrpath Расположение пользователя в AD
$usrprop Свойства пользователя шаблона
$usrdomain Ваш домен
$Session Сессия с консолью управления Exchange
$usrshare Адрес папки пользователя на сетевом хранилище
$pass Временный пароль пользователя
$company Название компании
$usrstate Область расположения компании
$usrCity Город
$usrStreetAddress Улица дом корпус
$curuserpath Текущее расположение перемещаемого пользователя в AD
$newuserpath Целевое расположение перемещаемого пользователя в AD
$usrmoveddep Текущий департамент пользователя для проверки на дублирование приказа на перемещение
$usrmovedtit Текущая должность пользователя для проверки на дублирование приказа на перемещение

Элементы в массивах $get|$move|$del
[0] Тип операции прием на работу/перемещение/увольнение
[1] SamAccountName
[2] ФИО
[3] Должность
[4] Отдел


Сам скрипт:

#Переменные почтовой отправки
  $smtpserv = "post.domain.local"
  $smtpfrom = "AUTOUSERCHANGER@domain.local"
  $smtpto = "sysadmin@domain.local"
  $encoding = [System.Text.Encoding]::UTF8
  $smtpBody = ""
  
#Директория в которую выгружаются файлы из 1С
  $dir= "\\fileserver\1C\"

#Домен
  $usrdomain="domain.local"

#Получение файлов csv для обработки
  $spisokf=Get-Childitem -File -Path $dir*.csv | Select-Object -ExpandProperty Name

#Поиск запланированных на сегодня кадровых изменений
  $curdate=Get-Date -Format dd.MM.yyyy
  $todayf=$spisokf | Select-String $curdate


#Парсинг файлов и загон данных в переменные
  $getstaff= Get-Content $dir$todayf |Select-String "прием на работу"
  $movestaff= Get-Content $dir$todayf |Select-String "перемещение"
  $delstaff= Get-Content $dir$todayf |Select-String "увольнение"

  #Включение поддержки EXCHANGE и ActiveDirectory

if ($getstaff -ne $null -or $movestaff -ne $null -or $delstaff -ne $null)
{
    $Session=New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://post.domain.local/PowerShell/ -Authentication Kerberos 
    Import-PSSession $Session -AllowClobber | out-null
    Import-Module ActiveDirectory
    
}
else
{
    Write-Host "Нет данных для операций над пользователями"
}



#Создание пользователя
  function usrcreate () 
{ 

#Перебор массива принимаемых на работу
  ForEach ($get in $getstaff) 

  {

#Сплит массива
  $sget=$get -split (";")
  $opertype = $sget[0]
  $usrname=$sget[1]
  $FIO=$sget[2]
  $Position=$sget[3]
  $department=$sget[4]

#Проверка на существование пользователя
  $usrexist=Get-ADUser -filter {(SamAccountName -eq $usrname)} | Select-Object -ExpandProperty SamAccountName
  if ($usrexist -eq $null)

   {

   #Шара пользовательских папок
     $usrshare="\\FILESERVER\Users\$usrname"

   #Поиск пользователя для шаблона
     $shablon=Get-ADUser -filter { (physicalDeliveryOfficeName -like $department) -and (title -like $Position) -and (Enabled -eq $true) -and (SamAccountName -ne $usrname)} | Select-Object -ExpandProperty SamAccountName
     $usrcopyfrom=$shablon[1]

   #-Path
     $usrprop= Get-ADUser -Identity $usrcopyfrom | Select-Object -ExpandProperty  DistinguishedName
     $usrpath= ($usrprop -split ',',2)[1]

   #-name
     $newusername=($FIO-split ' ')[1]

   #-Surname
     $newusersurname=($FIO-split ' ')[0]
     
   #-AccountPassword
     $pass="Qwerty01"

   #-company
     $company= Get-ADUser -Identity $usrcopyfrom -Properties Company | Select-Object -ExpandProperty  company

   #-State
     $usrstate= Get-ADUser -Identity $usrcopyfrom -Properties State | Select-Object -ExpandProperty  State

   #-City
     $usrCity= Get-ADUser -Identity $usrcopyfrom -Properties City | Select-Object -ExpandProperty  City

   #-StreetAddress
     $usrStreetAddress= Get-ADUser -Identity $usrcopyfrom -Properties StreetAddress | Select-Object -ExpandProperty  StreetAddress

   #Создание пользователя
     New-ADUser `
     -name $FIO `
     -AccountPassword (ConvertTo-SecureString $pass -AsPlainText -Force) `
     -ChangePasswordAtLogon $true `
     -Company $company `
     -Department $department `
     -Description $Position `
     -DisplayName $FIO `
     -Enabled $true `
     -HomeDirectory $usrshare `
     -HomeDrive "<b>БУКВА ДИСКА ДОМАШНЕЙ ПАПКИ</b>" `
     -Path $usrpath `
     -PostalCode "<b>ПОЧТОВЫЙ ИНДЕКС ЦИФРАМИ</b>" `
     -SamAccountName $usrname `
     -UserPrincipalName "$usrname@$usrdomain" `
     -State $usrstate `
     -StreetAddress $usrStreetAddress `
     -Surname $newusersurname `
     -Title $Position `
     -GivenName $newusername `
     -City $usrCity `
     -Office $department ` | out-null

   #Ожидание создания пользователя
     Start-Sleep -Seconds 10

   #Копирование групп с пользовательского шаблона
     $groups=Get-ADUser -Identity $usrcopyfrom -Properties memberof | Select-Object -ExpandProperty memberof|Add-ADGroupMember -Members $usrname -PassThru | Select-Object -ExpandProperty SamAccountName

   #Создание пользовательской папки на сетевом диске (с проверкой есть ли папка с таким именем)
     if(!(Test-Path -Path $usrshare ))
        {
         New-item $usrshare -type directory | out-null
         $acl = Get-Acl $usrshare
         $acl | Format-List
         $acl.GetAccessRules($true, $true, [System.Security.Principal.NTAccount])
         $acl.SetAccessRuleProtection($true, $true)
         $rule = New-Object System.Security.AccessControl.FileSystemAccessRule ("$usrdomain\$usrname","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
         $acl.addAccessRule($rule)
         Set-Acl $usrshare $acl | out-null
        }
        else
        {
         $acl = Get-Acl $usrshare
         $acl | Format-List
         $acl.GetAccessRules($true, $true, [System.Security.Principal.NTAccount])
         $acl.SetAccessRuleProtection($true, $true)
         $rule = New-Object System.Security.AccessControl.FileSystemAccessRule ("$usrdomain\$usrname","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
         $acl.addAccessRule($rule)
         Set-Acl $usrshare $acl | out-null
        }
  
   #Включение ящика пользователя
     Enable-Mailbox "$usrname@$usrdomain" -Database "<b>ИМЯ БАЗЫ ДАННЫЙ ПОЧТЫ</b>" | out-null
   
   #Вывод групп для отчета
     foreach ($group in $groups) {$smtpBody = $smtpBody +$group+"`n`n"}
   
   #Отправка отчета на почту
     Send-MailMessage -From $smtpfrom -Subject $opertype  -To $smtpto -Body "Пользователь $FIO ($usrname) ""$Position"" отдела ""$department"" создан.`n`nДобавлен в группы:`n$smtpBody"  -SmtpServer $smtpserv -Encoding $encoding
      
   #Очистка переменных
     $smtpBody=""
   }

   else

   {
     #Отправка отчета на почту 
       Send-MailMessage -From $smtpfrom -Subject $opertype  -To $smtpto -Body "Пользователь $FIO ($usrname) уже существует."  -SmtpServer $smtpserv -Encoding $encoding
   }

      #Удаление обработанной строки из файла
        (Get-Content $dir$todayf) | Where-Object {$_ -notmatch $get} | Set-Content -Path $dir$todayf -Force
  }

}

#Запуск создания пользователя
if ($getstaff -ne $null)
{
   #Запуск функции создания пользователя
     #usrcreate

   #Ожидание завершения процессов
    Start-Sleep -Seconds 10
    
}
else
{
    Write-Host "Нет пользователей для создания"
}


#Кадровое перемещение  

  function usrmove ()

{ 

  ForEach ($move in $movestaff) 
 {

 #Сплит массива
   $smove=$move -split (";")
   $opertype = $smove[0]
   $usrname=$smove[1]
   $FIO=$smove[2]
   $Position=$smove[3]
   $department=$smove[4]

 #Проверка на существование пользователя
   $usrmoveddep =Get-ADUser -Identity $usrname -Properties Department |Select-Object -ExpandProperty Department
   $usrmovedtit =Get-ADUser -Identity $usrname -Properties title |Select-Object -ExpandProperty title
  if ($usrmoveddep -ne $department -or $usrmovedtit -ne $Position)
  {

  #Поиск пользователя для шаблона
    $shablon=Get-ADUser -filter { (physicalDeliveryOfficeName -like $department) -and (title -like $Position) -and (Enabled -eq $true) } | Select-Object -ExpandProperty SamAccountName
    $usrcopyfrom=$shablon[1]
  
  #Замена должности и отдела пользователя
    Set-ADUser -Identity $usrname -Department $department -Description $Position -Title $Position -Replace @{physicalDeliveryOfficeName = $department}

  #Текущее расположение перемещаемого пользователя
    $curuserpath= Get-ADUser -Identity $usrname |Select-Object -ExpandProperty DistinguishedName

  #Целевое расположение перемещаемого пользователя
    $usrprop= Get-ADUser -Identity $usrcopyfrom | Select-Object -ExpandProperty  DistinguishedName
    $newusrpath= ($usrprop -split ',',2)[1]
  
  #Перемещение пользователя
    Move-ADObject -Identity $curuserpath -TargetPath $newusrpath

  #Отключаем запрос на подтверждение при удалении из групп, и вывод ошибок.
    $ConfirmPreference = "None"
    $ErrorActionPreference = "SilentlyContinue"

  #Удаление всех групп у перемещаемого пользователя, кроме domain users
    Remove-ADPrincipalGroupMembership -Identity $usrname -MemberOf $(Get-ADPrincipalGroupMembership -Identity $usrname | Where-Object {$_.DistinguishedName -ne 'CN=Domain Users,CN=Users,DC=<b>domain</b>,DC=<b>local</b>'})

  #Копирование групп с пользовательского шаблона
    $groups=Get-ADUser -Identity $usrcopyfrom -Properties memberof | Select-Object -ExpandProperty memberof|Add-ADGroupMember -Members $usrname -PassThru | Select-Object -ExpandProperty SamAccountName
  
  #Вывод групп для отчета
    foreach ($group in $groups) {$smtpBody = $smtpBody +$group+"`n`n"}
   
  #Отправка отчета на почту
    Send-MailMessage -From $smtpfrom -Subject $opertype  -To $smtpto -Body "Пользователь $FIO ($usrname) ""$Position"" отдела ""$department"" перемещен.`n`nДобавлен в группы:`n$smtpBody"  -SmtpServer $smtpserv -Encoding $encoding
  
  #Очистка переменных
    $smtpBody=""
 
  }
  else
  {
    #Отправка отчета на почту
      Send-MailMessage -From $smtpfrom -Subject $opertype  -To $smtpto -Body "Пользователь $FIO ($usrname) уже имеет должность ""$Position"" отдела ""$department"""  -SmtpServer $smtpserv -Encoding $encoding
  }

    #Удаление обработанной строки из файла
      (Get-Content $dir$todayf) | Where-Object {$_ -notmatch $move} | Set-Content -Path $dir$todayf -Force
 }
}

#Запуск перемещения пользователя
if ($movestaff -ne $null)
{
   #Запуск функции создания пользователя
     #usrmove

   #Ожидание завершения процессов
    Start-Sleep -Seconds 10
    
}
else
{
    Write-Host "Нет пользователей для перемещения"
}

#Увольнение
  function usrdelete ()
{ 
  
  ForEach ($del in $delstaff) 
 {
 #Сплит массива
   $sdel=$del -split (";")
   $opertype = $sdel[0]
   $usrname=$sdel[1]
   $FIO=$sdel[2]
   $Position=$sdel[3]
   $department=$sdel[4]

   #Проверка на существование пользователя
   $usrdeleted =Get-ADUser -Identity $usrname | Where-Object {$_.Enabled -eq $false}
     if ($usrdeleted -eq $null)
  {

  #Отключаем запрос на подтверждение при удалении из групп, и вывод ошибок.
    $ConfirmPreference = "None"
    $ErrorActionPreference = "SilentlyContinue"

  #Отключение ящика пользователя
    Disable-Mailbox -Identity "$usrname@$usrdomain" -confirm:$false

  #Удаление всех групп у перемещаемого пользователя, кроме domain users
    Remove-ADPrincipalGroupMembership -Identity $usrname -MemberOf $(Get-ADPrincipalGroupMembership -Identity $usrname | Where-Object {$_.DistinguishedName -ne 'CN=Domain Users,CN=Users,DC=<b>domain</b>,DC=<b>local</b>'})

  #Текущее расположение перемещаемого пользователя
    $curuserpath = Get-ADUser -Identity $usrname |Select-Object -ExpandProperty DistinguishedName
  
  #Перемещение пользователя в контейнер отключенных пользователей
    Move-ADObject -Identity $curuserpath -TargetPath "OU=USER_DISABLE,OU=TO_DELETE_USER_COMPUTER_GROUP_OU,DC=<b>domain</b>,DC=<b>local</b>"

  #Отключение аккаунта пользователя
    Disable-ADAccount $usrname

  #Отправка отчета на почту
    Send-MailMessage -From $smtpfrom -Subject $opertype  -To $smtpto -Body "Пользователь $FIO ($usrname) ""$Position"" отдела ""$department"" уволен и отключен."  -SmtpServer $smtpserv -Encoding $encoding
    
  }

  else

  {

  #Отправка отчета на почту
    Send-MailMessage -From $smtpfrom -Subject $opertype  -To $smtpto -Body "Пользователь $FIO ($usrname) ""$Position"" отдела ""$department"" уже был отключен."  -SmtpServer $smtpserv -Encoding $encoding
  
  }
    #Удаление обработанной строки из файла
      (Get-Content $dir$todayf) | Where-Object {$_ -notmatch $del} | Set-Content -Path $dir$todayf -Force
 }
}

#Запуск перемещения пользователя
if ($delstaff -ne $null)
{
   #Запуск функции создания пользователя
     usrdelete

   #Ожидание завершения процессов
    Start-Sleep -Seconds 10
    
}
else
{
    Write-Host "Нет пользователей для перемещения"
}

Комментарии (27)


  1. kingpin
    01.04.2016 22:35

    Жесть.
    А что, 1С не поддерживает ActiveDirectory? Можно было обмениваться данными напрямую через LDAP минуя все эти файлы, сценарии оболочки.


    1. therb1
      02.04.2016 00:23

      Ты говоришь вполне логичные вещи и это именно то о чем я подумал в первую очередь, но данная идея была отметена в сторону в последствии.
      Я не спорю можно и ежа скрестить со слоном, но я не программист 1С и в связи с этим не очень знаю что она может и мне было проще написать такой обработчик на powershell так как файлы уже выгружались еще до моего прихода в компанию, и я не нашел ни одной статьи где бы освещалась работа 1С с AD.
      Да и мне кажется получилось бы значительно больше строк текста и тяжелее было бы что то добавить чем в этот скрипт.


      1. zorgzerg
        02.04.2016 07:49

        Делали такое несколько лет назад, только на JS. По-моему до сих пор успешно работает скриптец )


    1. ComodoHacker
      02.04.2016 11:18

      1С может работать со всем, что имеет COM интерфейс.


      1. tsklab
        02.04.2016 12:26

        ...


    1. dgr
      02.04.2016 12:16

      1С поддерживает COM, соответственно всё можно сделать, но для этого процесс 1С должен иметь соответствующие привилегии в AD, что не всегда правильно по безопасности. Ну и учесть, что для изменения логики надо изменять код, останавливать работу пользователей. Скрипт всегда проще править ))


      1. Asaharu
        03.04.2016 17:45

        В 1С можно редактировать AD под другой учетной записью, не под той которая запущена или под которой запущен сервер 1С. А вот как и где хранить пароль для доступа в AD это другой вопрос.


  1. ComodoHacker
    02.04.2016 11:18

    А что будет, если в 1С нажать кнопку "Отмена проведения"? :)


    1. tsklab
      02.04.2016 12:27

      Как всегда, потом придётся запускать что-то типа "Восстановления последовательности".


      1. ComodoHacker
        03.04.2016 10:55

        Я про человека, которого увольнять не собирались, но уже вычистили из AD.


  1. tsklab
    02.04.2016 12:13

    Ввиду не однозначности равенства пользователя домена и 1С, считаю, что начинать нужно от печки. То есть в начале создать учётную запись в AD, потом распространять её по программам учёта (техники, ресурсов и пр.), в том числе и 1С.
    Теперь проверка логики: «В нашей компании после заведения пользователя в 1C создается CSV файл с данными» и «Прием на работу». То есть вы создаёте пользователя 1С до приёма на работу? И начальник службы безопасности знает об этом?
    я не программист 1С
    И не надо, сделайте внешнюю обработку и воспользуйтесь в ней старой доброй LanManager share functions for Windows NT interface unit


    1. therb1
      02.04.2016 12:15

      По поводу логики я немного не верно написал, файл создается после приема на работу. "Прием на работу" это тэг для определения действия над пользователем.


    1. ComodoHacker
      03.04.2016 11:03
      +1

      Вы немного не поняли. В данном случае речь идет не об учетной записи пользователя в 1С, а о приказах о приеме на работу и увольнении. В 1С ведется кадровый учет, так что это и есть "печка".


  1. tsklab
    03.04.2016 12:03

    Выяснять, что первичней учётная запись AD или 1С — всё равно, что решать были-ли первым курица или яйцо. Для меня AD является основанием для настройки прикладных программ (в том числе 1С), поэтому — первично. Учётная запись AD создаётся или удаляется при визировании обходного листа сотрудника (как при приёме, так и увольнении). Я думаю, что указанный выше скрипт — итог перегруженности момента создания учётной записи AD (я создаю её с настройками по-умолчанию, дальнейшие изменения, после приказа, по служебным запискам начальников — распределение ресурсов).


  1. Dr_Wut
    03.04.2016 13:13

    Ну что ж, все с чего то начинали. У нас тоже сначала были файлики, потом перешли на sql. Гораздо удобнее.
    Что на мой взгляд явный минусы:

    Есть стандартная команда import-csv. Она сильно упрощает жизнь.
    Зачем парсить текст на наличие стоки? Вы уже договорились что вам будут выгружать csv — договоритесь о кодах дейстрия и введите поле action (типа 1 — прием, 2 — изменение, 3 — увальнение). И тогда не нужно будет делать 3 файла.
    Нет функционала смены ФИО. Наверное у вас маленькая компания, или женщин мало.
    Не понятно как вы реализовываете ключи для работы с учетками. У нас это сделано через код физлица 1С-кого.
    Есть ошибки в имени домена (оставлены спецсимволы)

    Такие скрипты уже встречались 2 или 3 раза на хабре не так давно, и не очень понятно чем отни отличаются.


    1. therb1
      03.04.2016 13:18

      Подобных скриптов на хабре да и в интернете лично я не нашел. get-content ни чем не хуже import-csv. Парсится весь файл не на наличие строки и для того что бы получить данные для обработки, так как если файл пуст то ничего и не произойдет. Файл имеет имя сегодняшнего числа и в него дописываются все кадровые изменения сделанные сегодня, если изменение предпологается в будущем то 1С создает файл с нужной датой и он скриптом обработается в тот день когда указанно по дате. Поле action и есть первое поле.


      1. Dr_Wut
        04.04.2016 01:07
        +1

        В данной задаче Get-Content однозначно хуже. Давайте смотреть на примере вашего файла
        Использование import-csv

        ForEach ($User in (import-csv -path import.csv -declimer ";"))
            {
                Switch ($user."document type")
                    {
                        "прием на работу"
                            {
                                какое-либо действие
                            }
                        "перемещение"
                            {
                                какое-либо действие
                            }
                        "увольнение"
                            {
                                какое-либо действие
                            }
                    }
            }

        То есть практически весь скрипт — это один ForEach + функции (да и те можно не делать)

        А теперь сравните с вашим вариантом. Вы заменяете одну команду на 21 (6 на split 3 раза и еще 3 раза вы читаете файл (один и тот же кстати сказать))

        Так же у вас нет обязательных проверок на то, что вы получаете. К примеру, SamAccountName не может быть более 20 символов — в скрипте это не учтено.

        Я вовсе не пытаюсь сказать что ваш скрипт плох, нет. Просто судя по всему вы никогда не задавались вопросом оптимизации и производительности и в вашем случае этим можно пренебречь. Но раз уж вы решились выложить это на всеобщее обозрение — будьте готовы к критике.


        1. therb1
          04.04.2016 11:40

          Спасибо за комментарий. Вы кстати где то ошиблись в своей конструкции import csv не имеет параметра -declimer.


        1. therb1
          04.04.2016 13:32

          Плюс к этому ваша конструкция выдаст ошибку если одновременно на одно действие будет два пользователя. (к примеру два приема на работу)


          1. Dr_Wut
            04.04.2016 13:47

            Плюс к этому ваша конструкция выдаст ошибку если одновременно на одно действие будет два пользователя. (к примеру два приема на работу)

            Такое случиться только в одном случае — если будет попытка принять одного и того же человека 2 раза. Но это ошибка не скрипта.
            Спасибо за комментарий. Вы кстати где то ошиблись в своей конструкции import csv не имеет параметра -declimer.

            Писал по памяти, ошибся. Правильный параметр — Delimiter ";" — он указывает какой символ является разделителем.


      1. Dr_Wut
        04.04.2016 01:16

        Подобных скриптов на хабре да и в интернете лично я не нашел.

        Ну как минимум аналогичная задача рассматривалась тут. Правда в более глобальном масштабе.


  1. gibiw
    04.04.2016 11:41

    а зачем вы делаете несколько раз Get-ADUser -Identity $usrcopyfrom, если можно получить сразу все необходимые свойства в переменную и уже из нее забирать, например:
    $usrprop= Get-ADUser -Identity $usrcopyfrom -Properties DistinguishedName,...,company
    $company=$usrprop.company


    1. therb1
      04.04.2016 11:42

      Спасибо я это учту. Пишу скрипт таких масштабов в первый раз и возможно что то можно оптимизировать. Так мне показалось понятней будет, да и задержки от этого никакой.


  1. Garfield1973
    04.04.2016 13:32

    три года назад с этого и начинали. Если интересно, могу показать во что это вылилось спустя какое то время :)


    1. therb1
      04.04.2016 13:32

      было бы очень интересно посмотреть.


      1. Garfield1973
        05.04.2016 04:45

        в личку. на v.kovalev@live.ru например


        1. therb1
          05.04.2016 17:52

          Написал тебе. Спасибо.