VBS zum Ermitteln der neuesten Datei an einem Verzeichnis abhängig von der Extension

'Ermittlung der neuesten Datei mit Extension sExt im Pfad sPfath
'
'
'Das Skript durchsucht den gewünschten Pfad "sPath" nach Dateien mit der Extension "sExt"
'und gibt dann den kompletten Pfad mit Dateinamen von der neuesten Dateu aus sNewestFile

'Variablen für Pfad und Extension
'sPfad ohne abschließenden Backslash angeben
'sExt ohne Punkt davor angeben

sPath = "C:\Windows\System32"
sExt = "dll"


'Filesystemobject genereieren
Set oFSO = CreateObject("Scripting.FileSystemObject")


'Funtkion GetNewestFile ausführen
sNewestFile = GetNewestFile(sPath)


'Ausgabe der neuesten Datei
'Wenn keine Datei ermittelt werden konnte, dann auch melden

If sNewestFile <> "" Then
	WScript.Echo "Die neuste Datei mit der Extension " & sExt & " ist " & sNewestFile
Else
   	WScript.Echo "Verzeichnis ist leer"
End If


'Funktion NewestFile

Function GetNewestFile(ByVal sPath)

   sNewestFile = Null   ' initialisiere Wert

   Set oFSO = CreateObject("Scripting.FileSystemObject")
   Set oFolder = oFSO.GetFolder(sPath)
   Set oFiles = oFolder.Files

 ' Finde die neueste Datei unter allen anderen Dateien
For Each oFile In oFiles

	if lcase(oFSO.GetExtensionName(ofile)) = sExt then 'selektiere Dateien mit der gewünschten Endung aus
	On Error Resume Next

     		If IsNull(sNewestFile) Then
       			sNewestFile = oFile.Path
       			dPrevDate = oFile.DateLastModified
     			Elseif dPrevDate < oFile.DateLastModified Then
       			sNewestFile = oFile.Path
     		End If

	end if

     On Error Goto 0
   Next

   If IsNull(sNewestFile) Then sNewestFile = ""

   GetNewestFile = sNewestFile
End Function


Konvertierung VBE zu VBS

Problem
Wer kennt das nicht. Da hat sich ein gutes VB-Skript ausgedacht und um das ganze abzusichern, hat man das in eine VBE umgewandelt um das Ganze zu verschlüsseln. Irgendwie ist einem dann die originale Datei abhanden gekommen und man hat nur noch die kryptische VBE-Datei...wie jetzt an die Daten herankommen?

Lösung
Es gibt tatsächlich ein Skript, dass eine VBE-Datei wieder in eine VBS-Datei umwandelt. Das Originalskript gibt den unverschlüsselten Inhalt als MsgBox zurück. Ich habe mir erlaubt das Ganze etwas zu erweitern und lasse die entschlüsselte Datei als xxx_encrypted.txt im gleichen Verzeichnis wie die VBE-Datei abspeichern, wobei xxx für den originalen Dateinamen steht (z.B. test.vbe -> test.vbe_decrypted.txt). Hier nun das Skript...dieses einfach als decrypt_vbs.vbs speichern und die gewünschte VBE-Datei entweder per Drag&Drop fallen lassen oder per integrierter Browse-Funktion suchen.

option explicit
Dim oArgs, NomFichier
'Optional argument : the encoded filename
NomFichier=""
Set oArgs = WScript.Arguments
Select Case oArgs.Count
Case 0 'No Arg, popup a dialog box to choose the file
	NomFichier=BrowseForFolder("Choose an encoded file", &H4031, &H0011)
Case 1
	If Instr(oArgs(0),"?")=0 Then '-? ou /? => aide
		NomFichier=oArgs(0)
	End If
Case Else
	WScript.Echo "Too many parameters"
End Select
Set oArgs = Nothing

