본문 바로가기
ICT

[PowerShell] GUI - S/W Installation with AD Group Assignment

by NeoSailer 2023. 6. 12.

[Requirements]

The Service Delivery team needs a GUI tool to assign AD groups to a user PC with few clicks

- GUI(Graphic User Interface)

- Searching PC with user and PC name

- List of SW provided to the tool user

- Create a Excel sheet to easily add SW and OU and get the SW in the SW list

 

[OS] 

Windows 10

 

[Development Language]

PowerShell

 

[IDE]

PowerShell ISE

 

[Code]

GUI - RISD_main.xaml

<Window x:Name="wpfWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Controls1="http://metro.mahapps.com/winfx/xaml/controls"
        xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:Controls0="clr-namespace:System;assembly=mscorlib"
        xmlns:s="clr-namespace:System;assembly=mscorlib"
        Width="530"
        Height="400"
        Background="White"
        IsManipulationEnabled="False"
        MaxHeight="400"
        MaxWidth="530"
        MinHeight="400"
        MinWidth="530"
        Title="Rotork IT Service Deliver Tool">
  <Grid x:Name="gr_main" RenderTransformOrigin="0.3,0.3">
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="0*" />
      <ColumnDefinition Width="1.00022008226738*" />
      <ColumnDefinition Width="0*" />
      <ColumnDefinition Width="0*" />
    </Grid.ColumnDefinitions>
    <Menu x:Name="mn_main"
          Height="30"
          Margin="4,3,1,0"
          HorizontalAlignment="Stretch"
          VerticalAlignment="Top"
          Grid.Column="0"
          Grid.ColumnSpan="4"
          Grid.Row="0">
      <MenuItem x:Name="mn_ad"
                Width="100"
                Height="32"
                Header="ActiveDirectory"
                HeaderStringFormat=""
                UsesItemContainerTemplate="False">
        <MenuItem x:Name="mn_ad_al" Header="Account Unlock" />
        <MenuItem x:Name="mn_ad_blp" Header="BitLocker Pass" />
        <MenuItem x:Name="mn_ad_lap" Header="Local Admin. Pass" />
        <MenuItem x:Name="mn_ad_fa" Header="Folder Access" />
        <MenuItem x:Name="mn_ad_pr" Header="Password Reset" />
        <MenuItem x:Name="mn_ad_si" Header="S/W Installation" />
      </MenuItem>

    </Menu>
    <Image x:Name="img_rotork"
           Width="465"
           Height="152"
           Margin="32,52,0,0"
           HorizontalAlignment="Left"
           VerticalAlignment="Top"
           Source="file:///C:/PowerShell/GUI/RISD_Tool/rotork.png"
           Grid.Column="0"
           Grid.ColumnSpan="3"
           Grid.Row="0" />
    <Image Margin="0,0,0,0"
           HorizontalAlignment="Left"
           VerticalAlignment="Top"
           Grid.Column="0"
           Grid.ColumnSpan="2"
           Grid.Row="0" />
    <Label x:Name="lbl_desc1"
           Content="Rotork Group IT Sevice Delivery Tool"
           Height="26"
           Margin="34,224,272,0"
           HorizontalAlignment="Stretch"
           VerticalAlignment="Top"
           Grid.Column="1"
           Grid.Row="0" />
    <Label x:Name="lbl_desc2"
           Content="This is designed to increase work efficiency"
           Height="26"
           Margin="34,246,129,0"
           HorizontalAlignment="Stretch"
           VerticalAlignment="Top"
           Grid.Column="1"
           Grid.Row="0" />
    <Label x:Name="lbl_desc3"
           Content="For any question, please contact to Jaehui.Yoon@rotork.com"
           Height="26"
           Margin="34,280,129,0"
           HorizontalAlignment="Stretch"
           VerticalAlignment="Top"
           Grid.Column="1"
           Grid.Row="0" />
    <Label x:Name="lbl_desc4"
           Content="v1.0 Developed by Jaehui Yoon"
           Height="26"
           Margin="34,330,129,0"
           HorizontalAlignment="Stretch"
           VerticalAlignment="Top"
           Grid.Column="1"
           Grid.Row="0" />
  </Grid>
