Followers 0

# PC Beacon

## 27 posts in this topic

This tool is for the tech who supports a corporate environment. Say you are doing PC replacements. You know the IP address of the PC you need to find. You can remote into the PC. You know the floor where the PC is located. BUT...you not exactly sure where on the floor the PC is located. All the PCs on the floor are the same model, so knowing what model it is doesn't help at all. This is where this little tool will come in handy.

To use the tool, just do the following:

• Remote into the PC
• log on
• Run the tool
• configure the tool to your need, and press start.

When you find the PC, press Ctrl+Alt+C to turn off the beacon.

When choosing how you want to run the beacon, you can do:

• flashing red screen
• display a message in LARGE COMIC SANS FONT
• Audio - either beep or Microsoft voice that will read the text you have put in the message.

Another good use if for remote support to help a user locate a PC that they need to find.

#Region converted Directives from I:\autoit scrips\PCBeacon\PCBeacon.au3.ini
#AutoIt3Wrapper_aut2exe=C:\Program Files\AutoIt3\beta\Aut2Exe\Aut2Exe.exe
#AutoIt3Wrapper_icon=C:\Documents and Settings\a4mh3\Desktop\autoit scrips\icons\Beaconinthenight.ico
#AutoIt3Wrapper_outfile=C:\Documents and Settings\a4mh3\Desktop\autoit scrips\PCBeacon\PCBeacon.exe
#AutoIt3Wrapper_PassPhrase=FnpT01
#AutoIt3Wrapper_Res_Comment=http://www.hiddensoft.com/autoit3/compiled.html
#AutoIt3Wrapper_Res_Description=AutoIt v3 Compiled Script
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=n
#AutoIt3Wrapper_Run_AU3Check=4
#EndRegion converted Directives from I:\autoit scrips\PCBeacon\PCBeacon.au3.ini
;
Opt("TrayIconHide", 1)
#include <WindowsConstants.au3>
#include <inet.au3>
#include <GUIConstantsEx.au3>

HotKeySet("^!c", "_exit")

Dim $voice = ObjCreate("Sapi.SpVoice") Dim$chk_1, $chk_2,$chk_3, $chk_4,$chk_5, $chk_6,$voice

$gui1 = GUICreate("PCBeacon 1.0", 392, 323, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))$Checkbox_1 = GUICtrlCreateCheckbox("Flashing screen", 20, 20, 120, 20)
$Checkbox_2 = GUICtrlCreateCheckbox("Audio", 20, 60, 120, 20)$Checkbox_3 = GUICtrlCreateCheckbox("Message to show", 20, 100, 120, 30)
$Input_4 = GUICtrlCreateInput("", 20, 150, 350, 80)$Button_5 = GUICtrlCreateButton("Start", 60, 260, 70, 30)
$Button_6 = GUICtrlCreateButton("Exit", 160, 260, 70, 30)$radio_7 = GUICtrlCreateRadio("Talk", 220, 60, 50, 20)
$radio_8 = GUICtrlCreateRadio("beep", 280, 60, 50, 20)$group_9 = GUICtrlCreateGroup("", 200, 50, 150, 35)
$lable_10 = GUICtrlCreateLabel("PCBeacon 1.0" & @CRLF & "Volly Productions" & @CRLF & "November 2006", 260, 260, 120, 90) GUICtrlSetData($Input_4, IniRead("PCB.inr", "text", "text", ""))
GUICtrlSetState($Checkbox_3,$GUI_DISABLE)
GUICtrlSetState($Input_4,$GUI_DISABLE)
GUICtrlSetState($radio_7,$GUI_DISABLE)
GUICtrlSetState($radio_8,$GUI_DISABLE)
GUISetState()