If NomFichier<>"" Then
	Dim fso
	Set fso=WScript.CreateObject("Scripting.FileSystemObject")
	If fso.FileExists(NomFichier) Then
		Dim fic,contenu,ofile
		Set fic = fso.OpenTextFile(NomFichier, 1)
		Contenu=fic.readAll
		fic.close
		Set fic=Nothing

		Const TagInit="#@~^" '#@~^awQAAA==
		Const TagFin="==^#~@" '& chr(0)
		Dim DebutCode, FinCode
		Do
			FinCode=0
			DebutCode=Instr(Contenu,TagInit)
			If DebutCode>0 Then
				If (Instr(DebutCode,Contenu,"==")-DebutCode)=10 Then 'If "==" follows the tag
					FinCode=Instr(DebutCode,Contenu,TagFin)
					If FinCode>0 Then
						Contenu=Left(Contenu,DebutCode-1) & _
						Decode(Mid(Contenu,DebutCode+12,FinCode-DebutCode-12-6)) & _
						Mid(Contenu,FinCode+6)
					End If
				End If
			End If
		Loop Until FinCode=0
		WScript.Echo contenu
		Set oFile = fso.OpenTextFile(NomFichier & "_decrypted.txt",2,True)
		oFile.WriteLine contenu
		oFile.close
	Else
		WScript.Echo Nomfichier & " not found"
	End If
	Set fso=Nothing
Else
	WScript.Echo "Please give a filename"
	WScript.Echo "Usage : " & wscript.fullname  & " " & WScript.ScriptFullName & " "
End If

Function Decode(Chaine)
	Dim se,i,c,j,index,ChaineTemp
	Dim tDecode(127)
	Const Combinaison="1231232332321323132311233213233211323231311231321323112331123132"

	Set se=WSCript.CreateObject("Scripting.Encoder")
	For i=9 to 127
		tDecode(i)="JLA"
	Next
	For i=9 to 127
		ChaineTemp=Mid(se.EncodeScriptFile(".vbs",string(3,i),0,""),13,3)
		For j=1 to 3
			c=Asc(Mid(ChaineTemp,j,1))
			tDecode(c)=Left(tDecode(c),j-1) & chr(i) & Mid(tDecode(c),j+1)
		Next
	Next
	'Next line we correct a bug, otherwise a ")" could be decoded to a ">"
	tDecode(42)=Left(tDecode(42),1) & ")" & Right(tDecode(42),1)
	Set se=Nothing

	Chaine=Replace(Replace(Chaine,"@&",chr(10)),"@#",chr(13))
	Chaine=Replace(Replace(Chaine,"@*",">"),"@!","<")
	Chaine=Replace(Chaine,"@$","@")
	index=-1
	For i=1 to Len(Chaine)
		c=asc(Mid(Chaine,i,1))
		If c<128 Then index=index+1
		If (c=9) or ((c>31) and (c<128)) Then
			If (c<>60) and (c<>62) and (c<>64) Then
				Chaine=Left(Chaine,i-1) & Mid(tDecode(c),Mid(Combinaison,(index mod 64)+1,1),1) & Mid(Chaine,i+1)
			End If
		End If
	Next
	Decode=Chaine
End Function

Function BrowseForFolder(ByVal pstrPrompt, ByVal pintBrowseType, ByVal pintLocation)
	Dim ShellObject, pstrTempFolder, x
	Set ShellObject=WScript.CreateObject("Shell.Application")
	On Error Resume Next
	Set pstrTempFolder=ShellObject.BrowseForFolder(&H0,pstrPrompt,pintBrowseType,pintLocation)
	BrowseForFolder=pstrTempFolder.ParentFolder.ParseName(pstrTempFolder.Title).Path
	If Err.Number<>0 Then BrowseForFolder=""
	Set pstrTempFolder=Nothing
	Set ShellObject=Nothing
End Function



Quelle: Decode all files encoded (original version)

VBS / WSH Pseudo Timestamp erstellen

Diese Funktion erstellt einen Pseudotimestamp , ist ganz gut wenn man Logfiles oder ähnliches schreiben möchte

Function PTimestamp()
Dim JAH,MON,SEK,STU,TAG,MIN
JAH = Year(Now)
If Month(Now) < 10 then
	mon = "0" & Month(Now)
Else
	mon = Month(Now)
End If
If Day(Now) < 10 then
	TAG = "0" & Day(Now)
Else
	TAG = Day(Now)
End If
If Hour(Now) < 10 then
	STU = "0" & Hour(Now)
Else
	STU = Hour(Now)
End If
If Minute(now) < 10 then
	MIN = "0" & Minute(now)
Else
	MIN = Minute(now)
End If
If Second(Now) < 10 then
	SEK = "0" & Second(Now)
Else
	SEK = Second(Now)
