Menu

Virtual Geek

Tales from real IT system administrators world and non-production environment

Powershell PoshGUI: Convert user to SID and vice versa

Here I have wrote this small utility for one of my application developer friend, He required a small GUI utility to convert and show user account to SID and SID to account, viceversa, Although I can write WPF xaml gui form as well, but Here I am using simple winform and this is designed using online designer tool http://poshgui.com. (Recently Poshgui has changed its look and added more controls, made it more user friendly, the best thing is it is free)

Once this utility is launched, you have to type valid account or SID in text box. Once appropriate button is pressed it converts either from SID or account respectively to account or SID, When I say Account means it can be either UserName or GroupName including both domain and localhost. If invalid SID or Account is typed it shows users a friendly error message for either SID or Account is invalid.

Sid and user converter and vice versa, poshgui.com, powershell gui, winforms, powershell graphical user interface, powershell user to sid, security.png

In the script I have added addition control tooltip which I found on https://www.petri.com/add-popup-tips-powershell-winforms-script. I have tried to explain tooltip here. I have added new object forms control ToolTip in the script. In the the tooltip  also shows nice use of $this automatic variable, In a script block $this defines a script property or script method, the $This variable refers to the object that is being extended.. Whenever mouse is hovered over a control (button or textbox), It captures the control name and use switch condition to show the appropriate message.

To capture the control name there must be a name property added shown in the controls and an event method add_MouseHover. 

$Tooltip = New-Object System.Windows.Forms.ToolTip 
$ShowHelp = { 
    Switch ($this.name) { 
        'InputBox'      {$Tip = "If local checked don't provide domainname"; Break} 
    } 
    $Tooltip.SetToolTip($this,$Tip) 
} 

$InputBox.Name = 'InputBox' 
$InputBox.add_MouseHover($ShowHelp)

Powershell gui winforms tooltip example

Another thing I added in the script when form is launched, it shows grayed out text info on the input textbox and once anything is typed, it will change the color of text to black, this requires another event method add_TextChanged.

$InputBoxWaterMark                  = 'Type valid User, Group with Domain or SID' 
$InputBox.ForeColor                 = 'LightGray' 
$InputBox.Text                      = $InputBoxWaterMark 
$InputBox.add_TextChanged({$InputBox.ForeColor = 'Black'}) 

Download This script is available here, This script also available on Github

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<# This form was created using POSHGUI.com  a free online gui designer for PowerShell 
   WrittenBy:  http://vcloud-lab.com
.NAME 
    SID to Account
    Account to SID

#> 

#Add-Type -AssemblyName System.Windows.Forms
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")  
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  
[System.Windows.Forms.Application]::EnableVisualStyles() 

function Get-SID { 
    try { 
            $LocalAccount = New-Object System.Security.Principal.NTAccount(($InputBox.Text).trim()) -ErrorAction Stop 
            $LocalSID = $LocalAccount.Translate([System.Security.Principal.SecurityIdentifier]) 
            $OutputResult.Text = $LocalSID.Value 
        } 
        catch { 
            [System.Windows.Forms.MessageBox]::Show("Typed Domain\AccountName not valid", "Invalid details") 
            $OutputResult.Text = '' 
        } 
} 

function Get-Account { 
    try { 
        $SID = New-Object System.Security.Principal.SecurityIdentifier(($InputBox.Text).trim()) -ErrorAction Stop 
        $DomainAccount = $SID.Translate([System.Security.Principal.NTAccount]) 
        $OutputResult.Text = $DomainAccount.Value 
    } 
    catch { 
        [System.Windows.Forms.MessageBox]::Show("Typed SID is not valid", "Invalid details") 
        $OutputResult.Text = '' 
    } 
} 

#region begin GUI{ 
$Tooltip = New-Object System.Windows.Forms.ToolTip 
$ShowHelp = { 
    Switch ($this.name) { 
        'InputBox'      {$Tip = "If local checked don't provide domainname"; Break} 
        'SidToUser'     {$Tip = 'Type Valid Domain\UserName'; Break} 
        'UserToSid'     {$Tip = 'Type Valid User SID'; Break} 
        #'LocalCheckBox' {$Tip = "If local checked don't provide domainname"; Break} 
    } 
    $Tooltip.SetToolTip($this,$Tip) 
} 

$vcloudlabform                      = New-Object system.Windows.Forms.Form 
$vcloudlabform.ClientSize           = '396,172' 
$vcloudlabform.text                 = "SID to Account and Vice Versa" 
$vcloudlabform.TopMost              = $false 