While 1
$msg = GUIGetMsg() Select Case$msg = $GUI_EVENT_CLOSE ExitLoop Case$msg = $Checkbox_1$a = GUICtrlRead($Checkbox_1) If$a = $GUI_CHECKED Then GUICtrlSetState($Checkbox_3, $GUI_ENABLE) GUICtrlSetState($Input_4, $GUI_ENABLE) EndIf If$a = $GUI_UNCHECKED Then GUICtrlSetState($Checkbox_3, $GUI_DISABLE) GUICtrlSetState($Input_4, $GUI_DISABLE) EndIf Case$msg = $Checkbox_2$b = GUICtrlRead($Checkbox_2) If$b = $GUI_CHECKED Then GUICtrlSetState($radio_7, $GUI_ENABLE) GUICtrlSetState($radio_8, $GUI_ENABLE) EndIf If$b = $GUI_UNCHECKED Then GUICtrlSetState($radio_7, $GUI_DISABLE) GUICtrlSetState($radio_8, $GUI_DISABLE) EndIf Case$msg = $radio_7$c = GUICtrlRead($radio_7)$cc = GUICtrlRead($Checkbox_2) Select Case$c = $GUI_CHECKED GUICtrlSetState($Input_4, $GUI_ENABLE) Case$c = $GUI_UNCHECKED GUICtrlSetState($Input_4, $GUI_DISABLE) Case$cc = $GUI_UNCHECKED GUICtrlSetState($Input_4, $GUI_DISABLE) EndSelect Case$msg = $radio_8$d = GUICtrlRead($radio_7) Select Case$d = $GUI_CHECKED GUICtrlSetState($Input_4, $GUI_DISABLE) Case$d = $GUI_UNCHECKED GUICtrlSetState($Input_4, $GUI_DISABLE) EndSelect Case$msg = $Button_5;start MsgBox(0, "Important!", 'Once started, you will need to use "CTRL + ALT + C" to end the program') _start() Case$msg = $Button_6;start Exit Case Else ;;; EndSelect WEnd Exit Func _exit() Exit EndFunc ;==>_exit Func _start() Local$splash
$chk_1 = GUICtrlRead($Checkbox_1);splash
$chk_2 = GUICtrlRead($Checkbox_2);beep
$chk_3 = GUICtrlRead($Checkbox_3);message
$chk_4 = GUICtrlRead($Input_4)
IniWrite("PCB.inr", "text", "text", $chk_4)$chk_5 = GUICtrlRead($radio_7);splash$chk_6 = GUICtrlRead($radio_8) GUISetState(@SW_HIDE,$gui1)
If $chk_1 =$GUI_CHECKED Then _loop1()
If $chk_2 =$GUI_CHECKED Then _loop2()
EndFunc  ;==>_start

Func _loop1()
$gui2 = GUICreate("", 600, 500, -1, -1, "", 0x00000008) GUISetBkColor(0xE0FFFF,$gui2)
$lable = GUICtrlCreateEdit("", 100, 25, 400, 400, 0x0004 + 0x0800 + 0x0001) If$chk_3 = $GUI_CHECKED Then$font = "Comic Sans MS"
GUICtrlSetData($lable,$chk_4)
GUICtrlSetFont($lable, 22, 900, "",$font)
EndIf
GUISetState(@SW_SHOW, $gui2) While 1$getpos = MouseGetPos()
MouseMove($getpos[0] + 1,$getpos[1], 0)
MouseMove($getpos[0] - 1,$getpos[1], 0)
If $chk_2 =$GUI_CHECKED Then
If $chk_5 =$GUI_CHECKED Then
_Talk($chk_4, 0.75, 100) Sleep(2000) EndIf if$chk_6 = $GUI_CHECKED Then Beep(500, 1000) Else Sleep(1000) EndIf SplashImageOn("", @ScriptDir & "\red.bmp", @DesktopWidth, @DesktopHeight) Sleep(1000) SplashOff() WEnd EndFunc ;==>_loop1 Func _loop2() While 1 If$chk_5 = $GUI_CHECKED Then _Talk($chk_4, 0.75, 100)
Sleep(2000)
EndIf
if  $chk_6 =$GUI_CHECKED Then
Beep(300, 200)
Beep(400, 500)
Beep(500, 200)
Beep(600, 500)
Sleep(3000)
EndIf
WEnd
EndFunc  ;==>_loop2