End If
PTimestamp = TAG & MON & JAH & STU & MIN & SEK 
End Function


Die Funktion kann dann z.B. so aufgerufen werden.


MsgBox "TEST_" & PTimestamp()

Inputbox an bestimmter Position anzeigen

Problem
Man möchte eine Inputbox an eine bestimmte Position am Bildschirm anzeigen lassen um z.B. eine andere Anwendung nicht zu verdecken.

Lösung

InputBox ( "title", "Prompt" [, "Default" [, "password char" [, Width, Height [, Left, Top [, TimeOut]]]]] )

Parameter

title = Der Titel der InputBox
prompt = Ein Beschreibungstext für den Nutzer, damit er weiß, was er eingeben soll.
password char [optional] = Das Zeichen, mit dem alle eingegebenen Zeichen maskiert werden. Wenn du willst, dass das echte Zeichen angezeigt werden soll, dann übergebe einen leeren String ("") (Standardwert) oder ein Leerzeichen als erstes Zeichen. Wenn du einen mehrere Zeichen langen String angibst, wird nur das erste Zeichen zum Maskieren genutzt. Die weiteren Zeichen haben eine besondere Bedutung. Siehe dazu die Bemerkungen.
width [optional] = Die Breite des Fensters. Wenn die Breite definiert wird, muss auch die Höhe angegeben werden. Gib -1 an, um die Standardbreite zu verwenden.
height [optional] =Die Höhe des Fensters. Wenn die Höhe definiert wird, muss auch die Breite angegeben werden. Gib -1 an, um die Standardhöhe zu verwenden
left [optional] = Horizontale Position der InputBox. Standardmäßig wird die Box zentriert. Wenn angegeben, muss auch die vertikale Position bestimmt werden.
top [optional] = Vertikale Position der InputBox. Standardmäßig wird die Box zentriert. Wenn angegeben, muss auch die horizontale Position bestimmt werden.
timeout [optional] = Wie viele Sekunden soll gewartet werden, bis die InputBox automatisch über den Cancel-Button verlassen wird.

Quelle autoit.de: InputBox - Referenz

Fehlerbehandlung in VBS/WSH

Problem :

Es soll überprüft werden ob eine Aufgabe eines VBS/WSH Skriptes erfolgreich durchgeführt wurde.
Normalerweise stopt die Ausführen an jedem Fehler , ohne das dieser auswertbar bist.
In einigen Fälle wird aber ein Rückgabewert erforderlich diesen erreicht man indem man am Anfang
des Skriptes die Zeile

On Error Resume Next


einfügt. Der Status des Vorgangs kann dann mit

if err.number<>0 then
wscript.echo err.number, err.description
err.Clear
end if


überprüft werden. Wenn die Fehlerbehandlung wieder von VBS/WSH erledigt werden soll kann man das mit der Zeile

On Error Goto 0


erreichen

Sprache des Installierten Betriebssystem ermitteln

Problem :

Man muss herausfinden auf welcher Sprache das Betriebssystem läuft

Lösung :

Diese Funktion ermittelt die gewünschte Information über WMI

Benötigte Deklarationen :

Dim ObjWMI : Set ObjWMI = GetObject("winmgmts:\\.\root\CIMV2")
PUBLIC LANGID
PUBLIC LANGLE


Funktion :

Function GetLanguageID()
DIM colItems : Set colItems = ObjWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem")
For Each objItem in colitems
LANGID = objItem.Locale
Next
Select Case LANGID
Case "0409" : LANGLE = "EN" : MsgBox "Language : English (American)"'
Case "0407" : LANGLE = "DE" : MsgBox "Language : Deutsch (Germany)"
Case "040c" : LANGLE = "FR" : MsgBox "Language : French (Standard)"
Case "0c0a" : LANGLE = "ES" : MsgBox "Language : Spain (Modern Sort)"
Case "040a" : LANGLE = "ES" : MsgBox "Language : Spain (Traditional Sort)"
Case "0410" : LANGLE = "IT" : MsgBox "Language : Italian (Standard)"
End Select
End Function


Kann beliebig mit den Codes von MS erweitert werden : Language IDs Microsoft
“Das einzig sichere System müsste ausgeschaltet, in einem versiegelten und von Stahlbeton ummantelten Raum und von bewaffneten Schutztruppen umstellt sein.”
Gene Spafford (Sicherheitsexperte)