none
PowerShell: работа с списком пользователей и генерация паролей

    Вопрос

  • Появилось задание:
    Есть список пользователей вида:

    Теплов Дмитрий Юрьевич Антонов Павел Константинович Калабанов Кол Колович Пупкин Антон Геннадьевич Тупкин Тупой Тупович Петров Василий Олегович Кузбасов Омар Хаямович Пушкин Александр Сергеевич Ольнева Галина Семеновна Культит Евгений Оспиович Калька Антон Григорьевич Антон Геннадий Павел Вася Петя Маша Коля Оля Федя Уфа Кузбас Петрозавдоск

    ....

    Нужно:
    А) Создать пользователей в Active Directory
    Правила имен пользователей в AD:
    3-4 символа, в основном это первые буквы Фио, в произвольном порядке
    Все пользователи члены одного OU, у всех одни права и пароль одинаковый с последующей заменой.

    Б) Создать список вида:

    Имя пользователя AD | Пароль* | ФИО
    test;qWe12r;Ivanov I.I.               

    *пароль 6 символов, должна быть минимум 1 цифра и минимум 1 буква

    Как я представляю себе работу:

    • Делаю транслит имен
    • Генерирую логины AD - беру 3 буквы фио, проверяю на наличие, если есть случайно меняю местами. Уязвимое место в том, что у меня 3 буквы а допустимо и 4, боюсь в 3 буквы просто не влезут все пользователи (как я понял их может быть около 300), да и как местами их менять мне пока не понятно. Это пока самое проблемное место.
    • Создаю список вида Имя Пользователя ad, ФИО Полностью, ФИО без полного ИО. Это нужно для ручной проверки на всякие "нехорошие" имена и для пункта Б
    • Имея список создаю пользователей. 

    Это для пункта А.

    Для пункта Б.

    • Беру список, убираю оттуда полное ФИО (вручную)
    • Транслитеризирую (не уверен в правильности написания слова) список
    • Генерирую пароли
    • Собираю список.

    Сейчас у меня есть:
    Функция транслита и генерации пароля и я столкнулся с такой проблемой:

    #функция транслита
    
    function global:Translit
    {
         param([string]$inString)
        $Translit = @{ 
        [char]'а' = "a"
        [char]'А' = "A"
        [char]'б' = "b"
        [char]'Б' = "B"
        [char]'в' = "v"
        [char]'В' = "V"
        [char]'г' = "g"
        [char]'Г' = "G"
        [char]'д' = "d"
        [char]'Д' = "D"
        [char]'е' = "e"
        [char]'Е' = "E"
        [char]'ё' = "yo"
        [char]'Ё' = "Yo"
        [char]'ж' = "zh"
        [char]'Ж' = "Zh"
        [char]'з' = "z"
        [char]'З' = "Z"
        [char]'и' = "i"
        [char]'И' = "I"
        [char]'й' = "j"
        [char]'Й' = "J"
        [char]'к' = "k"
        [char]'К' = "K"
        [char]'л' = "l"
        [char]'Л' = "L"
        [char]'м' = "m"
        [char]'М' = "M"
        [char]'н' = "n"
        [char]'Н' = "N"
        [char]'о' = "o"
        [char]'О' = "O"
        [char]'п' = "p"
        [char]'П' = "P"
        [char]'р' = "r"
        [char]'Р' = "R"
        [char]'с' = "s"
        [char]'С' = "S"
        [char]'т' = "t"
        [char]'Т' = "T"
        [char]'у' = "u"
        [char]'У' = "U"
        [char]'ф' = "f"
        [char]'Ф' = "F"
        [char]'х' = "h"
        [char]'Х' = "H"
        [char]'ц' = "c"
        [char]'Ц' = "C"
        [char]'ч' = "ch"
        [char]'Ч' = "Ch"
        [char]'ш' = "sh"
        [char]'Ш' = "Sh"
        [char]'щ' = "sch"
        [char]'Щ' = "Sch"
        [char]'ъ' = ""
        [char]'Ъ' = ""
        [char]'ы' = "y"
        [char]'Ы' = "Y"
        [char]'ь' = ""
        [char]'Ь' = ""
        [char]'э' = "e"
        [char]'Э' = "E"
        [char]'ю' = "yu"
        [char]'Ю' = "Yu"
        [char]'я' = "ya"
        [char]'Я' = "Ya"
        }
        $outCHR=""
        foreach ($CHR in $inCHR = $inString.ToCharArray())
            {
            if ($Translit[$CHR] -cne $Null ) 
                {$outCHR += $Translit[$CHR]}
            else
                {$outCHR += $CHR}
            }
        Write-Output $outCHR
     }
     #Функция генерации пароля
     function global:Password
     {
     DO {
     $password = $null
    #объект Random
    $rnd = New-Object Random
    
    #символы пароля (убраны 1,I,0,O и т.д.)
    $chr = "abdefghijkmnpqrstuvwxyzABDEFGHJKLMNPQRSTUVWXYZ23456789"
    
    #генерируем пароль
    $i = 0; while ($i -ne 6) {$password += $chr[$rnd.Next(0, [int]($chr.length))]; $i++}
    }
    #Проверяем наличие цифры в пароле
    Until ($password -cmatch "[A-Z][a-z][1-9]")
    Write-Output $password
    }
    Get-Content "c:\users.txt" | ForEach-Object {Translit($_),(Password)} > C:\translit.txt
    C:\translit.txt

    Если входящий файл:

    Теплов Дмитрий Юрьевич
    Антонов Павел Константинович
    Калабанов Кол Колович
    Пупкин Антон Геннадьевич
    Тупкин Тупой Тупович
    Петров Василий Олегович
    Кузбасов Омар Хаямович
    Пушкин Александр Сергеевич
    Ольнева Галина Семеновна
    Культит Евгений Оспиович
    Калька Антон Григорьевич
    Антон Геннадий Павел
    Вася Петя Маша
    Коля Оля Федя
    Уфа Кузбас Петрозавдоск

    На выходе имею:

    Teplov Dmitrij Yurevich utAQr9
    Antonov Pavel Konstantinovich utAQr9
    Kalabanov Kol Kolovich utAQr9
    Pupkin Anton Gennadevich utAQr9
    Tupkin Tupoj Tupovich utAQr9
    Petrov Vasilij Olegovich utAQr9
    Kuzbasov Omar Hayamovich utAQr9
    Pushkin Aleksandr Sergeevich utAQr9
    Olneva Galina Semenovna utAQr9
    Kultit Evgenij Ospiovich kWQy5t
    Kalka Anton Grigorevich kWQy5t
    Anton Gennadij Pavel kWQy5t
    Vasya Petya Masha kWQy5t
    Kolya Olya Fedya kWQy5t
    Ufa Kuzbas Petrozavdosk kWQy5t
    

    Непонятно почему все пароли одинаковые. Подскажите пожалуйста в чем я неправ.

    18 апреля 2013 г. 7:55