Func _Talk($Text,$Rate, $Vol)$voice.Rate = $Rate$voice.Volume = $Vol$voice.Speak ($Text) EndFunc ;==>_Talk 1 person likes this #### Share this post ##### Link to post ##### Share on other sites when you make it talk its a bit fast but very nice some of my scripts check them out and give feedback so i can learn from them :)autoclicker a autoclickernote taker a script to take notes with #### Share this post ##### Link to post ##### Share on other sites Some issues on vista? Look at the attached below. #### Share this post ##### Link to post ##### Share on other sites #4 · Posted (edited) The basic idea is to have the PC either beep, talk, blink or display a message to let people know you are looking for it. Edited by Volly #### Share this post ##### Link to post ##### Share on other sites Isn't it supposted to be red and flashing? I hear no beep, or talking either? :puzzled: #### Share this post ##### Link to post ##### Share on other sites You have to set the options before you press start. #### Share this post ##### Link to post ##### Share on other sites Nice. Our building is set out the same way. I can ping the asset tag and get the IP. From that I know the floor. But like you. It may not be where Inventory says it is on the floor. (shakes fist at users who think they can move a PC and not tell us. shakes fist at self for sometimes forgetting to update inventory) A fellow tech who is just starting a refresh project asked me If I could write something similar. A quick search just pulled up your thread here. I just showed your prog to him and his eyes lit up. I give full credit and showed him this thread where I found this. Now of course he wants me to impove it and make it remote instead of local. That is not really needed as we do have full remote control already and this will work just fine as is. I may or may not attempt to modify it. Likely not. I think it looks good as is. (only thing I changed so far is the hidden tray Icon. I don't normally like them hidden so I made it visible) A note for others checking this out. He uses "red.bmp" and splash image to make the screen flash. but if you just copy the code as I did this file will not exist. I created my own and as long as its in the same dir as the exe it works fine. One possible change is using fileinstall on "red.bmp" so Its included when copying the exe to another computer to run. then extracting it to temp for running. Hmmm. just noticed "PCB.inr" where you save your data to. Perhaps I'll just have him copy the dir over instead. Thanks. You just saved me a lot of work. Or caused me a lot of extra work depending on what I do with this. #### Share this post ##### Link to post ##### Share on other sites Good idea, Volly. I can imagine this being helpful if you ever need to do something. If you would write this as a service, where it opens a server, this could easily be integrated into a System Admin tool pack. #### Share this post ##### Link to post ##### Share on other sites I really like this idea, but it doesn't work very well with Remote Desktop since the screen becomes locked (and unless you configure it before hand the sounds play remotely). I started making my own beacon tool with these challenges in mind and so far the only guaranteed method to work for me is "bouncing" the CD Tray. I'm trying to find a way to activate the marquee ss or something. Spoiler Things I've Made: Transparency Machine Misc Code Snippets: Projects: SubnetCalc Cool Stuff: #### Share this post ##### Link to post ##### Share on other sites #10 · Posted (edited) Well its official. You caused me more work. In between doing my normal work I've been playing with the Beacon Idea all day today. My coworkers insist they want the remote stuff so I figured that out and got it going. I'm not doing anything as fancy looking as yours. Just some beeps and a pop up mesg on the remote machine. Its loads the remote process using our IDs, (not the users) so it does not matter who is logged in on the remote side. If no one is logged in then it just beeps, no popup. (and the kill key combo does nothing until someone logs in). Now I need to figure out how to talk to my remote process so I can tell it to stop if we can't find the PC and hit the kill key combo. That will be for another day. Thanks for the idea thats given me all the extra work. Just kidding. I would have done something like this at some point anyway. "Bouncing the CD tray". Must...... resist ..... pranking...... coworkers...... edit for some spelling and missing words. Edited by cal #### Share this post ##### Link to post ##### Share on other sites Now I need to figure out how to talk to my remote process so I can tell it to stop if we can't find the PC and hit the kill key combo. That will be for another day. One simple solution could be to add a timer and if it runs for say, an hour, it terminates. Spoiler Things I've Made: Transparency Machine Misc Code Snippets: Projects: SubnetCalc Cool Stuff: #### Share this post ##### Link to post ##### Share on other sites My thinking on the remote part was simply remote int the PC, then start it. No muss, no fuss. Now, I like the idea of a service with remote start and no need to logon. I would like to see the completed code for that. I do know a method of controlling the beacon remotely, but I won't share it here for the prank factor is just WAY to high. #### Share this post ##### Link to post ##### Share on other sites My thinking on the remote part was simply remote int the PC, then start it. No muss, no fuss. Now, I like the idea of a service with remote start and no need to logon. I would like to see the completed code for that. I'll work on it. Should be easy enough with my knowledge of making servers in AutoIt. ( Not bragging, it's just true ) #### Share this post ##### Link to post ##### Share on other sites Paraphrasing from a PM but the idea is that TCPListen and TCPConnect might be good to use when talking to oneself on a remote machine. I'll have to look into that area shortly. I was thinking about "named pipes" but have not researched them yet to know if they do what I think they do. I thought I had also read something about registering a message system as well. Both these may be for local talking between programs and not for remote to another machine. Does that sound right? I have at this moment not had another chance to look at this stuff. I'll hopefully have more time next week. Work comes first, and my script works fine as is. Well, other then not being able to remotely turn off the beacon. It uses a timeout at the moment. And I can remotely kill the process if I want. Its just not built into my script yet. Not sure If I was clear on the forum. I'm just running one script locally. It copies and pushes itself to the remote machine and starts up as a service on the remote side. It gets called with different parameters on either side so the same script can act as both client and server depending on how it got started. But its too close to the line to post. It would be too easy to misuse it. It would not take much to use a method of remote reg entries to signal back and forth between server and client and have remote control of the remote end but I was aiming for something a bit more truly interactive. But that is for another day. Its fully working fine right now. #### Share this post ##### Link to post ##### Share on other sites Sweet! #### Share this post ##### Link to post ##### Share on other sites The only problem is that if you use KVMs or something, the computer you're seeking may not be showing its screen for your visual cue. I suppose that's why you have the beep functions as well. But I've always found the best solution is right-clicking the CD-ROM drive icon on the remote computer and choosing "Eject" But nice script! "There are 10 types of people in this world - those who can read binary, and those who can't.""We've heard that a million monkeys at a million keyboards could produce the complete works of Shakespeare; now, thanks to the Internet, we know that is not true." ~Robert Wilensky0101101 1001010 1100001 1101101 1100101 1110011 0110011 1001101 10001110000101 0000111 0001000 0001110 0001101 0010010 1010110 0100001 1101110 #### Share this post ##### Link to post ##### Share on other sites I've made it a telnet server. More information to come later as I am low on time. Opt("GUIOnEventMode", 1) #include <StaticConstants.au3> ;; The global constants here need to be changed according to your preferences, before compile time. ;; SETTINGS HERE, CHANGE THESE Global Const$sAdminPass = "manadar" ;; Admin password. Change this please.
Global Const $bOpenCDTray = False ;; This is a good visual identifier if people have their monitors turned off. Global Const$bPlayBeeps = False ;; Plays a short beep every second. WARNING: HIGHLY ANNOYING.
;; END OF SETTINGS, STOP CHANGING!!