</Window>

Executions - RISD_Tool.ps1

$xamlFile="C:\PowerShell\GUI\RISD_Tool\RISD_main.xaml"


$inputXAML = Get-Content -Path $xamlFile -Raw
$inputXAML = $inputXAML -replace 'mc:Igronorable="d"','' -replace "x:N", "N" -replace '^<Win.*','<Window'
[XML]$XAML = $inputXAML

$reader = New-Object System.Xml.XmlNodeReader $XAML
try
{
    $psForm = [Windows.MarkUp.XamlReader]::Load($reader)
}
catch
{
    Write-Host $_.Exception
    throw
}   
$XAML.SelectNodes("//*[@Name]") | % {
    try
    {
        Set-Variable -Name "var_$($_.Name)" -Value $psForm.FindName($_.Name) -ErrorAction Stop
    }
    catch
    {
        throw
    }
}
Get-Variable var_*

## Menu click

############# Software Installation #############
$var_mn_ad_si.Add_Click({
    $xamlFile_si="C:\PowerShell\GUI\RISD_Tool\RIDS_swInstallation.xaml"
    $inputXAML_si = Get-Content -Path $xamlFile_si -Raw
    $inputXAML_si = $inputXAML_si -replace 'mc:Igronorable="d"','' -replace "x:N", "N" -replace '^<Win.*','<Window'
    [XML]$XAML_si = $inputXAML_si

    $reader_si = New-Object System.Xml.XmlNodeReader $XAML_si
    try
    {
        $psForm_si = [Windows.MarkUp.XamlReader]::Load($reader_si)
    }
    catch
    {
        Write-Host $_.Exception
        throw
    }   
    $XAML_si.SelectNodes("//*[@Name]") | % {
        try
        {
            Set-Variable -Name "var_$($_.Name)" -Value $psForm_si.FindName($_.Name) -ErrorAction Stop
        }
        catch
        {
            throw
        }
    }    

    Get-Variable var_*

    ####List up S/W list combo box
    #Declare custom table
    $swList =@{}
    #Import CSV for SW list
    $swList = Import-CSV -path "\\kryanser03\Shared-Data\IT\Ref\SWList.csv" 
    $swList | % {$var_cb_swList.Items.Add($_.SW)}

    #Event handlers ----------------------------------------------------------------
    $var_bt_searchPC.Add_Click({
        if($var_tb_pcSearch.Text -eq "")
        {
            [System.Windows.MessageBox]::Show("Please input search string", "Error", "OK", "Error")
        }
        else
        {
            $var_lbx_pcList.Items.Clear()
            $pcList = Get-ADComputer -filter "Description -like '*$($var_tb_pcSearch.Text)*'" -Properties name, description, ms-mcs-admpwd
            $pcList += Get-ADComputer -filter "name -like '*$($var_tb_pcSearch.Text)*'" -Properties name, description, ms-mcs-admpwd
            
            if($pcList -eq $null)
            {
                [System.Windows.MessageBox]::Show("No computer found" , "Information", "OK", "Information")
            }
            else
            {
                $pcList | % {$var_lbx_pcList.AddText($_.name+" : "+$_.description)}
            }
            
        }
    })
    
    $var_bt_grtADgr.Add_Click({
        if($var_lbx_pcList.SelectedItem -eq $null -or $var_cb_swList.SelectedItem -eq $null)
        {
            [System.Windows.MessageBox]::Show("Please select computer and S/W", "Error", "OK", "Error")
        }
        else
        {
            $swList | % {
                if($_.SW -eq $var_cb_swList.SelectedItem)
                {
                    $pc = [String]($var_lbx_pcList.SelectedItem)            
                    $pc = $pc.Substring(0, 15)
                    $comp = Get-ADComputer $pc
                    try{
                        Add-ADGroupMember -Identity $_.OU -Members $comp
                    }
                    catch
                    {
                        [System.Windows.MessageBox]::Show("$_", "Error", "OK", "Error")   
                        return
                    }
                    [System.Windows.MessageBox]::Show("The PC has been configured successfully" , "Success", "OK", "Information")
                    $var_lbx_pcList.SelectedItem = $var_cb_swList.SelectedItem = $null
                }
            }
        }
    })    
    


    $psForm_si.ShowDialog()
    $psForm_si.Close()    
})

 

