Спрашивающий
PowerShell. Windows Form

Вопрос
-
Здравствуйте!
Пишу форму для заведения учетной записи нового сотрудника. Скрипт состоит из функции, которая собственно и выполняет создание учетной записи и почтового ящика для сотрудника и формы в которую задаются необходимые значения.
Вот сама форма:
#Сначала с помощью скрипта загружаются два класса .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.
Как это оформить синтаксически.
Заранее Спасибо!
- Перемещено Vasilev VasilMicrosoft contingent staff 6 января 2020 г. 6:08 Scripting
24 декабря 2019 г. 10:29
Все ответы
-
>> Как это оформить синтаксически.
вам надо скрипт дописать чтобы он работал?
кстати, в скриптинге пост бы выглядел уместнее.
24 декабря 2019 г. 14:11 -
Да, все верно, нужно синтаксис допилить, по 3 пунктам которые озвучил.24 декабря 2019 г. 14:37
-
Не уж то никто не подскажет ?25 декабря 2019 г. 7:04