Ответы

  • Добавьте небольшую задержку:

    Get-Content "c:\users.txt" | ForEach-Object {Translit($_),(Password);Start-Sleep -Mi 10}
    18 апреля 2013 г. 8:06
    Отвечающий
  • Тупо, добавил перебор(ipv,ivpv,ipav,ipvl и т.д):

    ##########################################
    #Работаем с AD
    # Переходим на нужную позицию
    Function Check-Name($name) {
    	$sams -eq $name -or $new -eq $name
    }
    $sams = Get-ADUser -Filter * | Foreach {$_.SamAccountName}
    $new = @()
    $Row = 2
    $Column = 1
    Get-Content "c:\users.txt" | ForEach-Object { 
    	$f,$n,$o=$_.ToLower().split(" ")
    	$adname = $f[0]+$n[0]+$o[0]
    	if(Check-Name $adname) {
    		:ADName
    		for($x=1;$x -lt $f.length;$x++)
    		{
    			$adname = -join ($f[0,$x]+$n[0]+$o[0])
    			if(Check-Name $adname) {
    				for($y=1;$y -lt $n.length;$y++)
    				{
    					$adname = -join (,$f[0]+$n[0,$y]+$o[0])
    					if(Check-Name $adname) {
    						for($z=1;$z -lt $o.length;$z++)
    						{	
    							$adname = -join (,$f[0]+$n[0]+$o[0,$z])
    							if(!(Check-Name $adname)) {break ADName}
    						}
    					}
    					else {
    						break ADName
    					}
    				}
    			}
    			else {
    				break ADName
    			}
    		}
    	}
    	$new += $adname
    	$Table.Cells.Item($Row, $Column) = $adname
    	$Row++
    }

    19 апреля 2013 г. 5:57
    Отвечающий