$InputBox                           = New-Object system.Windows.Forms.TextBox 
$InputBox.Name                      = 'InputBox' 
$InputBox.multiline                 = $false 
$InputBox.width                     = 366 
$InputBox.height                    = 20 
$InputBox.location                  = New-Object System.Drawing.Point(8,19) 
$InputBox.Font                      = 'Microsoft Sans Serif,10' 
$InputBoxWaterMark                  = 'Type valid User, Group with Domain or SID' 
$InputBox.ForeColor                 = 'LightGray' 
$InputBox.Text                      = $InputBoxWaterMark 
$InputBox.add_MouseHover($ShowHelp) 
$InputBox.add_TextChanged({$InputBox.ForeColor = 'Black'}) 

$SidToAccount                       = New-Object system.Windows.Forms.Button 
$SidToAccount.Name                  = 'SidToUser' 
$SidToAccount.text                  = 'SID-To-Account' 
$SidToAccount.width                 = 115 
$SidToAccount.height                = 30 
$SidToAccount.location              = New-Object System.Drawing.Point(10,98) 
$SidToAccount.Font                  = 'Microsoft Sans Serif,10' 
$SidToAccount.add_MouseHover($ShowHelp) 
$SidToAccount.add_Click({Show-SIDToAccount}) 

$AccountToSid                       = New-Object system.Windows.Forms.Button 
$AccountToSid.Name                  = 'UserToSid' 
$AccountToSid.text                  = 'Account-To-SID' 
$AccountToSid.width                 = 115 
$AccountToSid.height                = 30 
$AccountToSid.location              = New-Object System.Drawing.Point(127,98) 
$AccountToSid.Font                  = 'Microsoft Sans Serif,10' 
$AccountToSid.add_MouseHover($ShowHelp) 
$AccountToSid.add_Click({Show-AccountToSID}) 

$OutputResult                       = New-Object system.Windows.Forms.TextBox 
$OutputResult.Name                  = 'OutputResult' 
$OutputResult.multiline             = $false 
$OutputResult.width                 = 366 
$OutputResult.height                = 20 
$OutputResult.location              = New-Object System.Drawing.Point(8,53) 
$OutputResult.Font                  = 'Microsoft Sans Serif,10' 
$OutputResult.ReadOnly              = $true 

$Site                               = New-Object system.Windows.Forms.LinkLabel 
$Site.Name                          = 'Site' 
$Site.text                          = "http://vcloud-lab.com" 
$Site.LinkColor                     = "#0074A2" 
$Site.ActiveLinkColor               = "#114C7F" 
$Site.AutoSize                      = $true 
$Site.width                         = 25 
$Site.height                        = 10 
$Site.location                      = New-Object System.Drawing.Point(260,154) 
$Site.Font                          = 'Microsoft Sans Serif,10' 
$Site.add_Click({[system.Diagnostics.Process]::start('http://vcloud-lab.com')}) 

$vcloudlabform.controls.AddRange(@($InputBox,$OutputResult,$SidToAccount,$AccountToSid,$Site)) 

#region gui events { 
function Show-AccountToSID { 
    if (($InputBox.Text -eq $InputBoxWaterMark) -or ($InputBox.Text -eq '')) { 
        [System.Windows.Forms.MessageBox]::Show("Please type valid Domain\Account", "Textbox empty") 
    } 
    else { 
        Get-SID 
    } 
} 

function Show-SIDToAccount { 
    if (($InputBox.Text -eq $InputBoxWaterMark) -or ($InputBox.Text -eq '')) { 
        [System.Windows.Forms.MessageBox]::Show("Please type valid SID", "Textbox empty") 
    } 
    else { 
        Get-Account 
    } 
} 
#endregion events } 
#endregion GUI } 
 
[void]$vcloudlabform.ShowDialog()

Other Powershell GUI blogs
COOL POWERSHELL FREE ONLINE GUI GENERATOR TOOL, POSHGUI
Generate random password GUI using powershell

Part 1: Create WPF XAML powershell GUI form with Visual studio
Part 2: Powershell and WPF: Build GUI applications tutorial

Go Back

This is awesome.

I already use this basic function: https://pastebin.com/68GbRuRz , but I really like how you did it. Thank you for sharing.

Reply


Comment

Blog Search

Page Views

1636379

Follow me on Blogarama