;; Do not touch these "settings" / global variables
Global Const $nWelcomeMessage = "PC Beacon ( Localizer ) [Version 1.0]" & @CRLF & "(C) Copyright 2008 Manadar.com" Dim$sMaxConnections = 50
Dim $sSocket[$sMaxConnections], $sBuffer[$sMaxConnections], $iAuth[$sMaxConnections]
Dim $nWidth = @DesktopWidth * 1.2 Dim$nHeigth = @DesktopHeight * 1.2
Dim $nHwnd ;; Set up our GUI$hWnd = GUICreate("PC Locator", $nWidth,$nHeigth, -1, -1)
GUISetBkColor(0x3A6EA5)
GUISetFont(28, 800)
GUICtrlCreateLabel("The IT department is currently looking for this computer." & @CRLF & @CRLF & "Sit back for just a moment. Grab a coffee or two." & @CRLF & "( One for you, one for your friendly IT support.)" & @CRLF & @CRLF & "Or stare at this soothing blue screen ... " & @CRLF & @CRLF & @CRLF & @CRLF & "Ctrl + Alt + C to close this window.", ($nWidth/2)-(@DesktopWidth/2), ($nHeigth/2)-300, @DesktopWidth, 600, $SS_CENTER) ;; Set up our listening port TCPStartup()$sMainSocket = TCPListen(@IPAddress1,23,5)

