#175725 - 2007-04-26 06:59 PM
replacing items in a text file, the joy of writeline.
|
likedark
Fresh Scripter
Registered: 2005-03-23
Posts: 6
|
I have been kicking around the following code for a few days. The higher ups where I work would like a simple log to track some anti-virus info. I did a search and while I found some things here that were helpful, they wanted to use a specific format.
My problem is I want to be able to only add new items to the log and overwrite existing lines for pre-existing computers. I have tried writeline and readline but cannot seem to get anything to work in concert with the other. Either the Writelog functions works with everything else turned off or the writeline portion works but with everything else remmed out (meaning the open, if..then, while...loop statements, EVERYTHING).
It seems pretty simple to do, loop through each line for variable "x", if you find it, write this, if not, then write this. But then I am not a programmer by nature, so please bear with me.
Oh, I am using Kix 4.53.0.0, all our computer are XP with latest service packs, etc, etc.
Anyone have suggestions?
debug off
; declare variables for McAfee items and fill in the values with Registry locations.
$virusProd=ReadValue("HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\ePolicy Orchestrator\Application Plugins\VIRUSCAN8600", "Product Name")
$virusver=ReadValue("HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\ePolicy Orchestrator\Application Plugins\VIRUSCAN8600", "Version")
$virusdat=ReadValue("HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\ePolicy Orchestrator\Application Plugins\VIRUSCAN8600", "DATVersion")
$virusdate=ReadValue("HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\ePolicy Orchestrator\Application Plugins\VIRUSCAN8600", "DATDate")
$virusHotFix=ReadValue("HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\ePolicy Orchestrator\Application Plugins\VIRUSCAN8600", "HotFixVersions")
$epoagentver=ReadValue("HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\TVD\Shared Components\Framework\", "Version")
; open the file and go through each line. If the line starts with the local computer name already present,
; overwrite that line with new info. Otherwise just write to log.
open (1,"\\aimemsrv05\scripts\logs\antivirus.txt",5)
$x=readline(1)
while @error=0
if $x=@WkSta
writeline(1, '@WkSta, @Date, $virusProd, $virusver, $virusdat, $virusdate, $virusHotFix, $epoagentver')
else
WriteLog("\\aimemsrv05\scripts\logs\Antivirus.txt","@WkSta, @Date, $virusProd, $virusver, $virusdat, $virusdate, $virusHotFix, $epoagentver")
endif
$x=readline(1)
loop
close (1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;----- create text files for use as logs
FUNCTION WriteLog($LogFileName, $LogFileMessage)
$WriteLog = 0
OPEN(1, $LogFileName, 5)
IF WRITELINE(1, $LogFileMessage + @CRLF)=0
$WriteLog = 1
ENDIF
CLOSE(1)
endfunction
|
Top
|
|
|
|
#175731 - 2007-04-26 08:01 PM
Re: replacing items in a text file, the joy of writeline.
[Re: Glenn Barnas]
|
likedark
Fresh Scripter
Registered: 2005-03-23
Posts: 6
|
[quote=Jooel]so, the antivirus info generic udf doesn't work for you?[quote]
No, not at all. I went through that one a few times, nice coding.
|
Top
|
|
|
|
#175732 - 2007-04-26 08:02 PM
Re: replacing items in a text file, the joy of writeline.
[Re: Glenn Barnas]
|
likedark
Fresh Scripter
Registered: 2005-03-23
Posts: 6
|
I'm in agreement regarding INI files and read/write profilestring functions. The data you collect is a database, from which you generate a report - it isn't a report itself.
You can use an INI file with one section per computer, and detail in each section. From that, you can use EnumIni() to extract all the values (or INI2Ary), and the CSV() udf to write the arrays to a CSV file so it can be opened/formatted in Excel.
Just my $0.47
Glenn
I would agree. However, I detest working with ini files almost as much as dealing with requests for things like this when I know an easier way. know what I mean?
|
Top
|
|
|
|
#175736 - 2007-04-26 08:45 PM
Re: replacing items in a text file, the joy of writeline.
[Re: Lonkero]
|
likedark
Fresh Scripter
Registered: 2005-03-23
Posts: 6
|
well, I thought I was onto something with what I had written. Again, this is just something I have "picked up", I don't program for a living.
|
Top
|
|
|
|
#175818 - 2007-04-30 03:49 PM
Re: replacing items in a text file, the joy of writeline.
[Re: Witto]
|
likedark
Fresh Scripter
Registered: 2005-03-23
Posts: 6
|
One INI file per computer? Ugh, 120 files to process through and write another script for. The heck with it, my boss can find another way to do this by himself. Some things just aren't worth doing in Kix. This must be one of them.
|
Top
|
|
|
|
#175820 - 2007-04-30 04:58 PM
Re: replacing items in a text file, the joy of writeline.
[Re: likedark]
|
Howard Bullock
KiX Supporter
Registered: 2000-09-15
Posts: 5809
Loc: Harrisburg, PA USA
|
KiXtart is not the issue. This is basic I/O in windows. You have to deal with file locking and permissions with which ever tool or scripting language you choose.
I use a combination of KiXtart on the clients (logon script) and Perl to pickup and load the database for 40,000 clients. No big deal.
Process definition and proper control is part of the job. You can do it correctly or poorly, but if you do not add the proper logic and controls you are better to not do it at all.
It must be nice to tell your boss to shove it.
Edited by Howard Bullock (2007-04-30 05:00 PM)
|
Top
|
|
|
|
#175827 - 2007-04-30 06:35 PM
Re: replacing items in a text file, the joy of writeline.
[Re: likedark]
|
Witto
MM club member
Registered: 2004-09-29
Posts: 1828
Loc: Belgium
|
Why not an ini file per computer? Create a list of all your computers in your domain.
If NOT @LOGONMODE
Break On
Else
Break Off
EndIf
Dim $RC
$RC=SetOption("Explicit", "On")
$RC=SetOption("NoMacrosInStrings", "On")
$RC=SetOption("NoVarsInStrings", "On")
$RC=SetOption("WrapAtEOL", "On")
Dim $objDomain, $objComputer, $strDomainName
Dim $arrComputers, $strComputer
$strDomainName = "FooCompany"
$objDomain = GetObject("WinNT://"+$strDomainName)
$objDomain.Filter = "Computer",""
For Each $objComputer In $objDomain
If NOT $arrComputers = ""
$arrComputers = $arrComputers + ","
EndIf
$arrComputers = $arrComputers + $objComputer.Name
Next
$arrComputers = Split($arrComputers,",")
For Each $strComputer In $arrComputers
;Do stuff
Next
At the ;Do stuff you can do something per computer, per example see if an ini file exists with that name. If the file exists, you should not check the computer anymore. You can let this script run for some days until (almost) all computers have been checked. After the job is done, enumerate all ini file in your directory. For every file in the list, you can do the same things reading the information in the file, per example, write a report in Excel. I just did this some weeks ago to get a good idea about installed software on our computers.
Edited by Witto (2007-04-30 11:14 PM) Edit Reason: Forgot to declare $objComputer in example
|
Top
|
|
|
|
#175830 - 2007-04-30 08:56 PM
Re: replacing items in a text file, the joy of writeline.
[Re: Witto]
|
likedark
Fresh Scripter
Registered: 2005-03-23
Posts: 6
|
Witto -
Thanks, that makes more sense when described that way. Thank You.
|
Top
|
|
|
|
#175834 - 2007-05-01 01:11 AM
Re: replacing items in a text file, the joy of writeline.
[Re: likedark]
|
Witto
MM club member
Registered: 2004-09-29
Posts: 1828
Loc: Belgium
|
Maybe in your case, one ini file with the structure
[Computer1]
ProductName=aaa
Version=bbb
DATVersion=ccc
DATDate=ddd
HotFixVersions=eee
FrameworkVersion=fff
[Computer2]
ProductName=aaa
Version=bbb
DATVersion=ccc
DATDate=ddd
HotFixVersions=eee
FrameworkVersion=fff
[Computer3]
ProductName=aaa
Version=bbb
DATVersion=ccc
DATDate=ddd
HotFixVersions=eee
FrameworkVersion=fff
Would do What about something like:
;************************************************************************* ; Script Name: FindAVInfo ; Author: likedark ; Date: 1/05/2007 ; Description: Read registry info of every computer in domain about AntiVirus program ;*************************************************************************
;Script Options If NOT @LOGONMODE Break On Else Break Off EndIf Dim $RC $RC=SetOption("Explicit", "On") $RC=SetOption("NoMacrosInStrings", "On") $RC=SetOption("NoVarsInStrings", "On") $RC=SetOption("WrapAtEOL", "On")
;Declare variables Dim $objDomain, $objComputer, $strDomainName Dim $arrComputers, $strComputer $strDomainName = "FooCompany"
Dim $strVIRUSSCAN8600, $strFramework $strVIRUSSCAN8600 = "HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\ePolicy Orchestrator\Application Plugins\VIRUSCAN8600" $strFramework = "HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\TVD\Shared Components\Framework\"
Dim $strProductName, $strVersion, $strDATVersion, $strDATDate, $strHotFixVersions, $strFrameworkVersion
Dim $strINI $strINI = @SCRIPTDIR+"\AntiVirus.ini"
;Create array with all computers in domain $objDomain = GetObject("WinNT://"+$strDomainName) $objDomain.Filter = "Computer","" For Each $objComputer In $objDomain If NOT $arrComputers = "" $arrComputers = $arrComputers + "," EndIf $arrComputers = $arrComputers + $objComputer.Name Next $arrComputers = Split($arrComputers,",")
;Get AV info and write to INI ;For each computer in the array For Each $strComputer In $arrComputers ;Is there a section with the computername? If yes, the computer has been scanned before ;If scanned before, skip If AScan(Split(ReadProfileString($strINI,"",""),CHR(10)), $strComputer) = -1 ;Can the first registry value be read? ;If no, the computer is probably offline ;Or the product is not installed ;If registry cannot be read, skip If NOT ReadValue("\\"+$strComputer+"\"+$strVIRUSSCAN8600, "Product Name") = "" ;Read the registry values and put them in variables $strProductName = ReadValue("\\"+$strComputer+"\"+$strVIRUSSCAN8600, "Product Name") $strVersion = ReadValue("\\"+$strComputer+"\"+$strVIRUSSCAN8600, "Version") $strDATVersion = ReadValue("\\"+$strComputer+"\"+$strVIRUSSCAN8600, "DATVersion") $strDATDate = ReadValue("\\"+$strComputer+"\"+$strVIRUSSCAN8600, "DATDate") $strHotFixVersions = ReadValue("\\"+$strComputer+"\"+$strVIRUSSCAN8600, "HotFixVersions") $strFrameworkVersion = ReadValue("\\"+$strComputer+"\"+$strFramework , "Version") ;Write values to INI file $RC = WriteProfileString($strINI, $strComputer, "ProductName" , $strProductName) $RC = WriteProfileString($strINI, $strComputer, "Version" , $strVersion) $RC = WriteProfileString($strINI, $strComputer, "DATVersion" , $strDATVersion) $RC = WriteProfileString($strINI, $strComputer, "DATDate" , $strDATDate) $RC = WriteProfileString($strINI, $strComputer, "HotFixVersions" , $strHotFixVersions) $RC = WriteProfileString($strINI, $strComputer, "FrameworkVersion", $strFrameworkVersion) EndIf EndIf Next |
Some more on If AScan(Split(ReadProfileString($strINI,"",""),Chr(10)), $strComputer) = -1
ReadProfileString($strINI,"","") gives all sections in one string, but divided by the ASCII character 10
Split(ReadProfileString($strINI,"",""),Chr(10)) gives an array with all section names
AScan(Split(ReadProfileString($strINI,"",""),Chr(10)), $strComputer) tries to find $strComputer in the array and returns the position starting from 0 if not in array, -1 is returned
If AScan(Split(ReadProfileString($strINI,"",""),Chr(10)), $strComputer) = -1 If AScan returns -1, it was not found, there is no section with that computername
Maybe create a batch file where you loop this script. After a few days, you should have info about (almost) all computers
The script is not tested. It is just as is. Please revise the code yourself. The environment to test in is yours, not mine!!!
Edited by Witto (2007-05-01 10:42 AM) Edit Reason: Revised conditions
|
Top
|
|
|
|
Moderator: Jochen, Allen, Radimus, Glenn Barnas, ShaneEP, Ruud van Velsen, Arend_, Mart
|
0 registered
and 248 anonymous users online.
|
|
|