none
PowerShell Несколько вопросов. RRS feed

  • Вопрос

  • День добрый. Начинаю осваивать Powershell. Сейчас допиливаю скрипт добавление пользователей в AD и создание им папки на файлопомойке + добаление ссылки в DFS на эту папку,возникло несколько вопросов:
    Как реализовать проверку прав пользователя на указанную папку?
    т.е. если у пользователя есть права на папку, то вывести в лог какие права в формате (полный доступ, чтение, изменения) если нет то доступ закрыт.
    Вопрос номер два. Есть Gui окошко Лога
    $Log = New-Object windows.Forms.RichTextBox 
        $Log.left= "1"
        $Log.top="150"
        $Log.width = "609"
        $Log.height = "200"
        $Log.ReadOnly = "true"
        $form.controls.add($Log)

    Текст в которую приходит 
    function LogAdd($msg)
        {
        $Log.text = $Log.text + $msg + [char]13
        $msg=""
         }

    Вопрос следующий, в gui окне все логи выводятся страшным серым цветом, и если логов много то выглядит не очень красиво, как изменить цвет для указанного текста? Например
    LogAdd ("[WARNING] Папка " + "$personal\$OU\$name\free" + " уже cуществует")
    Чтобы на выходе выглядело:
    [WARNING] Папка \\Mydomen.com\Бухгалтерия\Иванова Людмила Ивановна\free уже существует
       желтый                                                       синий                                 
    Поменять весь текст в логе не проблема достаточно добавить "ForeColor" в настройки GUI, 
    пробывал:
    $Log.SelectionColor = "Red"
    LogAdd ('тест цвета')

    без результатов, выводит обычным черным цветом текст
    Третий. 
    Перед созданием пользователя, необходимо проверить, а нет ли уже пользователя с таким логином(логин уже помещен в переменную $login), если такой логин существует необходим вывод всплывающего окошка с предложением ввести логин вручную (следовательно изменить переменную $login и заново произвести проверку)
    PS для работы с AD использую дополнение ActiveRoles Management от Quest Software

    • Изменено Scaramanga 27 января 2012 г. 9:38
    27 января 2012 г. 9:34

Ответы

  • 1) Используйте Get-Acl 
    
    2) Код формы приведите.
    
    3)
    Add-Type -AssemblyName Microsoft.VisualBasic
    
    while(1)
    {
        if(Get-QADUser -SamAccountName $login)
        {
            $login = [Microsoft.VisualBasic.Interaction]::InputBox(
                "Введите sAMAccountName", "Name", $null)
        }
        else
        {
            break
        }
    }
    • Помечено в качестве ответа Scaramanga 28 января 2012 г. 12:41
    27 января 2012 г. 10:06
    Отвечающий
  • Function Show-InputBox($title, $promptText)
    {
      $form = New-Object Windows.Forms.Form
      $label = New-Object Windows.Forms.Label
      $textBox = New-Object Windows.Forms.TextBox
      $buttonOk = New-Object Windows.Forms.Button
      $buttonCancel = New-Object Windows.Forms.Button
    
      $form.Text = $title
      $label.Text = $promptText
    
      $buttonOk.Enabled = $false
      $buttonOk.Text = "OK"
      $buttonCancel.Text = "Cancel"
      $buttonOk.DialogResult = [Windows.Forms.DialogResult]::OK
      $buttonCancel.DialogResult = [Windows.Forms.DialogResult]::Cancel
    
      $label.SetBounds(9, 20, 372, 13)
      $textBox.SetBounds(12, 36, 372, 20)
      $buttonOk.SetBounds(228, 72, 75, 23)
      $buttonCancel.SetBounds(309, 72, 75, 23)
    
      $label.AutoSize = $true
      $textBox.Anchor = $textBox.Anchor -bor [Windows.Forms.AnchorStyles]::Right
      $buttonOk.Anchor = [Windows.Forms.AnchorStyles]::Bottom -bor [Windows.Forms.AnchorStyles]::Right
      $buttonCancel.Anchor = [Windows.Forms.AnchorStyles]::Bottom -bor [Windows.Forms.AnchorStyles]::Right
      
      $textBox.Add_TextChanged({
    	if($this.Text){
    		$buttonOk.Enabled = $true
    	}
    	else {
    		$buttonOk.Enabled = $false
    		}
    	})
      $form.ClientSize = New-Object Drawing.Size(396, 107)
      $form.Controls.Add($label)
      $form.Controls.Add($textBox)
      $form.Controls.Add($buttonOk)
      $form.Controls.Add($buttonCancel)
      $form.ClientSize = New-Object Drawing.Size([Math]::Max(300, $label.Right + 10), $form.ClientSize.Height)
      $form.FormBorderStyle = [Windows.Forms.FormBorderStyle]::FixedDialog
      $form.StartPosition = [Windows.Forms.FormStartPosition]::CenterScreen
      $form.MinimizeBox = $false
      $form.MaximizeBox = $false
      $form.AcceptButton = $buttonOk
      $form.CancelButton = $buttonCancel
    
      $dialogResult = $form.ShowDialog()
      New-Object PsObject -Property @{
      		Value = $textBox.Text
     		DialogResult =  $dialogResult
    	}
    }
    
    
    while($true)
    {
        if(Get-QADUser -SamAccountName $login)
        {
            $return = Show-InputBox -promptText "Введите sAMAccountName" -Title "Name"
    		
    		if($return.DialogResult -eq "Cancel"){
    			return
    		}
    		
    		if($return.DialogResult -eq "OK"){
    		$login = $return.Value
    		}
        }
        else
        {
            break
        }
    }
    
    

    • Помечено в качестве ответа Scaramanga 28 января 2012 г. 12:50
    28 января 2012 г. 12:34
    Отвечающий