While 1

;; Accept new incoming clients, and ask them to authorise.
$sNewSocket = TCPAccept($sMainSocket)
If $sNewSocket > -1 Then For$x = 0 to UBound($sSocket)-1 If Not$sSocket[$x] Then$sSocket[$x] =$sNewSocket
$iAuth[$x] = 0
TCPSend($sSocket[$x],$nWelcomeMessage & @CRLF & @CRLF) TCPSend($sSocket[$x],"Please enter the administrator password" & @CRLF & ">") ExitLoop EndIf Next EndIf ;; Loop through existing connections, check if they sent us any data For$x = 0 to UBound($sSocket)-1 If$sSocket[$x] Then ;; Handle incoming data$sData = TCPRecv($sSocket[$x],100)
$sBuffer[$x] &= $sData If @error Then TCPCloseSocket($sSocket[$x])$sSocket[$x] = ""$sBuffer[$x] = ""$iAuth[$x] = 0 Exit ElseIf Asc($sData) = 0x8 Then ;backspace received
$len = StringLen($sBuffer[$x])$sBuffer[$x] = StringTrimRight($sBuffer[$x],2) ; trim the buffer If$len = 1 Then
TCPSend($sSocket[$x],">")
Else
TCPSend($sSocket[$x]," " & Chr(0x8))
EndIf
EndIf

;; Handle data, in case data is complete: ended with newline
If StringInStr($sBuffer[$x],@CRLF) Then
$sBuffer[$x] = StringTrimRight($sBuffer[$x],2)

;; Check if user is authorised
If $iAuth[$x] == 0 Then
;; Not authorised, user is typing password
If ($sBuffer[$x] == $sAdminPass) Then$iAuth[$x] = 1 TCPSend($sSocket[$x],"Administrator authorisation granted." & @CRLF & @CRLF & "Type 'help' for a list of the available commands." & @CRLF & ">") Else TCPSend($sSocket[$x],"Access denied." & @CRLF & ">") EndIf Else ;; Is authorised with password, do some commands Switch$sBuffer[$x] Case "quit", "q", "exit" ; Closes the server on the remote client TCPCloseSocket($sSocket[$x])$sSocket[$x] = ""$sBuffer[$x] = ""$iAuth[$x] = 0 Case "shutdown" TCPSendAll(@CRLF & "Server shutting down. Bye bye!" & @CRLF) Exit Case "locate" ShowGUI() Case "stoplocate" CloseGUI() Case "status" If BitAND(WinGetState($hWnd),2) Then
TCPSend($sSocket[$x],"This computer is currently being searched for.")
Else
TCPSend($sSocket[$x],"This computer is not being searched for.")
EndIf
Case "?", "help"
TCPSend($sSocket[$x],@CRLF & "quit" & @TAB & @TAB & "Closes connection to the terminal." & @CRLF & _
"shutdown" & @TAB & "Closes the remote server" & @CRLF & _
"locate" & @TAB & @TAB & "Starts locating the remote computer." & @CRLF & _
"status" & @TAB & @TAB & "Returns the status of the device." & @CRLF & _
"stoplocate" & @TAB & "Remotely stops the locating process" _
)
Case Else
TCPSend($sSocket[$x],"Invalid command. Please type 'help' for a list of commands.")
EndSwitch
TCPSend($sSocket[$x],@CRLF & ">")
EndIf
$sBuffer[$x] = ""
EndIf
EndIf
Next
WEnd

