first of all I want to thank to supercoe for the BEST and FREE open source instant support program.
I work in IT support company engaged in open source solutions and really needed alternative to instant support to connect to clients if they are not in their offices. TeamViewer is good, no problematic program but price is not acceptable for my and it's not open source.
I started testing ChunckVNC a few months ago (UltraVNC we are using a few years in local networks). But I stuck on some problems:
1. using ChunkVNC on computer with UltraVNC installed as service (setup for local network only, without encryption, with MSLogon etc.)
2. UAC - on Windows VIsta and 7
3. users, that run exe file, don't have administrator rights, so can't install ChunkVNC as service to disable UAC
4. some client don't understand English
So I needed to rewrite source code and I repaired all these problems (with support from people on the forum).
1. run InstalSupportVNC.exe with added parameters: -sc_prompt, -multi
2. online disable UAC from trayicon, change registers and run program as Local System Account
3. if user don't have admin rights that ChunkVNC ask you for admin credentials before close VNC connection and use it for rerun as admin
4. check OS language and choose right language strings (I made only English and Slovak support, but it's not limited)
5. some new bugfixes and notifications windows
What do you need to change?
Change SRC/InstantSupport.au3 to my (below) and download psexec.exe from PsTools to SRC/InstantSupport_Files/ from this link
Code: Select all
http://technet.microsoft.com/en-us/sysinternals/bb897553I hope that this help to somebody. If you have any questions I will try to answer it (but as you see, my English is not really good
okinobk
http://www.allit.sk
http://www.allit.sk/en
There is my new source code of InstantSupport.au3. I'm sorry but it is translated for company and our clients, so you need to translate to basic ChunkVNC by yourself.
Code: Select all
#AutoIt3Wrapper_Run_Obfuscator=Y
#Obfuscator_Parameters=/StripOnly
; Disable the scripts ability to pause.
Break(0)
#include "Aut2Exe\Include\GUIConstantsEx.au3"
#include "Aut2Exe\Include\StaticConstants.au3"
#include "Aut2Exe\Include\WindowsConstants.au3"
#include "Aut2Exe\Include\ServiceControl.au3"
; Exit if the script hasn't been compiled
If Not @Compiled Then
	MsgBox(0, "ERROR", 'Script must be compiled before running!', 5)
	Exit
EndIf
; Language strings. Check OS language and set strings.
; If OS language is Slovak set these strings.
If @OSLang = "041b" Then
	$str_Program_Title = 						"Allit Vzdialená Podpora"
	$str_Button_InstallService = 				"Inštalovať ako službu"
	$str_Button_DisableUAC =					"Vypnúť UAC"
	$str_Button_Exit =						"Exit"
	$str_MsgBox_Information = 				"Info"
	$str_MsgBox_ExitInstantSupport = 			"Vypnúť Allit Vzdialenú Podporu?"
	$str_MsgBox_ServiceInstallation = 			"Inštalácia služby"
	$str_MsgBox_Error =						"Chyba"
	$str_MsgBox_RemoveService =				"Odstrániť službu a odinštalovať?"
	$str_ServiceEnterAnIDNumber = 			"Zadajte ID číslo:"
	$str_ServiceInvalidID = 					"Zadané nevyhovujúce ID, zrušená inštalácia služby."
	$str_ServiceProxy =						"Inštalácia služby nie je podporovaná pri využívaní HTTP Proxy."
	$str_ErrorInstallService =					"Inštalácia služby vyžaduje administrátorské práva."
	$str_ErrorStopService =					"Zastavnie služby vyžaduje administrátorské práva."
	$str_ErrorDisableUAC =					"Vypnutie UAC vyžaduje administrátorské práva."
	$str_ErrorUnknownCommand =				"Neznámy príkaz."
	$str_ErrorRepeaterConnectionFailed = 		"Nepodarilo sa nadviazať spojenie so serverom."
	$str_EndSupportSession =					"Skutočne ukončiť vzdialenú podporu?"
	$str_CloseOtherVNCServers =				"Iná Allit Vzdialená Podpora už beží. Skúsiť zastaviť bežiacu Vzdialenú Podporu?"
	$str_ServiceEnterDomain =					"Zadajte názov domény alebo názov počítača, v prípade lokálne účtu."
	$str_ServiceEnterAdminName =				"Zadajte meno administrátora."
	$str_ServiceEnterAdminPass =				"zadajte heslo administrátora."
	$str_ServiceInstallQuestion =				"Inštalovať Allit Vzdialenú Podporu ako službu?"
	$str_ServiceUninstallShortcut =				"Odinštalovať Allit Podporu"
Else
	$str_Program_Title = 						"Allit Instant Support"
	$str_Button_InstallService = 				"Install Service"
	$str_Button_DisableUAC =					"Disable UAC"
	$str_Button_Exit =						"Exit"
	$str_MsgBox_Information = 				"Information"
	$str_MsgBox_ExitInstantSupport = 			"Exit Allit Instant Support?"
	$str_MsgBox_ServiceInstallation = 			"Service Installation"
	$str_MsgBox_Error =						"Error"
	$str_MsgBox_RemoveService =				"Remove Service and Uninstall?"
	$str_ServiceEnterAnIDNumber = 			"Enter an ID number:"
	$str_ServiceInvalidID = 					"Invalid ID entered, service installation canceled."
	$str_ServiceProxy =						"Service installation not supported when using HTTP Proxy."
	$str_ErrorInstallService =					"Installing service requires administrator privileges."
	$str_ErrorStopService =					"Stopping VNC services requires administrator privileges."
	$str_ErrorDisableUAC =					"Disabling UAC requires administrator privileges."
	$str_ErrorUnknownCommand =				"Unknown command."
	$str_ErrorRepeaterConnectionFailed = 		"Connection to the repeater was not possible."
	$str_EndSupportSession =					"Are you sure you want to end this support session?"
	$str_CloseOtherVNCServers =				"Another Allit Instant Support is running which must be stopped. Try to stop other Allit Instant Support?"
	$str_ServiceEnterDomain =					"Enter Domain Name or Hostname if Local Account."
	$str_ServiceEnterAdminName =				"Enter Administrator Username."
	$str_ServiceEnterAdminPass =				"Enter Administrator Password."
	$str_ServiceInstallQuestion =				"Install Allit Instant Support as service?"
	$str_ServiceUninstallShortcut =				"Uninstall Allit Support"
EndIf
; Global Vars.
Global $ExtractFiles = True
Global $GenerateID = True
Global $LanMode = False
Global $IDNumber = 123456
Global $WorkingPath = @AppDataDir & "\InstantSupport_Temp_Files"
Global $ProxyEnabled = RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable")
Global $ServiceName = "InstantSupport"
Global $ServiceDisplayName = "Allit Instant Support"
Global $ServiceDescription = "Provides secure remote desktop sharing"
Global $UACDisabled = False
; Create unique working path if our default directory already exists. (Possible InstantSupport is already running)
If FileExists( @AppDataDir & "\InstantSupport_Temp_Files" ) Then
	$WorkingPath = @AppDataDir & "\InstantSupport_Temp_Files_" & Random( 100000, 999999,1 )
EndIf
; Command line args.
If $cmdline[0] > 0 Then
	Switch $cmdline[1]
		Case "-installservice"
			If IsAdmin() Then
				InstallService()
				Exit
			Else
				MsgBox( 48, $str_MsgBox_Error, $str_ErrorInstallService, 30 )
				Exit
			EndIf
		Case "-removeservice"
			If IsAdmin() Then
				RemoveService()
				Exit
			Else
				; Elevate to admin to remove.
				ShellExecuteWait( @ScriptFullPath, "-removeservice", @ScriptDir, "runas")
				Exit
			EndIf
		Case "-stopservices"
			If IsAdmin() Then
				StopServices()
				Exit
			Else
				MsgBox( 48, $str_MsgBox_Error, $str_ErrorStopService, 30 )
				Exit
			EndIf
			
		Case "-disableuac"
			If IsAdmin() Then
				DisableUAC()
			Else
				
				MsgBox( 48, $str_MsgBox_Error, $str_ErrorDisableUAC, 30 )
				Exit
			EndIf
		Case Else
			MsgBox( 48 , $str_MsgBox_Error, $str_ErrorUnknownCommand, 30 )
			Exit
	EndSwitch
EndIf
; Extract files.
If $ExtractFiles Then
	DirCreate( $WorkingPath )
	FileInstall( "InstantSupport_Files\instantsupport.ini", $WorkingPath & "\instantsupport.ini", 1 )
	FileInstall( "InstantSupport_Files\logo.jpg", $WorkingPath & "\logo.jpg", 1 )
	FileInstall( "InstantSupport_Files\SecureVNCPlugin.dsm", $WorkingPath & "\SecureVNCPlugin.dsm", 1 )
	FileInstall( "InstantSupport_Files\ultravnc.ini", $WorkingPath & "\ultravnc.ini", 1 )
	FileInstall( "InstantSupport_Files\winvnc.exe", $WorkingPath & "\InstantSupportVNC.exe", 1 )
	FileInstall( "InstantSupport_Files\unblock.js", $WorkingPath & "\unblock.js", 1 )
	FileInstall( "InstantSupport_Files\psexec.exe", $WorkingPath & "\psexec.exe", 1 )
	; Unblock InstantSupport.exe to prevent "Windows Security" messages.
	ShellExecuteWait($WorkingPath & "\unblock.js", "", @ScriptDir, "")
	FileCopy( @ScriptDir & "\" & @ScriptName, $WorkingPath & "\InstantSupport.exe", 9 )
EndIf
; Test server port is avaiable.
$RepeaterServerPort = IniRead( $WorkingPath & "\instantsupport.ini", "Repeater", "ServerPort", "" )
TCPStartUp()
$TCPtest = TCPConnect( "127.0.0.1", $RepeaterServerPort )
TCPShutdown()
; Close known VNC servers.
If ProcessExists( "InstantSupportVNC.exe" ) Or $TCPtest <> -1 Then
	If MsgBox( 4, $str_Program_Title, $str_CloseOtherVNCServers ) = 6 Then
		
		If _ServiceRunning("", $ServiceName) Then
			If IsAdmin() Then
				ShellExecuteWait($WorkingPath & "\InstantSupport.exe", "-removeservice", @ScriptDir, "")
			Else
				ShellExecuteWait($WorkingPath & "\InstantSupport.exe", "-removeservice", @ScriptDir, "runas")
			EndIf
			Sleep(10000)
		EndIf
		; Kill user mode VNC servers.
		;Run( $WorkingPath & "\InstantSupportVNC.exe -kill" )
		;Sleep(10000)
		ProcessClose( "InstantSupportVNC.exe" )
		; Wait for the winvnc server to close.
		ProcessWaitClose( "InstantSupportVNC.exe", 15 )
			
		; Kill InstantSupport if running.
		If WinExists( $str_Program_Title ) Then
				WinClose( $str_Program_Title )
				Sleep( 500 )
				Send( "{ENTER}" ) ; Let the other InstantSupport process close normally so it can cleanup.
				Sleep( 500 )
		EndIf
	Else
		_DeleteSelf( $WorkingPath, 5)
		Exit
	EndIf
EndIf
; Read server settings from instantsupport.ini.
$RepeaterAddress = IniRead( $WorkingPath & "\instantsupport.ini", "Repeater", "Address", "" )
$RepeaterAddressLAN = IniRead( $WorkingPath & "\instantsupport.ini", "Repeater", "AddressLAN", "" )
$RepeaterServerPort = IniRead( $WorkingPath & "\instantsupport.ini", "Repeater", "ServerPort", "" )
; Generate a random ID Number between 200,000 and 999,999 or read the installed ID number.
If $GenerateID Then
	$LowerLimit = 200000
	$UpperLimit = 999999
	$IDNumber = Random( $LowerLimit,$UpperLimit,1 )
Else
	$IDNumber = IniRead( $WorkingPath & "\instantsupport.ini", "InstantSupport", "ID", "" )
EndIf
; Create the GUI.
$InstantSupport = GUICreate( $str_Program_Title, 450, 200, -1, -1, BitOR( $WS_SYSMENU,$WS_CAPTION,$WS_POPUP,$WS_POPUPWINDOW,$WS_BORDER,$WS_CLIPSIBLINGS,$WS_MINIMIZEBOX ) )
GUISetBkColor( 0xFFFFFF )
$Label2 = GUICtrlCreateLabel( $IDNumber, 0, 100, 450, 100, $SS_CENTER )
GUICtrlSetFont( -1, 50, 800, 0, "Arial Black" )
$Pic1 = GUICtrlCreatePic( $WorkingPath & "\logo.jpg", 0, 0, 450, 90, BitOR( $SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS ) )
GUISetState( @SW_SHOW )
WinSetOnTop( $str_Program_Title, "",1)
; Check to see if the repeater exists unless there is a proxy.
If $ProxyEnabled = False Then
	TCPStartUp()
	; Test WAN address first.
	$socket = TCPConnect( TCPNameToIP( $RepeaterAddress ), $RepeaterServerPort )
	If $socket = -1 Then $LanMode = True
	; Test LAN Address because WAN failed.
	If $LanMode = True Then
		$socket = TCPConnect( TCPNameToIP( $RepeaterAddressLAN ), $RepeaterServerPort )
		If $socket = -1 Then
			; No connections possible, exit.
			WinSetOnTop( $str_Program_Title, "",0 )
			MsgBox( 48, $str_MsgBox_Error, $str_ErrorRepeaterConnectionFailed, 10 )
			InstantSupportExit( True )
		EndIf
	EndIf
	TCPShutdown()
EndIf
; Start the VNC server and make a reverse connection to the repeater.
If $LanMode = True Then
	ShellExecute( $WorkingPath & "\InstantSupportVNC.exe", "-sc_prompt -httpproxy -autoreconnect ID:" & $IDNumber & " -connect " & $RepeaterAddressLAN & ":" & $RepeaterServerPort & " -multi -run" )
Else
	ShellExecute( $WorkingPath & "\InstantSupportVNC.exe", "-sc_prompt -httpproxy -autoreconnect ID:" & $IDNumber & " -connect " & $RepeaterAddress & ":" & $RepeaterServerPort & " -multi -run" )
EndIf
; Create the tray icon. Default tray menu items (Script Paused/Exit) will not be shown.
Opt( "TrayMenuMode", 1 )
$InstallItem = TrayCreateItem( $str_Button_InstallService )
$DisableUACItem = TrayCreateItem( $str_Button_DisableUAC )
$ExitItem = TrayCreateItem( $str_Button_Exit )
If ProcessExists( "WinVNC.exe" ) Then
	TrayItemSetState ( $InstallItem, 128 )
EndIf
If $UACDisabled = True Then
	TrayItemSetState ( $DisableUACItem, 129 )
EndIf
; Enable the scripts ability to pause. (otherwise tray menu is disabled)
Break(1)
; Main loop.
While 1
	; Close any windows firewall messages that popup. The windows firewall doesn't block outgoing connections anyways. ----Does the OS language change this?----
	If WinExists( "Windows Security Alert" ) Then WinClose( "Windows Security Alert" )
 
	; If UltraVNC can't connect to the repeater then exit.
	If WinExists( "Initiate Connection" ) Then
		; Stop the VNC server
		ProcessClose( "InstantSupportVNC.exe" )
		ProcessWaitClose( "InstantSupportVNC.exe" )
		WinSetOnTop( $str_Program_Title, "",0 )
		MsgBox( 48, $str_MsgBox_Error, $str_ErrorRepeaterConnectionFailed )
		InstantSupportExit( True )
	EndIf
	; Check for form events.
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			WinSetOnTop( $str_Program_Title, "",0 )
			If MsgBox( 4, $str_Program_Title, $str_EndSupportSession ) = 6 Then
				InstantSupportExit( True )
			EndIf
	EndSwitch
	; Tray events.
	$nMsg = TrayGetMsg()
	Switch $nMsg		
	
		Case $InstallItem
		
			; Service installation unavailable if using an HTTP Proxy (UltraVNC limitation).
			If $ProxyEnabled = True Then
				WinSetOnTop( $str_Program_Title, "",0 )
				MsgBox( 48, $str_MsgBox_Error, $str_ServiceProxy, 10 )
				ContinueLoop
			Else
			
				; Check Admin Rights.
				$isadmin = IsAdmin()
				If $isadmin <> 1 Then
				
					; Choose ID for service installation.
					WinSetOnTop( $str_Program_Title, "",0 )
					;$IDNumber = InputBox( $str_MsgBox_ServiceInstallation, $str_ServiceEnterAnIDNumber, $IDNumber ) +0
					
					; Set Administration Credentials and Domain.
					$domain = InputBox( $str_MsgBox_ServiceInstallation, $str_ServiceEnterDomain, @ComputerName )
					If @error <> 0 Then ContinueLoop
					$username = InputBox( $str_MsgBox_ServiceInstallation, $str_ServiceEnterAdminName, "administrator" )
					If @error <> 0 Then ContinueLoop
					$password = InputBox( $str_MsgBox_ServiceInstallation, $str_ServiceEnterAdminPass, "", "*" )
					If @error <> 0 Then ContinueLoop
				
					; Check Admin Credentials.
					RunAsWait( $username, $domain, $password, 0, @SystemDir & "\rundll32.exe", @SystemDir, @SW_HIDE )
					If @error = 1 Then
						MsgBox( 48, $str_MsgBox_Error, $str_ErrorInstallService, 30 )
						ContinueLoop
					EndIf
					
				EndIf
				
				; Last question after install service.
				If MsgBox( 1+32+256, $str_MsgBox_ServiceInstallation, $str_ServiceInstallQuestion, 30 ) <> 1 Then ContinueLoop
				If IsNumber($IDNumber) and $IDNumber > 200000 and $IDNumber < 999999 Then
					; Configure ultravnc.ini.
					If $LanMode = True Then
						IniWrite( $WorkingPath & "\ultravnc.ini", "admin", "service_commandline", '-autoreconnect ID:' & $IDNumber & ' -connect ' & $RepeaterAddressLAN & ":" & $RepeaterServerPort & ' -multi' )
					Else
						IniWrite( $WorkingPath & "\ultravnc.ini", "admin", "service_commandline", '-autoreconnect ID:' & $IDNumber & ' -connect ' & $RepeaterAddress & ":" & $RepeaterServerPort & ' -multi' )
					EndIf
					; Configure instantsupport.ini.
					IniWrite( $WorkingPath & "\instantsupport.ini", "InstantSupport", "ID", $IDNumber )
					; Kill the VNC server.
					;$PID = Run( $WorkingPath & "\InstantSupportVNC.exe -kill" )
					; Wait for the winvnc server to close.
					;ProcessWaitClose( $PID, 15 )
					
					; Kill the VNC server.
					ProcessClose( "InstantSupportVNC.exe" )
					; Wait for the winvnc server to close.
					ProcessWaitClose( "InstantSupportVNC.exe", 15 )
					; Run installer after the server exits.
					ProcessWaitClose( "InstantSupportVNC.exe" )
					
					If IsAdmin() Then
						ShellExecute($WorkingPath & "\InstantSupport.exe", "-installservice", @ScriptDir, "")
					Else
						RunAs( $username, $domain, $password, 0, $WorkingPath & "\InstantSupport.exe -installservice", "", @SW_HIDE )
					EndIf
					InstantSupportExit( True )
				Else
					WinSetOnTop( $str_Program_Title, "",0 )
					MsgBox( 0, $str_MsgBox_Information, $str_ServiceInvalidID )
					ContinueLoop
				EndIf
			EndIf
			
			
		Case $DisableUACItem
		
			; Check Admin Rights.
			$isadmin = IsAdmin()
			If $isadmin <> 1 Then
				
				WinSetOnTop( $str_Program_Title, "",0 )
				; Set Administration Credentials and Domain.
				$domain = InputBox( $str_MsgBox_ServiceInstallation, $str_ServiceEnterDomain, @ComputerName )
				If @error <> 0 Then ContinueLoop
				$username = InputBox( $str_MsgBox_ServiceInstallation, $str_ServiceEnterAdminName, "administrator" )
				If @error <> 0 Then ContinueLoop
				$password = InputBox( $str_MsgBox_ServiceInstallation, $str_ServiceEnterAdminPass, "", "*" )
				If @error <> 0 Then ContinueLoop
			
				; Check Admin Credentials.
				RunAsWait( $username, $domain, $password, 0, @SystemDir & "\rundll32.exe", @SystemDir, @SW_HIDE )
				If @error = 1 Then
					MsgBox( 48, $str_MsgBox_Error, $str_ErrorDisableUAC, 30 )
					ContinueLoop
				EndIf
				
			EndIf
			
			; Kill the VNC server.
			ProcessClose( "InstantSupportVNC.exe" )
			; Wait for the winvnc server to close.
			ProcessWaitClose( "InstantSupportVNC.exe", 15 )
			; Run installer after the server exits.
			ProcessWaitClose( "InstantSupportVNC.exe" )
			
			If IsAdmin() Then
						ShellExecute($WorkingPath & "\psexec.exe", ' -accepteula -i -s "' & $WorkingPath & '\InstantSupport.exe" -disableuac', @ScriptDir, "")
					Else
						RunAs( $username, $domain, $password, 0, $WorkingPath & '\psexec.exe -accepteula -i -s "' & $WorkingPath & '\InstantSupport.exe" -disableuac', "", @SW_HIDE )
					EndIf
					
			InstantSupportExit( True )
		Case $ExitItem
			WinSetOnTop( $str_Program_Title, "",0 )
			If MsgBox( 4, $str_Program_Title, $str_EndSupportSession ) = 6 Then
				InstantSupportExit( True )
			EndIf
	EndSwitch
WEnd
Func InstallService()
	; Copy files.
	FileCopy( @ScriptDir & "\*.*", @ProgramFilesDir & "\InstantSupport\", 9 )
	; Create uninstall link on All Users desktop.
	FileCreateShortcut( @ProgramFilesDir & '\InstantSupport\InstantSupport.exe', @DesktopCommonDir & '\' & $str_ServiceUninstallShortcut &'.lnk', "", "-removeservice" )
	; Install VNC Service.
	RunWait( @ComSpec & ' /c sc create ' & $ServiceName & ' binPath= "' & @ProgramFilesDir & '\InstantSupport\InstantSupportVNC.exe -service" start= auto DisplayName= "' & $ServiceDisplayName & '"', "", @SW_HIDE )
	RunWait( @ComSpec & ' /c sc description ' & $ServiceName & ' "' & $ServiceDescription & '"', "", @SW_HIDE )
	RunWait( @ComSpec & ' /c net start ' & $ServiceName, "", @SW_HIDE )
EndFunc
Func RemoveService()
	WinSetOnTop( $str_Program_Title, "",0 )
	If MsgBox( 4, $str_Program_Title, $str_MsgBox_RemoveService ) = 6 Then
		; Remove Uninstaller.
		FileDelete( @DesktopCommonDir & '\Uninstall Instant Support.lnk"' )
		; Remove VNC Service.
		RunWait( @ComSpec & " /c net stop " & $ServiceName, "", @SW_HIDE )
		RunWait( @ComSpec & " /c sc delete " & $ServiceName, "", @SW_HIDE )
		; Remove the InstantSupport Service.
		_DeleteSelf( @ProgramFilesDir & "\InstantSupport", 15 )
	EndIf
EndFunc
Func DisableUAC()
	$admin = RegRead( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ConsentPromptBehaviorAdmin")
	$lua = RegRead( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "EnableLUA")
	$desktop = RegRead( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "PromptOnSecureDesktop")
	
	If ( $admin = "0" And $lua = "0" And $desktop = "0" ) Then
	
		$adminbackup = RegRead( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ASadminbackup")
		$luabackup = RegRead( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ASluabackup")
		$desktopbackup = RegRead( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ASdesktopbackup")
	
		RegWrite( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ConsentPromptBehaviorAdmin", "REG_DWORD", $adminbackup)
		RegWrite( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "EnableLUA", "REG_DWORD", $luabackup)
		RegWrite( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "PromptOnSecureDesktop", "REG_DWORD", $desktopbackup)
		
		RegDelete( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ASadminbackup")
		RegDelete( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ASluabackup")
		RegDelete( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ASdesktopbackup")
	
	Else
	
		RegWrite( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ASadminbackup", "REG_DWORD", $admin)
		RegWrite( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ASluabackup", "REG_DWORD", $lua)
		RegWrite( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ASdesktopbackup", "REG_DWORD", $desktop)
	
		RegWrite( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ConsentPromptBehaviorAdmin", "REG_DWORD", "0")
		RegWrite( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "EnableLUA", "REG_DWORD", "0")
		RegWrite( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "PromptOnSecureDesktop", "REG_DWORD", "0")
		
		$UACDisabled = True
		
	EndIf
EndFunc
Func _DeleteSelf( $Path, $iDelay = 5 )
	Local $sCmdFile
	FileDelete( @TempDir & "\scratch.bat" )
	$sCmdFile = 'PING -n ' & $iDelay & ' 127.0.0.1 > nul' & @CRLF _
			& 'DEL /F /Q "' & $Path & '\InstantSupportVNC.exe"' & @CRLF _
			& 'DEL /F /Q "' & $Path & '\InstantSupport.exe"' & @CRLF _
			& 'DEL /F /Q "' & $Path & '\SecureVNCPlugin.dsm"' & @CRLF _
			& 'DEL /F /Q "' & $Path & '\ultravnc.ini"' & @CRLF _
			& 'DEL /F /Q "' & $Path & '\instantsupport.ini"' & @CRLF _
			& 'DEL /F /Q "' & $Path & '\logo.jpg"' & @CRLF _
			& 'DEL /F /Q "' & $Path & '\unblock.js"' & @CRLF _
 			& 'RMDIR "' & $Path & '"' & @CRLF _
			& 'DEL "' & @TempDir & '\scratch.bat"'
	FileWrite( @TempDir & "\scratch.bat", $sCmdFile )
	Run( @TempDir & "\scratch.bat", @TempDir, @SW_HIDE )
EndFunc
Func InstantSupportExit( $DeleteFiles = False )
	; Kill the VNC server
	ProcessClose( "InstantSupportVNC.exe" )
	; Wait for the winvnc server to close.
	ProcessWaitClose( "InstantSupportVNC.exe", 15 )
	
	; Set default UAC.
	If IsAdmin() Then
		$admin = RegRead( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ConsentPromptBehaviorAdmin")
		$lua = RegRead( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "EnableLUA")
		$desktop = RegRead( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "PromptOnSecureDesktop")
	
		If ( $admin = "0" And $lua = "0" And $desktop = "0" ) Then
	
			$adminbackup = RegRead( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ASadminbackup")
			$luabackup = RegRead( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ASluabackup")
			$desktopbackup = RegRead( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ASdesktopbackup")
	
			RegWrite( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ConsentPromptBehaviorAdmin", "REG_DWORD", $adminbackup)
			RegWrite( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "EnableLUA", "REG_DWORD", $luabackup)
			RegWrite( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "PromptOnSecureDesktop", "REG_DWORD", $desktopbackup)
		
			RegDelete( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ASadminbackup")
			RegDelete( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ASluabackup")
			RegDelete( "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System", "ASdesktopbackup")
		
		EndIf
		
	EndIf
	; Remove temp files.
	If $DeleteFiles = True Then _DeleteSelf( $WorkingPath, 5)
	Exit
EndFunc
Func StopServices()
	_StopService("", "uvnc_service")
	_StopService("", "winvnc")
	_StopService("", $ServiceName)
EndFunc