Все ответы

  • 1) Используйте Get-Acl 
    
    2) Код формы приведите.
    
    3)
    Add-Type -AssemblyName Microsoft.VisualBasic
    
    while(1)
    {
        if(Get-QADUser -SamAccountName $login)
        {
            $login = [Microsoft.VisualBasic.Interaction]::InputBox(
                "Введите sAMAccountName", "Name", $null)
        }
        else
        {
            break
        }
    }
    • Помечено в качестве ответа Scaramanga 28 января 2012 г. 12:41
    27 января 2012 г. 10:06
    Отвечающий
  • $form = New-Object Windows.Forms.Form
    	$form.Height  = 590
    	$form.Width = 620
    	$form.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen
    

    27 января 2012 г. 10:18
  • $form = New-Object Windows.Forms.Form
    	$form.Height  = 590
    	$form.Width = 620
    	$form.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen
    


    Полный код GUI приведите.
    27 января 2012 г. 10:21
    Отвечающий
  • $form = New-Object Windows.Forms.Form
    	$form.Height  = 590
    	$form.Width = 620
    	$form.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen
    	$form.Text = "Создание пользователя в ActiveDirectory (с)"
    	
    $labSName = New-Object windows.Forms.Label 
            $labSName.text = "Фамилия:"
    	$labSName.left = "10"
            $labSName.top = "15"
    	$labSName.Width = "60"
    
    $labName = New-Object windows.Forms.Label 
            $labName.text = "Имя:"
    	$labName.left = "10"
            $labName.top = "40"
    	$labName.Width = "60"
    
    $labInitName = New-Object windows.Forms.Label 
            $labInitName.text = "Отчество:"
    	$labInitName.left = "10"
            $labInitName.top = "65"
    	$labInitName.Width = "60"
    
    $button = New-Object Windows.Forms.Button
    	$button.text="Создать"
    	$button.Left ="510"
    	$button.Top = "115"
    	$button.add_click($Function:UserCreate)
    
    $InputSName = New-Object windows.Forms.TextBox
            $InputSName.Left ="70"
    	$InputSName.Top = "10"	
    		
    $InputName = New-Object windows.Forms.TextBox
            $InputName.Left ="70"
    	$InputName.Top = "35"	
    
    $InputInitName = New-Object windows.Forms.TextBox
            $InputInitName.Left ="70"
    	$InputInitName.Top = "60"	
    	
    	
    $group1 = New-Object windows.Forms.CheckedListBox
    	$group1.left = "180"
    	$group1.top = "10"
    	$group1.Width = "300"
    	$GroupList1 = Get-QADGroup -SearchRoot $GroupRoot | select-object name| Foreach-Object {$group1.Items.Add($_.name)}
    
    $labUnit = New-Object windows.Forms.Label 
    	$labUnit.text = "Подразделение:"
    	$labUnit.left ="10"
    	$labUnit.top = "120"
    	$labUnit.width ="90"
    
    $LabFolder = New-Object windows.Forms.Label 
    	$LabFolder.Text = "Создать папку"
    	$LabFolder.Left ="10"
    	$LabFolder.Top = "90"
    	$LabFolder.Width ="140"	
    
    $Folder = New-Object windows.Forms.CheckBox
    	$Folder.left ="155"
    	$Folder.top = "85"
    	$Folder.Width = "20"
    	$Folder.Checked = "true"
    
    $unit = New-Object windows.Forms.ComboBox
    	$unit.Left = "100"
            $unit.Top = "115"
            $unit.Width = "380"
    	$UnitList = get-QADObject -SearchRoot $OuRoot -Type 'organizationalUnit' -LdapFilter $OuFilter| Select-Object name|Foreach-Object {$Unit.Items.Add($_.name)}
    				
    $LabPassword = New-Object windows.Forms.Label 
    	$labPassword.text = "Пароль:"
    	$labPassword.Height = "14"
    	$labPassword.left ="500"
    	$labPassword.top = "10"
    	$labPassword.width ="50"
    
    $password1 = New-Object windows.Forms.MaskedTextBox
    	$password1.Left = "500"
    	$password1.top = "25"
    	$password1.PasswordChar = "*"
    		
    $password2 = New-Object windows.Forms.MaskedTextBox
    	$password2.Left = "500"
    	$password2.top = "50"
    	$password2.PasswordChar = "*"
    
    $WS = New-Object windows.Forms.TextBox
    	$WS.Text = " "
    	$WS.left ="500"
    	$WS.top = "90"
    	$WS.width ="100"
    
    $Log = New-Object windows.Forms.RichTextBox 
    	$Log.left= "1"
    	$Log.top="150"
    	$Log.width = "609"
    	$Log.height = "400"
    	$Log.ReadOnly = "true"
    	$Log.DetectUrls = $false
    
    
    	
    $form.controls.add($labName)
    $form.controls.add($labInitName)
    $form.controls.add($labSName)
    $form.controls.add($inputSName)
    $form.controls.add($inputName)
    $form.controls.add($inputInitName)
    $form.controls.add($LabFolder)
    $form.controls.add($Folder)
    $form.controls.add($labunit)
    $form.controls.add($unit)
    
    $form.controls.add($group1)
    
    $form.controls.add($LabPassword)
    $form.controls.add($password1)
    $form.controls.add($password2)
    
    
    
    $form.controls.add($button)
    
    $form.controls.add($Log)
    
    $form.Add_Shown({$form.Activate()})
    $form.ShowDialog()
    

    27 января 2012 г. 10:39
  • Function Set-AppendText($box, $color, $text)
    {
        $start = $box.TextLength
        $box.AppendText($text)
        $end = $box.TextLength
                
        $box.Select($start, $end - $start)
        $box.SelectionColor = [Drawing.color]::"$color"
        $box.SelectionLength = 0
    }
    
    Set-AppendText $log "Yellow" "[Warning] "
    Set-AppendText $log "Blue" "Папка $personal\$OU\$name\free  уже cуществует"
    
    
    
    

    27 января 2012 г. 11:01
    Отвечающий
  • Спасибо работает. Но вот проблема. Как только начинается новый цикл, все сообщения в логе снова становятся черными, как сделать чтобы начало нового цикла не меняло цвета лога?
    27 января 2012 г. 12:57
  • Спасибо работает. Но вот проблема. Как только начинается новый цикл, все сообщения в логе снова становятся черными, как сделать чтобы начало нового цикла не меняло цвета лога?

    Пример цикла и где именно проблема,сюда приведите.
    27 января 2012 г. 13:13
    Отвечающий
  •  

    {.....Много кода.......
    
    Set-AppendText $log "Yellow" "[test] "
    
    sleep 7
    
    if (Test-Path c:\test\) 
    {
    LogAdd ("[OK] Папка существует")
    }
    
    else 
    {
    LogAdd ([ERROR])
    }
    .........Много кода.............
    }
    
    К примеру так. (паузу специально для наглядности поставил), до паузы Test обрабатывается нормально и в логе желтый, после он становится опять черным вместе с логом выполнения ниже приведенного  условия. 

     

     

     



    • Изменено Scaramanga 27 января 2012 г. 13:33
    27 января 2012 г. 13:31
  • Пишите весь лог с помощью Set-AppendText,а не через LogAdd.

    27 января 2012 г. 13:45
    Отвечающий
  • Да все отлично работает спасибо.

    Еще один момент по третьему вопросу. Как запретить нажатие ОК при пустом поле ввода?

    И чтобы при нажатии на отмена или крестик скрипт останавливался, но не закрывалось GUI окошко. 


    • Изменено Scaramanga 27 января 2012 г. 18:45
    27 января 2012 г. 18:35
  • Function Show-InputBox($title, $promptText)
    {
      $form = New-Object Windows.Forms.Form
      $label = New-Object Windows.Forms.Label
      $textBox = New-Object Windows.Forms.TextBox
      $buttonOk = New-Object Windows.Forms.Button
      $buttonCancel = New-Object Windows.Forms.Button
    
      $form.Text = $title
      $label.Text = $promptText
    
      $buttonOk.Enabled = $false
      $buttonOk.Text = "OK"
      $buttonCancel.Text = "Cancel"
      $buttonOk.DialogResult = [Windows.Forms.DialogResult]::OK
      $buttonCancel.DialogResult = [Windows.Forms.DialogResult]::Cancel
    
      $label.SetBounds(9, 20, 372, 13)
      $textBox.SetBounds(12, 36, 372, 20)
      $buttonOk.SetBounds(228, 72, 75, 23)
      $buttonCancel.SetBounds(309, 72, 75, 23)
    
      $label.AutoSize = $true
      $textBox.Anchor = $textBox.Anchor -bor [Windows.Forms.AnchorStyles]::Right
      $buttonOk.Anchor = [Windows.Forms.AnchorStyles]::Bottom -bor [Windows.Forms.AnchorStyles]::Right
      $buttonCancel.Anchor = [Windows.Forms.AnchorStyles]::Bottom -bor [Windows.Forms.AnchorStyles]::Right
      
      $textBox.Add_TextChanged({
    	if($this.Text){
    		$buttonOk.Enabled = $true
    	}
    	else {
    		$buttonOk.Enabled = $false
    		}
    	})
      $form.ClientSize = New-Object Drawing.Size(396, 107)
      $form.Controls.Add($label)
      $form.Controls.Add($textBox)
      $form.Controls.Add($buttonOk)
      $form.Controls.Add($buttonCancel)
      $form.ClientSize = New-Object Drawing.Size([Math]::Max(300, $label.Right + 10), $form.ClientSize.Height)
      $form.FormBorderStyle = [Windows.Forms.FormBorderStyle]::FixedDialog
      $form.StartPosition = [Windows.Forms.FormStartPosition]::CenterScreen
      $form.MinimizeBox = $false
      $form.MaximizeBox = $false
      $form.AcceptButton = $buttonOk
      $form.CancelButton = $buttonCancel
    
      $dialogResult = $form.ShowDialog()
      New-Object PsObject -Property @{
      		Value = $textBox.Text
     		DialogResult =  $dialogResult
    	}
    }
    
    
    while($true)
    {
        if(Get-QADUser -SamAccountName $login)
        {
            $return = Show-InputBox -promptText "Введите sAMAccountName" -Title "Name"
    		
    		if($return.DialogResult -eq "Cancel"){
    			return
    		}
    		
    		if($return.DialogResult -eq "OK"){
    		$login = $return.Value
    		}
        }
        else
        {
            break
        }
    }
    
    

    • Помечено в качестве ответа Scaramanga 28 января 2012 г. 12:50
    28 января 2012 г. 12:34
    Отвечающий