none
PowerShell. Windows Form RRS feed

  • Вопрос

  • Здравствуйте!

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

    Вот сама форма:

    #Сначала с помощью скрипта загружаются два класса .NET Framework: System.Drawing и System.Windows.Forms
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing
    
    #Затем вы запускаете новый экземпляр класса .NET Framework System.Windows.Forms.Form, предоставляющий пустую форму или окно, в которые можно добавить элементы управления.
    $form = New-Object System.Windows.Forms.Form
    
    #После создания экземпляра класса "Форма" назначьте значения для трех свойств этого класса. .Text - Это будет заголовком окна.
    $form.Text = 'Create new Active Directory user'
    
    #Это размер формы в пикселях. Предыдущий сценарий создает форму шириной 300 пикселей и высотой 200 пикселей.
    $form.Size = New-Object System.Drawing.Size(500,400)
    
    <#Для этого дополнительного свойства задается значение CenterScreen в предыдущем сценарии. Если это свойство не добавлено, Windows выберет расположение после открытия формы.
    Если для StartingPosition задать значение CenterScreen, форма будет автоматически отображаться в центре экрана при загрузке.#>
    $form.StartPosition = 'CenterScreen'
    $form.AutoSize = $true
    
    #=============================================================================================================================================================================================#
    #Описание Меток Полей ввода данных.
    #Далее введите текст метки в окне, который должны получить пользователи.
    $label_FIO = New-Object System.Windows.Forms.Label
    $label_FIO.Location = New-Object System.Drawing.Point(10,20)
    $label_FIO.Size = New-Object System.Drawing.Size(280,20)
    $label_FIO.Text = 'Введите ФИО сотрудника:'
    $form.Controls.Add($label_FIO)
    
    $label_SAN = New-Object System.Windows.Forms.Label
    $label_SAN.Location = New-Object System.Drawing.Point(300,20)
    $label_SAN.Size = New-Object System.Drawing.Size(150,20)
    $label_SAN.Text = 'Введите логин сотрудника в формате SamAccountName:'
    $label_SAN.AutoSize = $true
    $form.Controls.Add($label_SAN)
    
    $label_Position = New-Object System.Windows.Forms.Label
    $label_Position.Location = New-Object System.Drawing.Point(10,80)
    $label_Position.Size = New-Object System.Drawing.Size(150,20)
    $label_Position.Text = 'Укажите должность сотрудника:'
    $label_Position.AutoSize = $true
    $form.Controls.Add($label_Position)
    
    $label_Department = New-Object System.Windows.Forms.Label
    $label_Department.Location = New-Object System.Drawing.Point(300,80)
    $label_Department.Size = New-Object System.Drawing.Size(150,20)
    $label_Department.Text = 'Укажите отдел сотрудника:'
    $label_Department.AutoSize = $true
    $form.Controls.Add($label_Department)
    
    $label_Director = New-Object System.Windows.Forms.Label
    $label_Director.Location = New-Object System.Drawing.Point(10,140)
    $label_Director.Size = New-Object System.Drawing.Size(150,20)
    $label_Director.Text = 'Укажите ФИО Руководителя сотрудника:'
    $label_Director.AutoSize = $true
    $form.Controls.Add($label_Director)
    
    $label_listview = New-Object System.Windows.Forms.Label
    $label_listview.Location = New-Object System.Drawing.Point(10,200)
    $label_listview.Size = New-Object System.Drawing.Size(150,20)
    $label_listview.Text = 'Результат выполнения:'
    $label_listview.AutoSize = $true
    $form.Controls.Add($label_listview)
    
    #=============================================================================================================================================================================================#
    #=============================================================================================================================================================================================#
    #Поля ввода данных
    #Добавьте элемент управления (в данном случае текстовое поле), который позволит пользователям указать сведения, описанные в тексте метки. 
    $textBox_FIO = New-Object System.Windows.Forms.TextBox
    $textBox_FIO.Location = New-Object System.Drawing.Point(10,40)
    $textBox_FIO.Size = New-Object System.Drawing.Size(260,20)
    $form.Controls.Add($textBox_FIO)
    
    $textBox_SAN = New-Object System.Windows.Forms.TextBox
    $textBox_SAN.Location = New-Object System.Drawing.Point(300,40)
    $textBox_SAN.Size = New-Object System.Drawing.Size(260,20)
    $textBox_SAN.Text = 'Пример: aivanov'
    $textBox_SAN.AutoSize = $true
    $form.Controls.Add($textBox_SAN)
    
    $textBox_Position = New-Object System.Windows.Forms.TextBox
    $textBox_Position.Location = New-Object System.Drawing.Point(10,100)
    $textBox_Position.Size = New-Object System.Drawing.Size(260,20)
    $textBox_Position.AutoSize = $true
    $form.Controls.Add($textBox_Position)
    
    $textBox_Department = New-Object System.Windows.Forms.TextBox
    $textBox_Department.Location = New-Object System.Drawing.Point(300,100)
    $textBox_Department.Size = New-Object System.Drawing.Size(260,20)
    $textBox_Department.AutoSize = $true
    $form.Controls.Add($textBox_Department)
    
    $textBox_Director = New-Object System.Windows.Forms.TextBox
    $textBox_Director.Location = New-Object System.Drawing.Point(10,160)
    $textBox_Director.Size = New-Object System.Drawing.Size(260,20)
    $textBox_Director.AutoSize = $true
    $form.Controls.Add($textBox_Director)
    
    <#$textBox_Result = New-Object System.Windows.Forms.TextBox
    $textBox_Result.Location = New-Object System.Drawing.Point(10,220)
    $textBox_Result.Size = New-Object System.Drawing.Size(300,50)
    $textBox_Result.AutoSize = $true
    $textBox_Result.ReadOnly = $true
    $form.Controls.Add($textBox_Result)#>
    $listView = New-Object System.Windows.Forms.ListView
    $listView.View = 'Details'
    $listView.Width = 300
    $listView.Height = 150
    $listView.Location = New-Object System.Drawing.Point(10,220)
    $listView.Columns.Add('ФИО') | Foreach {$_.Width = 75}
    $listView.Columns.Add('Логин') | Foreach {$_.Width = 75}
    $listView.Columns.Add('Пароль') | Foreach {$_.Width = 75}
    $listView.Columns.Add('Почта') | Foreach {$_.Width = 75}
    $listView.AutoSize = $true
    $form.Controls.Add($listView)
    #=============================================================================================================================================================================================#
    #=============================================================================================================================================================================================#
    #Контроль дополнительных опций.
    $CheckBox_mail = New-Object System.Windows.Forms.CheckBox
    $CheckBox_mail.Text = 'Создать почтовый ящик сотруднику'
    $CheckBox_mail.AutoSize = $true
    $CheckBox_mail.Checked = $true
    $CheckBox_mail.Location  = New-Object System.Drawing.Point(300,140)
    $form.Controls.Add($CheckBox_mail)
    
    $CheckBox_changepass = New-Object System.Windows.Forms.CheckBox
    $CheckBox_changepass.Text = 'Требовать смену пароля при первом входе'
    $CheckBox_changepass.AutoSize = $true
    $CheckBox_changepass.Checked = $true
    $CheckBox_changepass.Location  = New-Object System.Drawing.Point(300,160)
    $form.Controls.Add($CheckBox_changepass)
    
    #=============================================================================================================================================================================================#
    #=============================================================================================================================================================================================#
    #Блок кнопок
    
    <#Далее создайте кнопку OК для формы. Укажите размер и поведение кнопки ОК. В этом примере кнопка расположена на 120 пикселей ниже верхней границы формы и на 75 пикселей правее левой границы.
    Высота кнопки — 23 пикселя, а длина — 75 пикселей. Сценарий использует предопределенные типы Windows Forms для определения поведения кнопок.#>
    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Point(420,350)
    $OKButton.Size = New-Object System.Drawing.Size(75,23)
    $OKButton.Text = 'OK'
    $OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
    $form.AcceptButton = $OKButton
    $form.Controls.Add($OKButton)
    
    <#Аналогичным образом создайте кнопку Отмена. Кнопка Отмена расположена на 120 пикселей ниже верхней границы и на 150 пикселей правее левой границы окна.#>
    $CancelButton = New-Object System.Windows.Forms.Button
    $CancelButton.Location = New-Object System.Drawing.Point(500,350)
    $CancelButton.Size = New-Object System.Drawing.Size(75,23)
    $CancelButton.Text = 'Cancel'
    $CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
    $form.CancelButton = $CancelButton
    $form.Controls.Add($CancelButton)
    #=============================================================================================================================================================================================#
    
    #Задайте для свойства Topmost значение $true, чтобы принудительно открыть окно поверх других диалоговых окон.
    $form.Topmost = $true
    
    #Затем добавьте следующую строку кода, чтобы активировать форму и установить фокус на текстовое поле, которое вы создали.
    $form.Add_Shown({$textBox_FIO.Select()})
    
    #Добавьте следующую строку кода для отображения формы в Windows.
    $result = $form.ShowDialog()


    Вот она функция:

    Function Create-New-ADUser ($FIO, $SAN, $Position, $Department, $Manager)
    {
            if($manager -eq $null)
            {
                Write-Host "Учетная запись пользователя не обнаружена! Создаем учетную запись" -ForegroundColor Green
                Start-Sleep 2
                $OU = Get-ADOrganizationalUnit -Filter 'name -like "HQ_Users"'
                $Name = ($FIO -split ' ')[1]
                $Surname = ($FIO -split ' ')[0]
                $prefix = "@specialist.ru"
                $UPN = $SAN + $prefix
                New-ADUser -Name $FIO -SamAccountName $SAN -UserPrincipalName $UPN -GivenName $Name -Surname $Surname -DisplayName $FIO -MobilePhone $null -Department $Department -Office $null -Title $Position -AccountPassword (ConvertTo-SecureString -AsPlainText "$password" -Force) -ChangePasswordAtLogon $true  -Company 'ООО "Компания"' -Enabled $true -Path $OU ;
                Get-ADUser -Identity new_office_sim  -Properties memberof | select -ExpandProperty memberof | ADD-ADGroupMember -Members $SAN -Confirm:$False
                $LiveCred = Get-Credential -Credential "$env:USERDOMAIN\$env:USERNAME"
                $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://post.domain.ru/powershell/ -Credential $LiveCred
                Import-PSSession $Session -AllowClobber
                Enable-Mailbox "$UPN" -Database newdatabase -RetentionPolicy "Default"
            }
            else
            {
                Write-Host "Учетная запись пользователя не обнаружена! Создаем учетную запись" -ForegroundColor Green
                Start-Sleep 2
                $OU = Get-ADOrganizationalUnit -Filter 'name -like "HQ_Users"'
                $Name = ($FIO -split ' ')[1]
                $Surname = ($FIO -split ' ')[0]
                $prefix = "@specialist.ru"
                $UPN = $SAN + $prefix
                New-ADUser -Name $FIO -SamAccountName $SAN -UserPrincipalName $UPN -GivenName $Name -Surname $Surname -DisplayName $FIO -MobilePhone $null -Manager "$manager" -Department $Department -Office $null -Title $Position -AccountPassword (ConvertTo-SecureString -AsPlainText "$password" -Force) -ChangePasswordAtLogon $true  -Company 'ООО "Компания"' -Enabled $true -Path $OU ;
                Get-ADUser -Identity new_office_sim  -Properties memberof | select -ExpandProperty memberof | ADD-ADGroupMember -Members $SAN -Confirm:$False
                $LiveCred = Get-Credential -Credential "$env:USERDOMAIN\$env:USERNAME"
                $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://post.domain.ru/powershell/ -Credential $LiveCred
                Import-PSSession $Session -AllowClobber
                Enable-Mailbox "$UPN" -Database newdatabase -RetentionPolicy "Default"
            }
     }

    А вот собственно запуск действий:

    if ($result -eq [System.Windows.Forms.DialogResult]::OK)
    {
        Write-Host "Создаем учетную запись для нового пользователя!" -ForegroundColor Green
    $i = Get-Random -InputObject (1..999)
    $c = "Qwerty"
    $password = "$c" + "$i"
    #$FIO = Read-Host "Введите ФИО полностью через пробел"
    #while ($SAN = Read-Host "Введите login в формате 'iivanov'")
    While ($textBox_SAN)
    {
        if ((Get-ADUser -Filter {SamAccountName -like $textBox_SAN.Text}) -eq $null)
        {
            $textBox_Result += Write-Host "Учетная запись пользователя не обнаружена! Продолжаем выполнение скрипта!" -ForegroundColor Green
            break
        }
        Else
        {
            $textBox_Result += Write-Host "Пользователь с таким SamAccountName уже существует! Пожалуйста, введите другой SamAccountName!" -ForegroundColor Red
        }
    }
    #$Position = Read-Host "Введите должность сотрудника"
    #$Department = Read-Host "Введите отдел сотрудника"
    #$director = Read-Host "Укажите полностью ФИО руководителя сотрудника"
    if ($textBox_Director -like $null)
            {
            $manager = $null
            }
            else
            {
            $manager = (Get-ADUser -Filter {DisplayName -like $textBox_Director.Text}).SamAccountName
            }
    $prefiks = "@domain.ru"
    $UPN = $textBox_SAN.Text + $prefiks
    
    if ($manager -eq $Null)
    {
        Create-New-ADUser -FIO $textBox_FIO.Text -SAN $textBox_SAN.Text -Position $textBox_Position.Text -Department $textBox_Department.Text
           $nUser = Get-ADUser -Identity $textBox_SAN -Properties mail | fl
           foreach ($i in $nUser)
           {
           $item = New-Object System.Windows.Forms.ListViewItem($i.Name)
           $item.SubItems.Add([string]$i.SamAccountName)
           $item.SubItems.Add([string]$password)
           $item.SubItems.Add([string]$i.mail)
           $listView.Items.Add($item) | Out-Null
           }
           #Pause "Press any key to continue"
    }
    else
    {
        Create-New-ADUser -FIO $textBox_FIO -SAN $textBox_SAN -Position $textBox_Position -Department $textBox_Department -Manager $manager
           $nUser = Get-ADUser -Identity $textBox_SAN -Properties mail | fl
           foreach ($i in $nUser)
           {
           $item = New-Object System.Windows.Forms.ListViewItem($i.Name)
           $item.SubItems.Add([string]$i.SamAccountName)
           $item.SubItems.Add([string]$password)
           $item.SubItems.Add([string]$i.mail)
           $listView.Items.Add($item) | Out-Null
           }
           
    }
    Pause "Press any key to continue"
    }

    Теперь к сути:

    1. Нужно что бы при нажатии кнопки OK выполнялась функция при этом форма не закрывалась а оставалась открытой до нажатия кнопки Cancel.

    2. Результат выполнения функции выводился в поле $ListView в формате:

    2.1 Имя:

    2.2 Логин:

    2.3 Пароль:

    2.4. Почта:

    3. В форме еще нет кнопки Check, но будет в будущем, она должна проверять наличие SamAccountName в домене. Соответственно результат так же должен выводиться в $ListView.

    Как это оформить синтаксически.

    Заранее Спасибо!

    24 декабря 2019 г. 10:29

Все ответы