Все ответы

  • Добавьте небольшую задержку:

    Get-Content "c:\users.txt" | ForEach-Object {Translit($_),(Password);Start-Sleep -Mi 10}
    18 апреля 2013 г. 8:06
    Отвечающий
  • Могу предложить свою функцию генерации пароля:
    function Get-RandomPassword{
        [CmdletBinding(DefaultParameterSetName='DefaultChars')]
        param(
            [Parameter(Position=1)]
            [Int]$Length=20,
            [Parameter(ParameterSetName='DefaultChars')]
            [Switch]$SafeChars,
            [Parameter(Mandatory=$true,ParameterSetName='CustomChars',Position=2)]
            [String]$Chars
        )
        if($PSCmdlet.ParameterSetName-eq'DefaultChars'){
            $Chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
            if(!$SafeChars){
                $Chars+='`~!@#$%^&*()-_=+[{]};:''"\|,<.>/?'
            }
        }
        $Count=[UInt64]$Chars.Length
        $RNG=New-Object Security.Cryptography.RNGCryptoServiceProvider
        $RNGBytes=[Array]::CreateInstance([Byte],$Length*8)
        $RNG.GetBytes($RNGBytes)
        $RNG.Dispose()
        $RNGULongs=[Array]::CreateInstance([UInt64],$Length)
        [Buffer]::BlockCopy($RNGBytes,0,$RNGULongs,0,$Length*8)
        $RNGChars=[Array]::CreateInstance([Char],$Length)
        for($i=0;$i-lt$Length;++$i){
            $RNGChars[$i]=$Chars[$RNGULongs[$i]%$Count]
        }
        New-Object String (,$RNGChars)
    }
    Ваша проблема описана в справке к классу System.Random:

    Генерация случайных чисел начинается с начального значения. При повторном использовании того же начального значения создается та же последовательность чисел. Одним из способов получения различных последовательностей является выбор зависимого от времени начального значения, что позволяет создавать различные последовательности для каждого нового экземпляра Random. По умолчанию в лишенном параметров конструкторе класса Random для генерации начального значения используются системные часы, в то время как параметризованный конструктор данного класса может принимать значение типа Int32, зависящее от количества тактов в текущем времени. Однако, вследствие конечности разрешающей способности часов, использование конструктора без параметров при создании различных объектов Random в быстрой последовательности приводит к созданию генераторов случайных чисел, производящих идентичные числовые последовательности. В следующем примере показано, что два объекта Random, экземпляры которых создаются в быстрой последовательности, создают идентичные наборы случайных чисел.

    Эту проблему можно устранить, создав единый объект Random вместо нескольких генераторов случайных чисел.

    Для повышения производительности нужно создать один объект Random для генерации множества случайных чисел с течением времени, отказавшись от создания новых генераторов Random для каждого случайного числа.

    Для генерации криптографически защищенного случайного числа, пригодного, например, для создания случайного пароля, следует использовать класс, производный от класса System.Security.Cryptography.RandomNumberGenerator, такой как System.Security.Cryptography.RNGCryptoServiceProvider.

    P.S.
    Условие
    $password -cmatch "[A-Z][a-z][1-9]"
    проверяет, что есть большая буква, сразу после которой идёт малекая, сразу после которой идёт цифра. Наверное будет лучше использовать:
    $password -cmatch "^(?=.*[A-Z])(?=.*[a-z])(?=.*[1-9])"
    • Изменено PetSerAl 18 апреля 2013 г. 10:21
    18 апреля 2013 г. 9:28
  • Kazun спасибо вам!

    PetSerAl, спасибо за регулярное выражение, так явно правильнее выходит. Почитал справку, пригодилась. Функцию сохраню на будущее :-)

    Кое как пишу, вот что сейчас у меня:

    #функция транслита
    
    function global:Translit
    {
         param([string]$inString)
        $Translit = @{ 
        [char]'а' = "a"
        [char]'А' = "A"
        [char]'б' = "b"
        [char]'Б' = "B"
        [char]'в' = "v"
        [char]'В' = "V"
        [char]'г' = "g"
        [char]'Г' = "G"
        [char]'д' = "d"
        [char]'Д' = "D"
        [char]'е' = "e"
        [char]'Е' = "E"
        [char]'ё' = "yo"
        [char]'Ё' = "Yo"
        [char]'ж' = "zh"
        [char]'Ж' = "Zh"
        [char]'з' = "z"
        [char]'З' = "Z"
        [char]'и' = "i"
        [char]'И' = "I"
        [char]'й' = "j"
        [char]'Й' = "J"
        [char]'к' = "k"
        [char]'К' = "K"
        [char]'л' = "l"
        [char]'Л' = "L"
        [char]'м' = "m"
        [char]'М' = "M"
        [char]'н' = "n"
        [char]'Н' = "N"
        [char]'о' = "o"
        [char]'О' = "O"
        [char]'п' = "p"
        [char]'П' = "P"
        [char]'р' = "r"
        [char]'Р' = "R"
        [char]'с' = "s"
        [char]'С' = "S"
        [char]'т' = "t"
        [char]'Т' = "T"
        [char]'у' = "u"
        [char]'У' = "U"
        [char]'ф' = "f"
        [char]'Ф' = "F"
        [char]'х' = "h"
        [char]'Х' = "H"
        [char]'ц' = "c"
        [char]'Ц' = "C"
        [char]'ч' = "ch"
        [char]'Ч' = "Ch"
        [char]'ш' = "sh"
        [char]'Ш' = "Sh"
        [char]'щ' = "sch"
        [char]'Щ' = "Sch"
        [char]'ъ' = ""
        [char]'Ъ' = ""
        [char]'ы' = "y"
        [char]'Ы' = "Y"
        [char]'ь' = ""
        [char]'Ь' = ""
        [char]'э' = "e"
        [char]'Э' = "E"
        [char]'ю' = "yu"
        [char]'Ю' = "Yu"
        [char]'я' = "ya"
        [char]'Я' = "Ya"
        }
        $outCHR=""
        foreach ($CHR in $inCHR = $inString.ToCharArray())
            {
            if ($Translit[$CHR] -cne $Null ) 
                {$outCHR += $Translit[$CHR]}
            else
                {$outCHR += $CHR}
            }
        Write-Output $outCHR
     }
     #Функция генерации пароля
     function global:Password
     {
     DO {
     $password = $null
    #объект Random
    $rnd = New-Object Random
    
    #символы пароля (убраны 1,I,0,O и т.д.)
    $chr = "abdefghijkmnpqrstuvwxyzABDEFGHJKLMNPQRSTUVWXYZ23456789"
    
    #генерируем пароль
    $i = 0; while ($i -ne 6) {$password += $chr[$rnd.Next(0, [int]($chr.length))]; $i++}
    }
    #Проверяем наличие цифры в пароле
    Until ($password -cmatch "^(?=.*[A-Z])(?=.*[a-z])(?=.*[1-9])")
    Write-Output $password
    }
    #Get-Content "c:\users.txt" | ForEach-Object {Translit($_),(Password);Start-Sleep -Mi 5} > C:\translit.txt
     
     # Созадём объект Excel
    $Excel = New-Object -ComObject Excel.Application
    # Делаем его видимым
    $Excel.Visible = $true
    #Создаем книгу
    $WorkBook = $Excel.Workbooks.Add()
    #переменная листа
    $Table = $WorkBook.Worksheets.Item(1)
    # Заполняем ячейки - шапку таблицы
    $Table.Cells.Item(1,1) = 'AD Имя'
    $Table.Cells.Item(1,2) = 'ФИО полностью'
    $Table.Cells.Item(1,3) = 'ФИО укороченное'
    $Table.Cells.Item(1,4) = 'ФИО транслит'
    $Table.Cells.Item(1,5) = 'Пароль'
    # Работаем с ФИО полностью
    # Переходим на нужную позицию
    $Row = 2
    $Column = 2
    #Заполяем
    Get-Content "c:\users.txt" | ForEach-Object {
        $Table.Cells.Item($Row, $Column) = $_
        $Row++	
    }
    #счетчик общего кол-ва пользователей для генерации паролей
    $usercountrow = $Row
    # Работаем с паролем
    # Переходим на нужную позицию
    $Row = 2
    $Column = 5
    #Заполяем
    Do
    {$Table.Cells.Item($Row, $Column) = (Password)
    $Row++
    Start-Sleep -Mi 5}
    #заполняем до конца
    Until ($Row -match $usercountrow)
    # Работаем с ФИО укорочененное
    # Переходим на нужную позицию
    $Row = 2
    $Column = 3
    #Заполяем
    Get-Content "c:\users.txt" | ForEach-Object {
        $Table.Cells.Item($Row, $Column) = $_
        $Row++	
    }

    Теперь думаю как организовать обрубание лишних букв Фамилии и Очества, и финально геморрой с AD, не поможете примерами? Мне на примерах как - то все дается

    Обрубание наверное через -Replace и выражения нужно делать?

    С Ad думаю сделать так: берем первые буквы к примеру Ivanov Pavel Vladimirovich - ipv
    проверяем на наличие в AD, если есть то ivpv, если и такое есть то ipav, а если и такое уже есть, то ipvl.
    Ну и в самом крайнем случае даже не знаю что делать, как - то вручную вводить, но как тоже пока не придумал

    • Изменено ice-study 18 апреля 2013 г. 11:34
    18 апреля 2013 г. 11:17
  • PS > $f,$n,$o="Ivanov Pavel Vladimirovich".ToLower().split(" ")
    PS > $f[0]+$n[0]+$o[0]
    ipv
    PS > -join ($f[0,1]+$n[0]+$o[0])
    ivpv
    PS > -join (,$f[0]+$n[0,1]+$o[0])
    ipav
    PS > -join (,$f[0]+$n[0]+$o[0,1])
    ipvl

    Получить все SAM из AD : $sams = Get-ADUser -Filter * | Foreach {$_.SamAccountName} и в дальнейшем сравнивать с этим списком, плюс ввести список для новых. 

    • Изменено KazunEditor 18 апреля 2013 г. 12:59
    18 апреля 2013 г. 12:57
    Отвечающий
  • #функция транслита
    Import-Module ActiveDirectory
    function global:Translit
    {
         param([string]$inString)
        $Translit = @{ 
        [char]'а' = "a"
        [char]'А' = "A"
        [char]'б' = "b"
        [char]'Б' = "B"
        [char]'в' = "v"
        [char]'В' = "V"
        [char]'г' = "g"
        [char]'Г' = "G"
        [char]'д' = "d"
        [char]'Д' = "D"
        [char]'е' = "e"
        [char]'Е' = "E"
        [char]'ё' = "yo"
        [char]'Ё' = "Yo"
        [char]'ж' = "zh"
        [char]'Ж' = "Zh"
        [char]'з' = "z"
        [char]'З' = "Z"
        [char]'и' = "i"
        [char]'И' = "I"
        [char]'й' = "j"
        [char]'Й' = "J"
        [char]'к' = "k"
        [char]'К' = "K"
        [char]'л' = "l"
        [char]'Л' = "L"
        [char]'м' = "m"
        [char]'М' = "M"
        [char]'н' = "n"
        [char]'Н' = "N"
        [char]'о' = "o"
        [char]'О' = "O"
        [char]'п' = "p"
        [char]'П' = "P"
        [char]'р' = "r"
        [char]'Р' = "R"
        [char]'с' = "s"
        [char]'С' = "S"
        [char]'т' = "t"
        [char]'Т' = "T"
        [char]'у' = "u"
        [char]'У' = "U"
        [char]'ф' = "f"
        [char]'Ф' = "F"
        [char]'х' = "h"
        [char]'Х' = "H"
        [char]'ц' = "c"
        [char]'Ц' = "C"
        [char]'ч' = "ch"
        [char]'Ч' = "Ch"
        [char]'ш' = "sh"
        [char]'Ш' = "Sh"
        [char]'щ' = "sch"
        [char]'Щ' = "Sch"
        [char]'ъ' = ""
        [char]'Ъ' = ""
        [char]'ы' = "y"
        [char]'Ы' = "Y"
        [char]'ь' = ""
        [char]'Ь' = ""
        [char]'э' = "e"
        [char]'Э' = "E"
        [char]'ю' = "y"
        [char]'Ю' = "Y"
        [char]'я' = "ya"
        [char]'Я' = "Ya"
        }
        $outCHR=""
        foreach ($CHR in $inCHR = $inString.ToCharArray())
            {
            if ($Translit[$CHR] -cne $Null ) 
                {$outCHR += $Translit[$CHR]}
            else
                {$outCHR += $CHR}
            }
        Write-Output $outCHR
     }
     #Функция генерации пароля
     function global:Password
     {
     DO {
     $password = $null
    #объект Random
    $rnd = New-Object Random
    
    #символы пароля (убраны 1,I,0,O и т.д.)
    $chr = "abdefghijkmnpqrstuvwxyzABDEFGHJKLMNPQRSTUVWXYZ23456789"
    
    #генерируем пароль
    $i = 0; while ($i -ne 6) {$password += $chr[$rnd.Next(0, [int]($chr.length))]; $i++}
    }
    #Проверяем наличие цифры в пароле
    Until ($password -cmatch "^(?=.*[A-Z])(?=.*[a-z])(?=.*[1-9])")
    Write-Output $password
    }
    #Get-Content "c:\users.txt" | ForEach-Object {Translit($_),(Password);Start-Sleep -Mi 5} > C:\translit.txt
     
     # Созадём объект Excel
    $Excel = New-Object -ComObject Excel.Application
    # Делаем его видимым
    $Excel.Visible = $true
    #Создаем книгу
    $WorkBook = $Excel.Workbooks.Add()
    #переменная листа
    $Table = $WorkBook.Worksheets.Item(1)
    # Заполняем ячейки - шапку таблицы
    $Table.Cells.Item(1,1) = 'AD Имя'
    $Table.Cells.Item(1,2) = 'ФИО полностью'
    $Table.Cells.Item(1,3) = 'ФИО укороченное'
    $Table.Cells.Item(1,4) = 'ФИО транслит'
    $Table.Cells.Item(1,5) = 'Пароль'
    $Table.Cells.Item(1,6) = 'ФИО транслит полное'
    # Работаем с ФИО полностью
    # Переходим на нужную позицию
    $Row = 2
    $Column = 2
    #Заполяем
    Get-Content "c:\users.txt" | ForEach-Object {
        $Table.Cells.Item($Row, $Column) = $_
        $Row++	
    }
    #счетчик общего кол-ва пользователей 
    $usercountrow = $Row
    # Работаем с паролем
    # Переходим на нужную позицию
    $Row = 2
    $Column = 5
    #Заполяем
    Do
    {$Table.Cells.Item($Row, $Column) = (Password)
    $Row++
    Start-Sleep -Mi 5}
    #заполняем до конца
    Until ($Row -match $usercountrow)
    # Работаем с ФИО укорочененное
    # Переходим на нужную позицию
    $Row = 2
    $Column = 3
    #Заполяем
    Get-Content "c:\users.txt" | ForEach-Object {
        $a = "$_" -split "[ ]", 2
    $b = $a[1] -creplace "[а-я]" -replace "[ ]","."
    $c = $a[0]+" "+$b+"."
    	
    	$Table.Cells.Item($Row, $Column) = $c
        $Row++	
    }
    # Работаем с ФИО транслит
    # Переходим на нужную позицию
    $Row = 2
    $Column = 4
    #Заполяем
    Do {
    $Table.Cells.Item($Row, $Column) = (Translit($Table.Cells.Item($Row, 3).Text))
    $Row++}
    Until ($Row -match $usercountrow)
    # Работаем с ФИО транслит полное
    # Переходим на нужную позицию
    $Row = 2
    $Column = 6
    #Заполяем
    Do {
    $Table.Cells.Item($Row, $Column) = (Translit($Table.Cells.Item($Row, 2).Text))
    $Row++}
    Until ($Row -match $usercountrow)
    ##########################################
    #Работаем с AD
    # Переходим на нужную позицию
    $Row = 2
    $Column = 1
    #Заполяем
    Do { $f,$n,$o=$Table.Cells.Item($Row, 6).Text.ToLower().split(" ")
    $sn= -join ($f[0]+$n[0]+$o[0])
    $User = Get-ADUser -f {SamAccountName -eq $sn}
    if ($User) {$Table.Cells.Item($Row, $Column) = "занято"}
    else {$Table.Cells.Item($Row, $Column) = $sn}
    $Row++}
    Until ($Row -match $usercountrow)

    Вот что вышло пока.

    Kazun, а я вот думал сделать на основе if($user), но пока чет туго, знаний маловато у меня.

    18 апреля 2013 г. 14:40
  • Тупо, добавил перебор(ipv,ivpv,ipav,ipvl и т.д):

    ##########################################
    #Работаем с AD
    # Переходим на нужную позицию
    Function Check-Name($name) {
    	$sams -eq $name -or $new -eq $name
    }
    $sams = Get-ADUser -Filter * | Foreach {$_.SamAccountName}
    $new = @()
    $Row = 2
    $Column = 1
    Get-Content "c:\users.txt" | ForEach-Object { 
    	$f,$n,$o=$_.ToLower().split(" ")
    	$adname = $f[0]+$n[0]+$o[0]
    	if(Check-Name $adname) {
    		:ADName
    		for($x=1;$x -lt $f.length;$x++)
    		{
    			$adname = -join ($f[0,$x]+$n[0]+$o[0])
    			if(Check-Name $adname) {
    				for($y=1;$y -lt $n.length;$y++)
    				{
    					$adname = -join (,$f[0]+$n[0,$y]+$o[0])
    					if(Check-Name $adname) {
    						for($z=1;$z -lt $o.length;$z++)
    						{	
    							$adname = -join (,$f[0]+$n[0]+$o[0,$z])
    							if(!(Check-Name $adname)) {break ADName}
    						}
    					}
    					else {
    						break ADName
    					}
    				}
    			}
    			else {
    				break ADName
    			}
    		}
    	}
    	$new += $adname
    	$Table.Cells.Item($Row, $Column) = $adname
    	$Row++
    }

    19 апреля 2013 г. 5:57
    Отвечающий
  • Красиво у вас написано, я грубо через if сделал, сейчас разберусь с вашим кодом и попробую его поставить.

    ##########################################
    #Работаем с AD
    # Переходим на нужную позицию
    $Row = 2
    $Column = 1
    #Заполяем
    
    #создаем массив всех SAM имен
    $sams = Get-ADUser -Filter * | Foreach {$_.SamAccountName}
    Do { $f,$n,$o=$Table.Cells.Item($Row, 6).Text.ToLower().split(" ")
    #в sn храним предполагаемое SAM имя.
    $sn= -join ($f[0]+$n[0]+$o[0])
    #Дальше перебором проверяем наличие имени в массиве. Как только имя найденно, пишем его в файл и в массив. Если нет пишем "руками"
    if ($sams -contains $sn) {$sn= -join ($f[0]+$n[0]+$o[0])
    
    if ($sams -contains $sn) {$sn= -join ($f[0,1]+$n[0]+$o[0])
    if ($sams -contains $sn) {$sn= -join (,$f[0]+$n[0,1]+$o[0])
    if ($sams -contains $sn) {$sn= -join (,$f[0]+$n[0]+$o[0,1]) 
    if ($sams -contains $sn) {$Table.Cells.Item($Row, $Column) = "руками"
    }
    else {$Table.Cells.Item($Row, $Column) = $sn
    
    }
    }
    else {$Table.Cells.Item($Row, $Column) = $sn}
    $sams += $sn
    }
    else {$Table.Cells.Item($Row, $Column) = $sn
    $sams += $sn
    }
    }
    else {$Table.Cells.Item($Row, $Column) = $sn
    $sams += $sn
    }
    }
    else {$Table.Cells.Item($Row, $Column) = $sn
    $sams += $sn
    }
    $Row++}
    Until ($Row -match $usercountrow)

    19 апреля 2013 г. 7:06