Milestone Camera Selector Software - automation

I'm trying to create some AutoIT code for work to make launching our camera systems a bit easier. As of right now, I've been able to get my code to launch a gui, display a list of camera servers that you can add onto, and be able to add new servers to an internal directory. What I'm having a bit of trouble with is the section in which the program is supposed to switch to the newly launched Milestone software, type in the information, and click enter. I've found that the issue is linked to part of the start() function, in which WinWaitActive($handle) either isn't using the correct handle, or maybe the function I'm using is incorrect?
My end goal is to be able to wait 4 seconds, switch focus from whatever current window is selected to the newly opened Milestone window using either its handle or its PID, then send 2 TABs, the ip address, then send ENTER
#include <MsgBoxConstants.au3>
#include <Array.au3>
#include <ComboConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiComboBox.au3>
#Region EDIT THE BELOW INFORMATION-------------------------------------------------------------------------------------------------------------------------------------------
Local Const $milestone = "C:\Program Files\Milestone\XProtect Smart Client\Client.exe" ;Path to software
Local $Title = "Milestone Camera Selector"
#EndRegion-------------------------------------------------------------------------------------------------------------------------------------------------------------------
#Region Script---------------------------------------------------------------------------------------------------------------------------------------------------------------
Local $iFileExists = FileExists($milestone) ;Check if the file exists, returns a 1 or 0
Global $list = IniReadSection(#TempDir & "\" & $Title & "\config.ini","Server") ;Read the ini file, this builds a 2D Array [X][0] is the key [X][1] is the value
HotKeySet("{F1}", "help")
If $iFileExists Then ;If FileExists = 1 (exists) then
If Not FileExists(#TempDir & "\" & $Title) Then ;If config directory does not exists then
Do
DirCreate(#TempDir & "\" & $Title) ;Create a directory in TempDir for the config.ini file to be stored locally
Until FileExists(#TempDir & "\" & $Title)
IniWrite(#TempDir & "\" & $Title & "\config.ini", "Server", "", "")
EndIf
Local $GUI = GUICreate($Title, 267, 115) ;Create the GUI
$start = GUICtrlCreateButton("Start", 40, 72, 65, 25) ;Create a button
$create = GUICtrlCreateButton("Add Server", 160, 72, 65, 25)
$server = GUICtrlCreateCombo("Select Server", 8, 8, 249, 25, $CBS_DROPDOWN) ;Create the combo box
For $i = 1 To UBound($list) - 1 ;Populate combo box with first value (name) from array
If $list[$i][0] <> "" Then GUICtrlSetData($server, $list[$i][0]) ;Ensure array is not empty and fill combox with KEYS
Next
$servername = GUICtrlCreateInput("Server Name", 8, 40, 121, 21)
GUICtrlSetState(-1, $GUI_HIDE)
$serverip = GUICtrlCreateInput("IP Address", 136, 40, 121, 21)
GUICtrlSetState(-1, $GUI_HIDE)
GUISetState(#SW_SHOW)
While 1 ;Enter loop until user closes or presses button
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE ;Exit when closed
Exit
Case $start ;Store selection into variable, delete the GUI, and run the start function
$selection = GUICtrlRead($server)
If $selection <> "Select Server" Then
GUIDelete()
start()
EndIf
Case $create
If GUICtrlRead($create) = "Add Server" Then
GUICtrlSetState($servername, $GUI_SHOW)
GUICtrlSetState($serverip, $GUI_SHOW)
GUICtrlSetData($create, "Create")
Else
If (GUICtrlRead($servername) <> "" And GUICtrlRead($servername) <> "Server Name" And GUICtrlRead($serverip) <> "" And GUICtrlRead($serverip) <> "IP Address") Then
IniWrite(#TempDir & "\" & $Title & "\config.ini", "Server", GUICtrlRead($servername), GUICtrlRead($serverip))
GUICtrlSetState($servername, $GUI_HIDE)
GUICtrlSetState($serverip, $GUI_HIDE)
GUICtrlSetData($create, "Add Server")
Else
MsgBox($MB_ICONINFORMATION, $Title, "Invalid Server Name and IP Address.")
EndIf
For $i = UBound($list) - 1 To 0 Step -1
_GUICtrlComboBox_DeleteString($server, $i)
Next
Local $list = IniReadSection(#TempDir & "\" & $Title & "\config.ini","Server")
For $i = 1 To UBound($list) - 1
If $list[$i][0] <> "" Then GUICtrlSetData($server, $list[$i][0])
Next
EndIf
EndSwitch
WEnd
Else ;otherwise, message
MsgBox($MB_SYSTEMMODAL, "", "Milestone XProtect wasn't found on this computer" & #CRLF)
EndIf
Func start()
$iPID = Run($milestone,"", #SW_SHOWNOACTIVATE) ;Runs the software and returns the Process ID
Sleep(4000) ;sleep for 4 seconds
If #error Then MsgBox(0, $Title, "The program could not launch.") ;If Run returns a 0 or error, there was a problem
$handle = _GetHandleFromPID($iPID) ;Retrieve the handle of the program ran, jump to the function below
If $handle = 0 Then MsgBox(0, $Title, "The handle could not be found.") ;If the Handle returned is 0, there was no match
Sleep(1000)
WinWaitActive($handle) ;Wait for the program to be activated
Send("{TAB}") ;send keystrokes to active window
Send("{TAB}")
For $i = 0 to UBound($list) - 1 ;Find the IP address that matches the selection and send it
If $list[$i][0] = $selection Then Send($list[$i][1])
Next
Send("{ENTER}")
Exit ;Exit for now until you can capture a succesful run
EndFunc
func _GetHandleFromPID($PID) ;Call function with the PID returned from Run function
$WinList = WinList() ;Assign WinList to a variable
for $i = 1 to $WinList[0][0] ;Run through each Window in WinList, 2D array [titles][handles]
If WinGetProcess($WinList[$i][1]) = $PID then ;Look for a Window with the correct PID
Return $WinList[$i][1] ;Assign the matching Windows handle to the variable
EndIf
Next
Return 0 ;Return 0 if no matches were found
EndFunc
Func help()
ShellExecute(#TempDir & "\" & $Title & "\config.ini")
EndFunc
#EndRegion--------------------------------------------------------------------------------------------------------------------------------------------------------------------
Once again, any help would be greatly appreciated in helping me finish this project I started months ago. Also, if you think this would be easier to achieve in a different programming language like python or AutoHotkey, please let me know! :)

My apologies on going MIA. I got really busy with things and did not find time to look into the details of the software.
Essentially what is happening is the PID returned is associated with a process called CiceroUIWndFrame (a parent process running in the background) and it is returning the handle of that process. Since that process never get's activated the script just stays paused waiting for it to pop up. Unfortunately due to the fact that the Milestone software does not have it's own PID (look at the Details tab within task manager, you will notice the Milestone software is just called client.exe) we cannot use a good method to obtain the correct handle.
The only solution that I am aware of is to obtain the handle of the active window. So this modified script will run the Milestone X Protect Software, wait 1 second (hopefully long enough to start) and obtain the handle of whatever program is active. It then sleeps for 4 additional seconds, and waits for you to activate the client again. So if you are in another window and wait several minutes, the moment you activate the client login again it will send the keystrokes.
The downfall to this method is that you are relying on the active window after launch to be Milestone (if it takes longer to load, you get the wrong handle, if you click out of focus before 1 second you get the wrong handle).
#include <MsgBoxConstants.au3>
#include <Array.au3>
#include <ComboConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiComboBox.au3>
#include <AutoItConstants.au3>
#Region EDIT THE BELOW INFORMATION-------------------------------------------------------------------------------------------------------------------------------------------
Local Const $milestone = "C:\Program Files\Milestone\XProtect Smart Client\Client.exe" ;Path to software
Local $Title = "Program Title" ;Give me a name
Local $icon = "Full\Path\To\Icon.ico"
#EndRegion-------------------------------------------------------------------------------------------------------------------------------------------------------------------
#Region Script---------------------------------------------------------------------------------------------------------------------------------------------------------------
Local $iFileExists = FileExists($milestone) ;Check if the file exists, returns a 1 or 0
Global $list = IniReadSection(#TempDir & "\" & $Title & "\config.ini","Server") ;Read the ini file, this builds a 2D Array [X][0] is the key [X][1] is the value
HotKeySet("{F1}", "help")
If $iFileExists Then ;If FileExists = 1 (exists) then
If Not FileExists(#TempDir & "\" & $Title) Then ;If config directory does not exists then
Do
DirCreate(#TempDir & "\" & $Title) ;Create a directory in TempDir for the config.ini file to be stored locally
Until FileExists(#TempDir & "\" & $Title)
IniWrite(#TempDir & "\" & $Title & "\config.ini", "Server", "", "")
EndIf
Local $GUI = GUICreate($Title, 267, 115) ;Create the GUI
GUISetIcon($icon, -1) ;Create icon
$start = GUICtrlCreateButton("Start", 40, 72, 65, 25) ;Create a button
$create = GUICtrlCreateButton("Add Server", 160, 72, 65, 25)
$server = GUICtrlCreateCombo("Select Server", 8, 8, 249, 25, $CBS_DROPDOWN) ;Create the combo box
For $i = 1 To UBound($list) - 1 ;Populate combo box with first value (name) from array
If $list[$i][0] <> "" Then GUICtrlSetData($server, $list[$i][0]) ;Ensure array is not empty and fill combox with KEYS
Next
$servername = GUICtrlCreateInput("Server Name", 8, 40, 121, 21)
GUICtrlSetState(-1, $GUI_HIDE)
$serverip = GUICtrlCreateInput("IP Address", 136, 40, 121, 21)
GUICtrlSetState(-1, $GUI_HIDE)
GUISetState(#SW_SHOW)
While 1 ;Enter loop until user closes or presses button
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE ;Exit when closed
Exit
Case $start ;Store selection into variable, delete the GUI, and run the start function
$selection = GUICtrlRead($server)
If $selection <> "Select Server" Then
GUIDelete()
start()
EndIf
Case $create
If GUICtrlRead($create) = "Add Server" Then
GUICtrlSetState($servername, $GUI_SHOW)
GUICtrlSetState($serverip, $GUI_SHOW)
GUICtrlSetData($create, "Create")
Else
If (GUICtrlRead($servername) <> "" And GUICtrlRead($servername) <> "Server Name" And GUICtrlRead($serverip) <> "" And GUICtrlRead($serverip) <> "IP Address") Then
IniWrite(#TempDir & "\" & $Title & "\config.ini", "Server", GUICtrlRead($servername), GUICtrlRead($serverip))
GUICtrlSetState($servername, $GUI_HIDE)
GUICtrlSetState($serverip, $GUI_HIDE)
GUICtrlSetData($create, "Add Server")
Else
MsgBox($MB_ICONINFORMATION, $Title, "Invalid Server Name and IP Address.")
EndIf
For $i = UBound($list) - 1 To 0 Step -1
_GUICtrlComboBox_DeleteString($server, $i)
Next
Local $list = IniReadSection(#TempDir & "\" & $Title & "\config.ini","Server")
For $i = 1 To UBound($list) - 1
If $list[$i][0] <> "" Then GUICtrlSetData($server, $list[$i][0])
Next
EndIf
EndSwitch
WEnd
Else ;otherwise, message
MsgBox($MB_SYSTEMMODAL, "", "Milestone XProtect wasn't found on this computer" & #CRLF)
EndIf
Func start()
$iPID = Run($milestone) ;Runs the software and returns the Process ID
BlockInput(1)
Sleep(1000) ;sleep for 1 second
BlockInput(0)
If #error Then MsgBox(0, $Title, "The program could not launch.") Exit ;If Run returns a 0 or error, there was a problem
$handle = WinGetHandle("[ACTIVE]") ;Get the handle of the active window, should be Milestone software as it was just ran 1 second ago.
If $handle = 0 Then MsgBox(0, $Title, "The handle could not be found.") Exit;If the Handle returned is 0, there was no match
Sleep(4000)
WinWaitActive($handle) ;Wait for the program to be activated
Send("{TAB}") ;send keystrokes to active window
Send("{TAB}")
For $i = 0 to UBound($list) - 1 ;Find the IP address that matches the selection and send it
If $list[$i][0] = $selection Then Send($list[$i][1])
Next
Send("{ENTER}")
Exit ;Exit for now until you can capture a succesful run
EndFunc
Func help()
ShellExecute(#TempDir & "\" & $Title & "\config.ini")
EndFunc
#EndRegion--------------------------------------------------------------------------------------------------------------------------------------------------------------------
The added/modified lines is as follows, in order:
#include <AutoItConstants.au3>
$iPID = Run($milestone) ;Removed the #shownoactivate parameter, we want it to be the active window. Very important.
BlockInput(1) ;suggestion from comment, disables all input briefly
Sleep(1000) ;wait 1 second for program to launch
BlockInput(0) ;enables all user input again
If #error Then MsgBox(0, $Title, "The program could not launch.") Exit
$handle = WinGetHandle("[ACTIVE]") ;Get the handle of the active window, should be Milestone software as it was just ran 1 second ago.
If $handle = 0 Then MsgBox(0, $Title, "The handle could not be found.") Exit
Sleep(4000)
I tested this with the software on my end and it worked.

Related

How to save variables after quitting and reopening in AppleScript?

I am writing a very complicated AppleScript application that requires variables to be saved after quitting. So if I set the variable while it is running, close it, reopen it the variable will still be the same.
This script is intended to bring up a setup menu on first run. Then save the preferences for after the application is closed. More Technical explanation:
When it starts (on run) it will check if isSetup is false if it is it will go to the function setup(). The setup() function sets preferences and sets isSetup to true. When I quit and reopen the application is runs the setup() function again.
I know I am not supposed to copy and paste full scripts but I can't find the replicate the error without it. Here it is:
--AppleScript: menu bar script -- Created 2017-03-03 by Takaaki Naganoya adapted by ----
--2017 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
--http://piyocast.com/as/archives/4502
property aStatusItem : missing value
global theToggle
global theMenuTitle
global aTag
global aTitle
global isSetup
global usrName
global usrPass
global usrProtocol
property usrName : missing value
property usrPass : missing value
property isSetup : false
property usrProtocol : missing value
on run
if isSetup is false then
setup()
else
set theToggle to "Connect"
set theMenuTitle to "Server Helper"
init()
end if
end run
on init()
set aList to {theToggle, "Preferences", "Change Password", "", "Quit"}
set aStatusItem to current application's NSStatusBar's systemStatusBar()'s statusItemWithLength:(current application's NSVariableStatusItemLength)
aStatusItem's setTitle:theMenuTitle
aStatusItem's setHighlightMode:true
aStatusItem's setMenu:(createMenu(aList) of me)
end init
on createMenu(aList)
set aMenu to current application's NSMenu's alloc()'s init()
set aCount to 1
repeat with i in aList
set j to contents of i
if j is not equal to "" then
set aMenuItem to (current application's NSMenuItem's alloc()'s initWithTitle:j action:"actionHandler:" keyEquivalent:"")
else
set aMenuItem to (current application's NSMenuItem's separatorItem())
end if
(aMenuItem's setTarget:me)
(aMenuItem's setTag:aCount)
(aMenu's addItem:aMenuItem)
if j is not equal to "" then
set aCount to aCount + 1
end if
end repeat
return aMenu
end createMenu
on setup()
display dialog " Welcome to the Server setup Utility.
To Begin click " & quote & "Continue" & quote & " below." buttons {"Cancel", "Continue"} default button 2
set theButton to the button returned of the result
if theButton is "Continue" then
display dialog "Please enter your " & quote & "Username" & quote & " for the Brown Server." default answer "Username" buttons {"Continue"} default button 1
set usrName to the text returned of the result
display dialog "Please enter your " & quote & "Password" & quote & " for the Brown Server." default answer "" buttons {"Continue"} default button 1 with hidden answer
set usrPass to the text returned of the result
set listDeProtocols to {"AFP", "SMB", "WebDav", "FTP"}
set usrProtocol to (choose from list listDeProtocols with prompt "Choose Your Prefered Protocol. AFP is recomended. If AFP does not work try SMB. All others are not supported at this time")
set isSetup to true
postSet()
end if
end setup
on postSet()
if isSetup is false then
setup()
else
set theToggle to "Connect"
set theMenuTitle to "Server Helper"
init()
end if
end postSet
on changePref()
end changePref
on pref()
set length1 to the length of usrPass
set p1 to ""
set p2 to ""
repeat length1 times
set p1 to "•"
set p2 to p1 & p2
end repeat
display dialog "These are your following preferences. Click the " & quote & "Change" & quote & " to change.
Username: " & usrName & "
Password: " & p2 & "
Prefered Protocol: " & usrProtocol buttons {"Back", "Change"}
set theButton to the button returned of the result
if theButton is "Change" then
changePref()
end if
end pref
on actionHandler:sender
set aTag to tag of sender as integer
set aTitle to title of sender as string
if aTitle is not equal to "Quit" then
current application's NSStatusBar's systemStatusBar()'s removeStatusItem:aStatusItem
if aTitle is "Connect" then
set theToggle to "Disconnect"
init()
end if
if aTitle is "Disconnect" then
current application's NSStatusBar's systemStatusBar()'s removeStatusItem:aStatusItem
set theToggle to "Connect"
init()
end if
if aTitle is "Preferences" then
pref()
end if
if aTitle is "Change Password" then
changePass()
end if
else
current application's NSStatusBar's systemStatusBar()'s removeStatusItem:aStatusItem
end if
end actionHandler:
Update: doesn't work
YES!!!! I finally found the answer. You have to remove the property aStatusItem : missing value from the stop of the script. This will prevent aStatusItem from being used between functions. Because of this the menu bar won't be removed when you press quit. To fix that problem at the end change current application's NSStatusBar's systemStatusBar()'s removeStatusItem:aStatusItem to tell me to quit. This quits the application resulting in the menu bar item being removed.

How to stop script from automatically closing?

I open an .exe file but the script immediately closes after opening it. How can I prevent the script from closing?
Local $engine= "C:\Users\Davis\Desktop\chessEngine\stockfish-5-win\Windows\stockfish_14053109_32bit.exe"
Run($engine, "", #SW_MAXIMIZE, $STDOUT_CHILD)
Removing $STOUT_CHILD from Run() leaves the script open after executing, but I need this to read output from the program. Why is this happening?
Local $engine = "C:\Users\Davis\Desktop\chessEngine\stockfish-5-win\Windows\stockfish_14053109_32bit.exe"
Local $iPID = Run($engine, "", #SW_MAXIMIZE, $STDOUT_CHILD)
ProcessWaitClose($iPID)
This ist an example how to get output from a DOS command.
ConsoleWrite(_getDOSOutput('ipconfig /all') & #CRLF)
Func _getDOSOutput($command)
Local $text = '', $Pid = Run('"' & #ComSpec & '" /c ' & $command, '', #SW_HIDE, 2 + 4)
While 1
$text &= StdoutRead($Pid, False, False)
If #error Then ExitLoop
Sleep(10)
WEnd
Return StringStripWS($text, 7)
EndFunc ;==>_getDOSOutput

Send input to command line using AutoIt

I am new to autoit and am trying to automate the input to an .exe program. This executable does not have a gui and is run from the command window so can I use autoit to send the program specific input through the command window? If so how can I go about doing this?
Local $engine= "C:\Users\Davis\Desktop\Chess engine\stockfish32bit.exe"
Local $PID = RunWait(#ComSpec & " /k " & $engine, "", "#SW_MAXIMIZE")
;Insert code that sends program "uci" as input
This simple example shows how you can communicate with previously ran program.
; Demonstrates the use of StdinWrite()
#include <Constants.au3>
Local $foo = Run("sort.exe", #SystemDir, #SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
; Write string to be sorted to child sort.exe's STDIN
StdinWrite($foo, "rat" & #CRLF & "cat" & #CRLF & "bat" & #CRLF)
; Calling with no 2nd arg closes stream
StdinWrite($foo)
; Read from child's STDOUT and show
Local $data
While True
$data &= StdoutRead($foo)
If #error Then ExitLoop
Sleep(25)
WEnd
MsgBox(0, "Debug", $data)
Local $engine= "C:\Users\Davis\Desktop\Chess engine\stockfish32bit.exe"
Local $PID = RunWait(#ComSpec & " /k " & $engine, "", "#SW_MAXIMIZE")
$hCmd=WinGetHandle($engine)
ControlSend($hCmd, "", "", "uci" & #CR)

when i am running my script in compatibility mode i am getting following error?

i want to automate the automatic web login this code work with ie9 and for some of the forms(which are developed by using form tag) fine.but when i run same script for the form which is build with tag table it is not taking id's in Ie10, windows8 but the same script take ids with IE9 windows7 but in my work environment now we have mostly windows8 machines. So i came to know to if we run in compatibility mode we can solve issue when i added code for running in compatibility mode i am getting this error . i don't understand what to do..
#include <IE.au3>
#include <GuiButton.au3>
#include <File.au3>
#RequireAdmin
If IsAdmin() then
$64Bit = ""
If #OSArch = "X64" Then
$64Bit = "64"
EndIf
If StringLeft(RegRead("HKLM" & $64Bit & "\SOFTWARE\Microsoft\Internet Explorer\Version Vector", "IE"), 1) > 8 Then ;Check for version 9 or later
$wshNetwork = ObjCreate("WScript.Network")
$struser = $wshNetwork.Username
$objWMIService = ObjGet("winmgmts:\\.\root\cimv2")
$objAcc = $objWMIService.Get('Win32_UserAccount.Name="' & $struser & '",Domain="' & #ComputerName & '"')
$objAccount = $objAcc.SID
RegWrite("HKU" & $64Bit & "\" & $objAccount & "\Software\Microsoft\Internet Explorer\BrowserEmulation\", "AllSitesCompatibilityMode", "REG_DWORD", 1)
RegWrite("HKU\" & $objAccount & "\Software\Microsoft\Internet Explorer\BrowserEmulation\", "AllSitesCompatibilityMode", "REG_DWORD", 1)
EndIf
EndIf
$url = "https://190.198.14.15/"
$formID = ""
$formUID = "username"
$uName = "admin"
$formPID = "password"
$pwd = "SeR^ER#iL0"
$formSubmit = "ID_LOGON"
;Launch the Internet Explorer as a private session
ShellExecute ("iexplore.exe", " -private about:blank", #programFilesDir & "\Internet Explorer\iexplore.exe", "open", #SW_MAXIMIZE)
WinWait ("Blank Page")
$oIE = _IEAttach ("about:blank", "url")
;Wait for the IE to launch
_IELoadWait ($oIE)
;Navigate to the given URL
_IENavigate ($oIE, $url)
;Get the IE process id specific to this instance
Local $PID = WinGetProcess(_IEPropertyGet($oIE, "hwnd"))
;Print the PID in the console
If $PID Then
;MsgBox(0, "Example", "Internet Explorer is running.")
;MsgBox(0,"Process ID",$PID)
ConsoleWrite("["&$PID&"]")
Else
MsgBox(0, "Example", "Unable to get the process id of IE instance")
EndIf
;Disable IE address bar and menu bar
_IEPropertySet ($oIE, "addressbar", False)
_IEPropertySet ($oIE, "menubar", False)
;Click on 'Continue to this website' option if there is any HTTPS certificate Warning
while(_IELinkClickByText ($oIE, "Continue to this website (not recommended)."))
_IELoadWait ($oIE,10000)
wend
;Get the field id and fill with provided value
;$oIE.document.getElementById($formUID).value = $uName
$oIE.document.getElementsByName($formUID).Item(0).value = $uName
$oIE.document.getElementById($formPID).value = $pwd
;$oSubmit = _IEGetObjByName ($oIE, $formSubmit)
$oSubmit = $oIE.document.getElementById($formSubmit)
_IEAction ($oSubmit, "click")
when i am running this i am getting an error :
>"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "D:\My_Files\Automation scripts\My tests\AutomaticWebpageLogin -1.au3"
"D:\My_Files\Automation scripts\My tests\AutomaticWebpageLogin -1.au3" (18) : ==> Variable must be of type "Object".:
$objAccount = $objAcc.SID
$objAccount = $objAcc^ ERROR
>Exit code: 1 Time: 0.697
An Error occured at your Authentification process (line of $objAcc =), maybe wrong password or username.
Maybe if an error occures, the .Get Function of the WMI Service don't returns an object.
Check for Errors like this
if(#error <> 0) Then
; ERROR HANDLER
EndIf
And check if the account informations are correct.
Look at your other question
Reference to Win32_UserAccount

AppleScript: Main Script reading from random folder

How do you bundle an applescript that has a main script which is reading scripts randomly from a folder?
Check out this code: http://macosxautomation.com/applescript/linktrigger/index.html.
It's doing exactly that (besides other things) and you can use the sub-routine there for the script-handling.
Here is a full script that works when you follow these steps: save it as an application and put all your scripts into the "Resources" folder of that application (as described at the webpage, "Show Package Contents"). Good Luck.
property MyUserName : ""
if MyUserName is "" then
display dialog "User Name:" default answer "" buttons {"Cancel", "Continue…"} default button 2
copy the result as list to {returnedButton, returnedText}
if returnedButton is "Cancel" then return
-- What to do when the user did not input any text?
if returnedText is "" then return -- we stop.
set MyUserName to returnedText
say "Hello," & MyUserName & "!" using "Karen"
else
display dialog "User name: " & MyUserName buttons {"Ok"} default button 1 with icon 1 giving up after 10
end if
say "For your information, please start the Amuse App everytime you log on... and I will speak to you at random times during your visit with me." using "Karen"
delay 20
try
repeat 105 times
set rnd to (random number from 1 to 105)
set rndFileName to (rnd as text) & ".scpt"
if my run_scriptfile(rndFileName) is false then -- if the script execution fails,…
error number -128 -- … stop this app
end if
end repeat
on error the error_message number the error_number
display dialog "Error: " & the error_number & ". " & the error_message buttons {"OK"} default button 1
return
end try
on run_scriptfile(this_scriptfile)
-- This handler will execute a script file
-- located in the Resources folder of this applet
try
set the script_file to path to resource this_scriptfile
return (run script script_file)
on error
return false
end try
end run_scriptfile
This is how it looks with (only) 3 of the scripts you wanna randomly execute:
Your question is clear but here's an script that loads randomly a script from a folder, if the folder contains any.
set theFolder to choose folder as string
set theFiles to do shell script "ls " & quoted form of posix path of theFolder & " | grep '.scpt$' || true"
if theFiles = "" then return
set theFile to some item of (paragraphs of theFiles)
set randomScript to load script file (theFolder & theFile)