[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
'ICT' 카테고리의 다른 글
[Python] Saving Outlook Email Attachment to Image File (0) | 2023.06.21 |
---|---|
[Python] Editing PDF Fillable Form (0) | 2023.06.15 |
[PowerShell] GUI(Graphic User Interface) with XAML (0) | 2023.05.18 |
[DailyLog] 2023-05-11(목) (0) | 2023.05.12 |
9. Learning Projects - Lottery number generator (0) | 2023.05.08 |
댓글