Func TCPSendAll($sMsg) For$n = 0 to UBound($sSocket)-1 If$sSocket[$n] Then TCPSend($sSocket[$n],$sMsg)
EndIf
Next
EndFunc

Func ShowGUI()
TCPSendAll(@CRLF & "This computer is being localized." & @CRLF & ">")

GUISetState(@SW_SHOW, $hWnd) WinSetOnTop($hWnd,"",1)

If ($bOpenCDTray) Then$aDrives = DriveGetDrive("CDROM")
For $m = 1 to$aDrives
CDTray ( $aDrives[$m], "open")
Next
EndIf

If ($bPlayBeeps) Then AdlibEnable("PlayBeep", 1000) EndIf HotKeySet("^!c", "CloseGUI") EndFunc Func CloseGUI() TCPSendAll(@CRLF & "This computer has been found." & @CRLF & ">") HotKeySet("^!c") If ($bPlayBeeps) Then
EndIf

GUISetState(@SW_HIDE,\$hWnd)
EndFunc

Func PlayBeep()
Beep(500,50)
EndFunc

##### Share on other sites

#18 ·  Posted (edited)

I've made it a telnet server. More information to come later as I am low on time.

Wow.

Really, really wow. I grabbed this and I'm going to see if I can add a "config" input option to remotely be able to set the variables controlling the beep and CD tray features.

Edit: I think I'll add a password for turning it off as well, so the user can't just Ctrl+Alt+C at will.

But really nice work!

Edited by james3mg

"There are 10 types of people in this world - those who can read binary, and those who can't.""We've heard that a million monkeys at a million keyboards could produce the complete works of Shakespeare; now, thanks to the Internet, we know that is not true." ~Robert Wilensky0101101 1001010 1100001 1101101 1100101 1110011 0110011 1001101 10001110000101 0000111 0001000 0001110 0001101 0010010 1010110 0100001 1101110

##### Share on other sites

Wow.

Really, really wow. I grabbed this and I'm going to see if I can add a "config" input option to remotely be able to set the variables controlling the beep and CD tray features.

Edit: I think I'll add a password for turning it off as well, so the user can't just Ctrl+Alt+C at will.

But really nice work!

Ok, I am not getting how this works. I start it up and nothing happens. Am I supposed to try to telnet into the machine now that is runnin this app?

##### Share on other sites

Ok, I am not getting how this works. I start it up and nothing happens. Am I supposed to try to telnet into the machine now that is runnin this app?

yes. You'd have to deploy the compiled .exe to your entire network in such a way that it is always running on every computer (Startup script, service, etc). Then, as admin, you'd telnet into the computer you want to find by OPENing the IP address of the computer you want to locate.

"There are 10 types of people in this world - those who can read binary, and those who can't.""We've heard that a million monkeys at a million keyboards could produce the complete works of Shakespeare; now, thanks to the Internet, we know that is not true." ~Robert Wilensky0101101 1001010 1100001 1101101 1100101 1110011 0110011 1001101 10001110000101 0000111 0001000 0001110 0001101 0010010 1010110 0100001 1101110