# [VBS] [windows2000] inhalte via if block ausschließen. - dringend :(



## micha (23. Juni 2003)

ich schreibe gerade für meine firma ein programm, das aus dem netzwerk sich die computer raussucht und deren registry nach den installierten programmen scannt. es sollen in einer textdatei alle programme aufgeführt werden, die vom standard abweichen. der standard ist hierbei ein gescannter pc, der vor dem scan via image neu aufgesetzt wurde.

nun meine frage: 

wie kann ich über eine IF anweisung den inhalt der textdatei dahingehend beeinflussen, dass mein standard NICHT auftaucht. ich will ja nur das "delta" haben.


```
'Wenn der Key die Referenzsoftware beinhaltet, dann soll er nicht auslesen.
          'Es wird also nur das vom Standard abweichende abgefragt
          'swname(x) beinhaltet den string aus der registry -> name des progs
if  not swname(x) = "AddressBook" or "Adobe Acrobat 5.0" or "ATI Display Driver" or "WinZip" then
          'If keyname = sw name then use
          swname(x)= objSubKey.Name
          else 
            if x > -1 then
              x=x-1
            end if
          end if
```

wer kann mir dabei helfen.

btw. werde ich sicher noch öfter hier fragen, weil ich eigentlich garkein vbs code. mir wurde das hingelegt mit den worten "machen sie mal, wenn sie das nicht können, dann werden sie es lernen" 
hilfe :/


----------



## micha (23. Juni 2003)

habe nochmal weiter rumprobiert ...
habe mal die if anweisung "umgedreht"
nun funktioniert es :/

logisch ist das auf jeden fall nicht ...


```
'Wenn der Key die Referenzsoftware beinhaltet, dann soll er nicht auslesen.
          'Es wird also nur das vom Standard abweichende abgefragt
          if  swname(x) = "AddressBook" or "Adobe Acrobat 5.0" or "ATI Display Driver" or "WinZip" then
          'If keyname = sw name then use
          if x > -1 then
              x=x-1
            end if
          else 
            swname(x)= objSubKey.Name
          end if
```

naja, seid gespannt auf weitere fragen.
insbesondere zu einem "LDPA://" objekt  <- ???


----------



## Daniel Toplak (23. Juni 2003)

Also ich würde das Ganze etwas anders angehen:
Du hast einen Referenz-Rechner der dir ja als Muster dienen soll. Die Einträge legst du in einem Array ab und sortierst es. Dann hast du da die vielen Anderen Rechner in deinem Netz, deren Einträge legst du jeweils auch in ein Array ab (1 Array pro Rechner) und sortierst es.
Dann vergleichst du die beiden Arrays miteinander und hast den Unterschied.



> "machen sie mal, wenn sie das nicht können, dann werden sie es lernen"


Woher kenn ich das nur.  

Gruss Homer


----------



## micha (24. Juni 2003)

sodele, nun geht es schonmal mit einem rechner. 
ich bin so frei und poste mal den source hier.
aber zuerst zu dieser stelle:


```
if  swname(x) = "AddressBook" or "Adobe Acrobat 5.0" or "ATI Display Driver" ...usw... or "WinZip" then
            if x > -1 then
              x=x-1
            end if
          else
```

Diese Stelle gefällt meinem Cheffe garnicht. Das sind nämlich ca 50 Programme. Er meint, es wäre besser, wenn das ganze über eine Textdatei laufen würde.

Also in der Textdatei steht drin:
Addressbook
Adobe Acrobat 5.0 
...

diese referenz.txt solle ich auslesen am anfang und dann diese einträge rausnehmen aus dem resultat.

ich poste nun mal meinen code.


