UAC and the shield icon << Back



In VDF 18.0, a new property "pbShield" was introduced to the "Button" control to allow you to add a little shield icon to your button to indicate that the action requires administrative rights (such as modifying things in HKEY_CLASSES_ROOT in the registry) to perform. Of course, if you are already running as an administrator, the shield icon shouldn't show up. If you are running pre-VDF 18.0, you can use the Windows message BCM_SETSHIELD (example below). Let's say you display the shield icon on a button, and the user clicks on it, then what? We can take a cue from Task Manager or Process Explorer. Both of them will relaunch itself to run as an Administrator (You are going to get the UAC prompt). The following example will do exactly that.

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
Use Windows
Use MapiDllCalls.pkg
Use cWorkspace.pkg
 
Define BCM_SETSHIELD For |CI$160C
 
Function ExePath Global Returns String
    String sExePath
    Integer iVoid
    ZeroString MAX_PATH to sExePath
    Move (GetModuleFileName(0, AddressOf(sExePath), MAX_PATH)) To iVoid
    Function_Return (CString(sExePath))
End_Function // ExePath
 
Function RemoveFileName Global String sFileName Returns String
    Integer iVoid
    Move sFileName to sFileName //Workaround the bug where byRef String get modified
    Move (PathRemoveFileSpec(AddressOf(sFileName))) to iVoid
    Function_Return (CString(sFileName))
End_Function // RemoveFileName
 
Procedure RelaunchAsAdministrator
    String sExe sDir
    Handle hInstance
    Move (ExePath()) to sExe
    Move (RemoveFileName(sExe)) to sDir
    Move (ShellExecute(0,"runas",sExe,"",sDir,SW_SHOW)) to hInstance
    If (hInstance<=32) Send Stop_Box "Unable to run as Administrator."
    Else Abort
End_Procedure // RelaunchAsAdministrator
 
Object oPanel is a ModalPanel
    Set Size to 100 100
    Object oButton is a Button
        Set Label to "Admin Mode"
        Set Size to 15 80
        Procedure OnClick
            If (IsAdministrator()) Send Info_Box "Do something that only Administrators can do"
            Else Send RelaunchAsAdministrator
        End_Procedure
        Procedure Page_Object Integer iPage
            Forward Send Page_Object iPage
            #IF !@>=180
            If (IsAdministrator()) Set pbShield to True
            #ELSE
            Move (SendMessage(Form_Window_Handle(Self,0), BCM_SETSHIELD, 0, Not(IsAdministrator()))) to iPage
            #ENDIF
        End_Procedure // Page_Object
    End_Object // oButton
End_Object // oPanel
Send Popup of oPanel
Free Web Hosting