Excel file - SWList.csv

[Test]

Run the PowerShell code then click menu "ActiveDirectory" --> "S/W Installation"

Search PC name then select S/W then click "CONFIGURE"

Run a PowerShell command to confirm the desired AD group has been assigned to the PC properly

(Get-AdComputer -filter 'name -like "kryan-l-fn992h2*"' -Properties memberof).memberof
CN=MEMCM-SAP-CLIENT,OU=Application Deployment,OU=Configuration Manager,OU=Endpoint Manager,OU=Groups,OU=GB-Bath,OU=Rotork,DC=Rotork,DC=co,DC=uk
CN=USB-ApprovedDevices,OU=Security,OU=Groups,OU=Shared-Remote,OU=Rotork,DC=Rotork,DC=co,DC=uk
CN=MEMCM-APPS-IT-EARLY-ADOPTERS,OU=Maintenance Groups,OU=Configuration Manager,OU=Endpoint Manager,OU=Groups,OU=GB-Bath,OU=Rotork,DC=Rotork,DC=co,DC=uk
CN=MEMCM-PYTHON,OU=Application Deployment,OU=Configuration Manager,OU=Endpoint Manager,OU=Groups,OU=GB-Bath,OU=Rotork,DC=Rotork,DC=co,DC=uk
CN=MEMCM-APPS-IT-EA-TESTING,OU=Enable_SMB_Signing,OU=Users,OU=GB-Bath,OU=Rotork,DC=Rotork,DC=co,DC=uk
CN=MEMCM-CISCO-VPN-CLIENT,OU=Application Deployment,OU=Configuration Manager,OU=Endpoint Manager,OU=Groups,OU=GB-Bath,OU=Rotork,DC=Rotork,DC=co,DC=uk
CN=OneDriveTest,OU=O365 Synced,OU=Security,OU=Groups,OU=Shared-Remote,OU=Rotork,DC=Rotork,DC=co,DC=uk
CN=CM-CISCO-VPN-CLIENT-PILOT,OU=Maintenance Groups,OU=Configuration Manager,OU=Endpoint Manager,OU=Groups,OU=GB-Bath,OU=Rotork,DC=Rotork,DC=co,DC=uk
CN=CM-LAST-LOGGED-ON-USER-QUERY,OU=Universal,OU=ConfigMgr Security Groups,OU=Configuration Manager,OU=Endpoint Manager,OU=Groups,OU=GB-Bath,OU=Rotork,DC=Rotork,DC=co,DC=uk
CN=SCCM-POWERBI,OU=Application Deployment,OU=Configuration Manager,OU=Endpoint Manager,OU=Groups,OU=GB-Bath,OU=Rotork,DC=Rotork,DC=co,DC=uk
CN=SCCM-NUANCE-PDF-CONVERTER,OU=Application Deployment,OU=Configuration Manager,OU=Endpoint Manager,OU=Groups,OU=GB-Bath,OU=Rotork,DC=Rotork,DC=co,DC=uk


[CN=SCCM-SOLIDEDGE,OU=Application Deployment,OU=Configuration Manager,OU=Endpoint Manager,OU=Groups,OU=GB-Bath,OU=Rotork,DC=Rotork,DC=co,DC=uk]

"SCCM-SOLIDEDGE" AD group has been assigned successfully.

 

[Lesson Learned]

Put more effort on comments for me to less strive to interpret code in the future

 

반응형

댓글