```
Sub TrennLinie
 oDatei.WriteLine VbCr
 oDatei.WriteLine "-------------------------------------------------------------------"
End Sub

Sub ZweiLeereZeilen
 oDatei.WriteLine VbCr
End Sub 

Sub ArraySorter()
    Dim row, j
    Dim StartingKeyValue, NewKeyValue, swap_pos
    For row = 0 To x - 1
        StartingKeyValue = swname ( row )
        NewKeyValue = swname ( row )
        swap_pos = row          
        For j = row + 1 to x
            If ucase(swname ( j )) < ucase(NewKeyValue) Then
                swap_pos = j
               NewKeyValue = swname ( j )
           End If
        Next        
        If swap_pos <> row Then
            swname ( swap_pos ) = StartingKeyValue
            swname ( row ) = NewKeyValue
        End If  
    Next
End Sub

Dim Antwort
dim client
' PCs zum testenP99X1147 P0181036

Dim i : i=0
Dim Rechner

i=1

Antwort = MsgBox ("Es ist/sind " &i& " Computer zu scannen"& VbCr & VbCr _
&"Das Script scannt die lokalen Gruppen auf zusätzliche Software" & VbCr _
&"und legt eine Auswertungsdatei auf C:\scan.TXT an."& VbCr & VbCr _
&" ausführen?", 4,"Frage")

If Antwort = 7 then 
Wscript.Quit
End if

dim oFs
  Dim oDatei
  Dim TxtDatei : TxtDatei = "c:\scan.txt"
  Dim computer
  Dim gruppe
  Dim Mitglieder
  Dim Konto
  Dim GruppenName
  Dim PC
  
    On Error Resume Next
    
  set oFs = CreateObject("Scripting.FileSystemObject")
  set oDatei = ofs.CreateTextFile(TxtDatei, True)
  
i = 0

    On Error resume next

set objRegObj = WScript.CreateObject("RegObj.Registry")
Dim objRemoteRegistry
Dim swname(200)
Dim objSubKey 
Dim objRegRootKey
strcomputername=""
'Do While not strcomputername=""

strcomputername=inputbox("Bitte PC Namen (IP Adresse) eingeben oder Cancel zum beenden klicken.","PC Name","")
  if strcomputername <> "" then
  
     SWkey="\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
     IEKey="\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer"
  
    Set objRemoteRegistry = objRegObj.RemoteRegistry(strcomputername)
    Set objRegRootKey = objRemoteRegistry.RegKeyFromString(SWkey)
  
    if err then 
      wscript.echo strcomputername&" antwortet nicht."
    else
    
      x=0
      
      For Each objSubKey In objRegRootKey.SubKeys
        mypos=instr(objSubKey.Name,"{")
        if mypos <> 0 then
          set subreg=objRemoteRegistry.RegKeyFromString(SWkey&"\"&objSubKey.Name)
          swname(x)=subreg.values("displayname").value                
          if err then 
            if x > -1 then
              x=x-1
            end if
            err.clear
          end if
        else
        
          if  swname(x) = "AddressBook" or "WinZip" then 'hier steht natuerlich noch viel mehr drin, aber das is geheim ;)
            if x > -1 then
              x=x-1
            end if
          else 
            swname(x)= objSubKey.Name
          end if
        end if
        x=x+1
      Next 
     
      Set objRegRootKey = objRemoteRegistry.RegKeyFromString(IEkey)
      if err then
        swname(x)="No Internet Explorer"
        err.clear
      else
        swname(x)="Internet Explorer "&objRegRootKey.values("Version").value
      end if
      strret=""
      x=x+1

      call ArraySorter()

      for y = 1 to x-1
        modx=y mod 1 'alt: 3
        if modx=0 then
          strRet = strRet &"<"& swname(y) &">"&vbcrlf
        else
          strRet = strRet &"<"& swname(y) &">"&vbtab
        end if 
      next
      strret="Zusätzlich installierte Software auf "&strcomputername&vbcrlf&vbcrlf&strret

      wscript.echo strret

      myvar=msgbox("Speichern als:"& TxtDatei&"?",4)
      if myvar=6 then 
        for y = 1 to x-1
          oDatei.WriteLine strcomputername &vbtab& swname(y)
        next  
         trennlinie()
      end if
    end if
  end if 
  
'loop

set objRemoteRegistry = nothing
set objRegRootKey = nothing
set subreg = nothing
set fsomain = nothing
set swonpcs = nothing

 oDatei.Close
MsgBox "Scanvorgang abgeschlossen."
```

Diese Datei Scannt nun den Rechner ab und schreibt das ergebnis (also die differez) in die textdatei.

meine fragen:
1) wie bringe ich das prog dazu auf dem einfachsten wege die auszuschließenden einträge aus einer textdatei auszulesen
2) wie kann ich zusätzlich zum key ....\uninstall\ auch noch den key: \HKEY_LOCAL_MACHINE\SOFTWARE\ mit einbeziehen. dadurch würde ich nochmal mehr progs finden ,die installed sind, aber net im uninstall geregged.


wenn ich diese probleme gelöst habe - mit eurer hilfe - dann kommt der nächste schritt: das von einem PC auf ein netzwerk ausweiten :/

danke für die hilfe schonmal, rettet mir den hals !


----------



## micha (25. Juni 2003)

zu 1)
habe mal im forum weitergesucht und diesen code gefunden:


```
Dim open_txt As String 
open_txt = InputBox("Datein pfad:") 
Open " & open_txt " For Input As #1 'geändert
Do 
Line Input #1, zeile 
Loop Until EOF(1) 
Textbot.Text = Textbot.Text & zeile & vbCrLF 'geändert
Close #1 
End Sub
```

klingt meiner meinung nach plausibel und fehlerfrei. wenn ich das dann ausführen mag, sagt er mir: 

"ANWEISUNGSENDE ERWARTET" -> genau in der erten zeile gleich (íst bei mir dann zwar zeile 73, aber meiner meinung nach unerheblich)

liegt das daran, dass ich VBS benutze ?
Wenn ich das AS STRING wegmache, kommt er bis in zeile 3.
da sagt er dann, dass er das "input" net erkennt....


----------

