/* ---------------------------------------------------------------- Ryan Kellerman - Documentor Script v2.0.8 Last Updated: 3/25/09 ----------------------------------------------------------------- * NOTE: If you want to scan a pre-determined list of computers create a file named targets.txt and put it in the same directory as this script file. When you click run on the execute tab the computer name input and the domain scan checkbox will be ignored. The systems can each be on their own line, or multiples to line simply seperated by a comma. *** To Do List *** *create more effective layout for visio *add windows event viewer gathering (options maybe for errors, warnings, information + time frames) *allow choice for IP address range input *validation on IP address ranges *get that damned Last User logon working ... *report ROM drives *report Printers (local only most probably) *report on shares off of a server (I dunno, maybe the share permissions also) *agent mode *clean up the god awful office report function *column ordering? 2.0.8 - Updates *now generates XML files for output with all of the computer data *hacked in reporting all apps for 64-bit systems. :D 2.0.7 - Updates *fixed bug, hopefully, where script errors out while dumping to text or excel 2.0.6 - Updates *added Event Log reporting 2.0.5 - Updates *added Windows Services listing *fixed weird floating "to Excel, to Visio, toText" button issue introduced in 2.0.4 *add hard disk capacity and free space dump report to Excel *created disk reporting tab for output to excel *created disk reporting text file for output *clean up comma's from output of report functions for Apps and Services (so CSV files workout alright) *on HTML display form change commas to spaces so word wrap will happen in HTML output 2.0.4 - Updates *clean up css for IE windows (roll into a function per window) *get the stop scan button working *report to text file ... *make application report collapsed in Internet Explorer window *allow input of multiple alternate credentials *quickly validate a system that has retuned a ping request is a windows host *altered behavior so the application appears as a foreground window 2.0.3 - Updates *fixed IE crash problem after a long domain scan has run *sped up IP and Network adapter performance by altering WMI query so that only enabled Network Adapters are returned *fixed up so Office reports on x64 OSes *report free space on hard disks *break Windows Product Keys out *filter servers/workstations on return, give users the choice 2.0.2 - Updates *adding Visio output piece *gather subnet mask and place it with IP address in slash format 2.0.1 - Updates *started keeping track of updates. *renamed Output more aptly to Execute *fixed Excel dump crash when Application Report wasn't selected ------------------------------------------------------------------- */ var mainHeader //DHTML h1 object var mainStatus //DHTML p object var mainTabs //DHTML unordered list object var mainCredentialsTab //DHTML Button item should be a child to mainTabs var mainWorkstationTab //DHTML Button item should be a child to mainTabs var mainOutputTab //DHTML Button item should be a child to mainTabs var mainIE //my internet explorer object for the user setup screens var scanIE //my internet explorer object for the scan process var objScanIeQuitButton //this will need to accessible from multiple functions as the innerText of it will need to be changed when a scan is complete. var userRequestedScanTermination = false; var currentHostCredentials = new Array("",""); //currentHostCredentials //[0] is username [1] is password var strAppTitle = "Documentor 2.0.8"; //applications title var wksArray = new Array(); //will be a multi-dimensional array with all of the workstation tab input values /* wksArray map [0] "wksName" => status => "Name" [1] "wksIP" => status => "IP Address" [2] "wksCPU" => status => "CPU(s)" [3] "wksRAM" => status => "System Memory" [4] "wksMake" => status => "System Make" [5] "wksModel" => status => "System Model" [6] "wksOS" => status => "Operating System" [7] "wksWpk" => status => "Windows Product Key" [8] "wksSerial" => status => "Serial Number" [9] "wksLastUser" => status => "Last User Logon" [10] "wksVideo" => status => "Video Adapter(s)" [11] "wksAudio" => status => "Audio Adapter(s)" [12] "wksNetwork" => status => "Network Adapter(s)" [13] "wksOffice" => status => "Microsoft Office" [14] "wksDisk" => status => "Hard Disk Information" [15] "wksApps" => status => "Generic Application Report" [16] "wksServices" => status => "Report Services" [17] "wksLogs" => status => "Event Logs" Where status is a boolean flag for whether or not that is currently selected */ var credArray = new Array(); //will be a multi-dimensional array with all of the credential input values var outputArray = new Array(2); /* will be an array containing values for the output of data ... right now just an Excel spreadsheet path and the system the script will run against, in the future I hope to have database outputs and he option to set the script to "agent" mode for per system reporting outputArray[0] <- hostname or fqdn outputArray[1] <- scan based on hosts off of directory controller outputArray[2] <- Filter Type (Servers Only, Workstations Only, All) */ //application entry point main(); function main() { /* this function is the application arguments: none returns: nothing */ //setup my default data values initializeWksArray(); //create default values for my Workstation input array initializeCredArray(); //create default values for my Credentals input array initializeOutputArray(); //create deffault values for my Output input (heh) array //create internet explorer object for the application to run as ... ieMainSetup(); while(true) { WScript.Sleep(50); } } /* -------------------------------------------------------------------------------- *********************************************************************************** Main Scan portion Internet Explorer setup and manipulation functions (DHTML) *********************************************************************************** ---------------------------------------------------------------------------------*/ function ieMainSetup() { /* create my internet explore object the way I want it and return it arguemnts: returns: Returns an unhiden internet explorer object */ mainIE = WScript.CreateObject("InternetExplorer.Application"); //ieObject for workstation scan output use var objShell = new ActiveXObject("WScript.Shell"); mainIE.Navigate("about:blank"); configureMainIeStyleSheets(); mainIE.Toolbar = 0; mainIE.StatusBar = 0; mainIE.Width = 720; mainIE.Height = 750; mainIE.Resizable = true; while (mainIE.Busy) { WScript.Sleep(200); } mainIE.document.title = strAppTitle; //set the window title for Internet Explorer mainIE.Visible = 1; WScript.Sleep(50); objShell.AppActivate(strAppTitle); //an attempt to bring the Inernet Explorer window into focus (Microsoft changed this behavior, now it just makes the title flash in the taskbar mainIE.document.body.appendChild(quitButtonSetup()); mainHeader = headerSetup(); //the doc header... mainIE.document.body.appendChild(mainHeader); mainStatus = statusSetup(); //the status area mainIE.document.body.appendChild(mainStatus); mainTabs = tabsStripSetup(); //tab strip container mainIE.document.body.appendChild(mainTabs); mainCredentialsTab = tabSetup("Credentials"); //put in a tab "Credentials" mainTabs.appendChild(mainCredentialsTab); mainWorkstationsTab = tabSetup("Workstations"); //put in a tab "Workstations" mainTabs.appendChild(mainWorkstationsTab); mainOutputTab = tabSetup("Execute"); //put in a tab "Execute" mainTabs.appendChild(mainOutputTab); activateTab("Credentials"); } function configureMainIeStyleSheets() { /* creates css rules (mostly classes) and their properties for use else where in the script, this should help reduce the size of the script */ try { mainIE.document.createStyleSheet(); } catch(err) { //sometimes the script is faster than Internet Explorer ... weird WScript.Sleep(500); mainIE.document.createStyleSheet(); } var myCss = mainIE.document.styleSheets[0]; //BODY element rules myCss.addRule("body","margin: 0px"); myCss.addRule("body","padding: 0px"); myCss.addRule("body","font-family: Arial"); myCss.addRule("body","background: #fff"); //.mainHeader class rules myCss.addRule(".mainHeader","color: #fff"); myCss.addRule(".mainHeader","background: #333"); myCss.addRule(".mainHeader","border: 1px solid #333"); myCss.addRule(".mainHeader","font-size: 1.0em"); myCss.addRule(".mainHeader","font-weight: Bold"); myCss.addRule(".mainHeader","padding: 8px"); myCss.addRule(".mainHeader","margin: 0px"); //.mainStatus class rules myCss.addRule(".mainStatus","color: #000"); myCss.addRule(".mainStatus","background: #eee"); myCss.addRule(".mainStatus","border-bottom: 1px solid #888"); myCss.addRule(".mainStatus","font-size: 12px"); myCss.addRule(".mainStatus","padding-left: 10px"); myCss.addRule(".mainStatus","padding-top: 2px"); myCss.addRule(".mainStatus","padding-bottom: 2px"); myCss.addRule(".mainStatus","margin: 0px"); //.mainTabStripContainer class rules myCss.addRule(".mainTabStripContainer","margin: 0px"); myCss.addRule(".mainTabStripContainer","padding: 0px"); //.mainQuitButton class rules myCss.addRule(".mainQuitButton","border: 1px solid #fff"); myCss.addRule(".mainQuitButton","font-size: 11px"); myCss.addRule(".mainQuitButton","margin-top: 8px"); myCss.addRule(".mainQuitButton","margin-right: 7px"); myCss.addRule(".mainQuitButton","float: right"); myCss.addRule(".mainQuitButton","width: 60px"); //.mainTabActive class rules myCss.addRule(".mainTabActive","color: #fff"); myCss.addRule(".mainTabActive","background: #000"); myCss.addRule(".mainTabActive","font-weight: Bold"); myCss.addRule(".mainTabActive","border: 1px solid #000"); myCss.addRule(".mainTabActive","border-bottom: 1px solid #000"); myCss.addRule(".mainTabActive","padding-top: 1px"); myCss.addRule(".mainTabActive","padding-bottom: 1px"); myCss.addRule(".mainTabActive","margin-top: 2px"); myCss.addRule(".mainTabActive","margin-left: 2px"); myCss.addRule(".mainTabActive","margin-bottom: 0px"); myCss.addRule(".mainTabActive","width: 100px"); //.mainTabInactive class rules myCss.addRule(".mainTabInactive","color: #333"); myCss.addRule(".mainTabInactive","background: #fff"); myCss.addRule(".mainTabInactive","font-weight: Bold"); myCss.addRule(".mainTabInactive","border: 1px solid #000"); myCss.addRule(".mainTabInactive","border-bottom: 1px solid #eee"); myCss.addRule(".mainTabInactive","padding-top: 1px"); myCss.addRule(".mainTabInactive","padding-bottom: 1px"); myCss.addRule(".mainTabInactive","margin-top: 2px"); myCss.addRule(".mainTabInactive","margin-left: 2px"); myCss.addRule(".mainTabInactive","margin-bottom: 0px"); myCss.addRule(".mainTabInactive","width: 100px"); //.mainSubTabsTitle class rules myCss.addRule(".mainSubTabsTitle","background: #000"); myCss.addRule(".mainSubTabsTitle","color: #fff"); myCss.addRule(".mainSubTabsTitle","margin: 0px"); myCss.addRule(".mainSubTabsTitle","paddingRight: 10px"); myCss.addRule(".mainSubTabsTitle","text-align: right"); myCss.addRule(".mainSubTabsTitle","font-weight: Bold"); myCss.addRule(".mainSubTabsTitle","border: 1px solid #000"); //.mainActiveFormTable class rules myCss.addRule(".mainActiveFormTable","border: 1px solid #000"); myCss.addRule(".mainActiveFormTable","color: #000"); myCss.addRule(".mainActiveFormTable","background: #000"); myCss.addRule(".mainActiveFormTable","margin: 0px"); myCss.addRule(".mainActiveFormTable","padding: 0px"); myCss.addRule(".mainActiveFormTable","font-size: 14px"); myCss.addRule(".mainActiveFormTable","width: 100%"); //.mainInputContainer class rules myCss.addRule(".mainInputContainer","background: #eee"); myCss.addRule(".mainInputContainer","text-align: center"); myCss.addRule(".mainInputContainer","padding: 10px"); //.mainInputTable class rules myCss.addRule(".mainInputTable","margin: 20px"); myCss.addRule(".mainInputTable","backgroundColor: #eee"); myCss.addRule(".mainInputTable","color: #000"); myCss.addRule(".mainInputTable","text-align: left"); //.mainCredentialInputField class rules myCss.addRule(".mainCredentialInputField", "border: 1px solid #000"); myCss.addRule(".mainCredentialInputField", "width: 300px"); //.mainCredentialsList class name myCss.addRule(".mainCredentialsList","border: 1px dotted #000"); myCss.addRule(".mainCredentialsList","background: #fff"); myCss.addRule(".mainCredentialsList","font-weight: Bold"); myCss.addRule(".mainCredentialsList","font-size: 12px"); myCss.addRule(".mainCredentialsList","width: 100%"); myCss.addRule(".mainCredentialsList","text-align: left"); //.mainRemoveCredButton class rules myCss.addRule(".mainRemoveCredButton","background: #eee"); myCss.addRule(".mainRemoveCredButton","border: 1px solid #000"); myCss.addRule(".mainRemoveCredButton","color: #000"); //.mainCredBlankList class rules myCss.addRule(".mainCredBlankList","padding: 20px 20px 20px 20px"); //.mainCredListItemRemoveCell class rules myCss.addRule(".mainCredListItemRemoveCell","text-align: left"); myCss.addRule(".mainCredListItemRemoveCell","width: 100px"); myCss.addRule(".mainCredListItemRemoveCell","border-bottom: 1px dotted #000"); myCss.addRule(".mainCredListItemRemoveCell","padding: 10px 10px 10px 10px"); myCss.addRule(".mainCredListItemRemoveCell","font-size: 12px"); //.mainCredListItemTitleCell class rules myCss.addRule(".mainCredListItemTitleCell","text-align: left"); myCss.addRule(".mainCredListItemTitleCell","border-bottom: 1px dotted #000"); myCss.addRule(".mainCredListItemTitleCell","padding: 10px 10px 10px 10px"); myCss.addRule(".mainCredListItemTitleCell","font-size: 12px"); //.mainCredAddButton class rules myCss.addRule(".mainCredAddButton","background: #ccc"); myCss.addRule(".mainCredAddButton","color: #000"); myCss.addRule(".mainCredAddButton","border: 1px solid #000"); myCss.addRule(".mainCredAddButton","float: right"); myCss.addRule(".mainCredAddButton","width: 60px"); myCss.addRule(".mainCredAddButton","font-size: 11px"); //.mainLabelCell class rules myCss.addRule(".mainLabelCell","text-align: right"); myCss.addRule(".mainLabelCell","width: 120px"); //.mainInputTargetBox class rules myCss.addRule(".mainInputTargetBox","border: 1px solid #000"); myCss.addRule(".mainInputTargetBox","width: 300px"); //.mainInputDcCheckbox class rules myCss.addRule(".mainInputDcCheckBox","text-align: right"); //.mainFilterDescriptionCell class rules myCss.addRule(".mainFilterDescriptionCell","text-align: right"); myCss.addRule(".mainFilterDescriptionCell","verticalAlign: top"); myCss.addRule(".mainFilterDescriptionCell","padding-top: 8px"); //.mainWorkstationUnselected class rules myCss.addRule(".mainWorkstationUnselected","background: #ddd"); myCss.addRule(".mainWorkstationUnselected","font-weight: Normal"); myCss.addRule(".mainWorkstationUnselected","border: 1px solid #000"); myCss.addRule(".mainWorkstationUnselected","width: 150px"); //.mainWorkstationSelected class rules myCss.addRule(".mainWorkstationSelected","background: #fff"); myCss.addRule(".mainWorkstationSelected","font-weight: Bold"); myCss.addRule(".mainWorkstationSelected","border: 1px solid #000"); myCss.addRule(".mainWorkstationSelected","width: 150px"); //.mainExecButton class rules myCss.addRule(".mainExecButton","border: 1px solid #000"); myCss.addRule(".mainExecButton","background: #ddd"); myCss.addRule(".mainExecButton","color: #000"); myCss.addRule(".mainExecButton","float: right"); } function headerSetup() { /* create my header object the way I want stylistically for use in the DHTML document arguemnts: pass the internet explorer object that we'll be using as the UI returns: DHTML H1 object for use with Internet Explorer */ thisHeader = mainIE.document.createElement("H1"); thisHeader.className = "mainHeader"; thisHeader.innerText = strAppTitle; return thisHeader; } function statusSetup() { /* create my status object the way I want stylistically for use in the DHTML document arguments: pass the internet explorer object that we'll be using as the UI returns: DHTML p object for use with internet explorer */ thisStatus = mainIE.document.createElement("P"); thisStatus.className = "mainStatus"; thisStatus.innerText = "Initializing ..."; return thisStatus; } function tabsStripSetup() { /* this function creates the P DHTML object that will used to create the tabs ... ideally each LI will be a clickable button arguments: the internet explorer object it will be appended to returns: DHTML UL object */ thisTabs = mainIE.document.createElement("P"); thisTabs.className = "mainTabStripContainer"; return thisTabs; } function tabSetup(strTabName) { /* this function will create a credentials tab for the application in the UL variable named mainTabs arguments: thisIE is the UL DHTML object this item will be appended to strTabName is the text name that will appear on the tab returns: LI DHTML object */ thisTab = mainIE.document.createElement("button"); thisTab.className = "mainTab"; thisTab.innerText = strTabName; thisTab.onclick = activateTab return thisTab; } function quitButtonSetup() { /* create my quit button for terminating the application, it should appear in the title window arguments: none returns: none */ thisButton = mainIE.document.createElement("button"); thisButton.className = "mainQuitButton"; thisButton.innerText = "Quit"; thisButton.onclick = terminateApplication return thisButton; } function terminateApplication() { /* this is what excutes when the Quit button is pushed arguments: none returns: none */ mainIE.Quit(); WScript.Quit(); } function activateTab(strTab) { /* input: the tab variable that has been activated return: nothing really, this more procedural than anything */ //if this function was called by a button click then we'll need to use this to get the data about the button if(typeof(strTab) == "undefined") { strTab = this.innerText; } mainStatus.innerText = "Activating tab " + strTab; //first I'll have remove everything below colTabs = mainTabs.getElementsByTagName("button"); for(var i=0; i