Aug 22
programming / scripting

Wir mussten bei uns im Unternehmen eine ordentliche Übersicht über die Gruppenzugehörigkeiten aus dem AD auslesen. Da wir auf die schnelle kein passendes Tool finden konnten, haben wir dies kurzerhand selber umgesetzt. Das vbs-Tool liest alle Gruppen aus einer OU aus und listet diese mitsamt den Usern auf. Hat die Gruppe weitere Gruppen, werden auch diese aufgelöst und angezeigt. Das ganze kann im HTML mit einer Toggle-Funktion aufgeschachtelt werden.

Die Anzeige im HTML sieht folgendermassen aus:

Groupname Description Managed by Notes Members
EUR_TEST   No user account is assigned to manage this group.   Banzer Alessandro, ( EUR_RO_SIT_Mitarbeiter:
Banzer Alessandro, ( EUR_RO_SIT_Abteilungsleiter:
Boss-Banzer, ( EUR_RO_SIT_Manager:
BigBoss-Banzer,
)
,
)
, Another User,
)
, Another User,

Die einzelnen Gruppenbezeichnungen (EUR_RO_SIT_Mitarbeiter, etc.) sind klickbar und können auf- bzw. zugeklickt werden. Somit sieht man auch aus welcher Gruppe jemand erbt. Hier ein Beispiel.

Der Programmcode findet sich samt dem Beispiel hier.

Wichtig ist, dass die entsprechende OU im vbs in der Zeile 24 verändert wird.

strQuery = "<;(objectClass=group);distinguishedName;subtree">LDAP://OU=TEST,OU=Groups,OU=Produktiv,DC=europe,DC=admins,DC=li>;(objectClass=group);distinguishedName;subtree"

Dies ist der Ausgangspunkt für die Suche der Gruppen.

Sollten Fragen oder Unklarheiten mit dem Script auftauchen, so bitte direkt via Kommentar melden.

Posted by Alessandro Banzer

Twitter Facebook
Aug 17
programming / scripting

Nach langer Zeit habe ich nun endlich wieder einmal etwas nützliches um Euch zu präsentieren. Nach einem Datadownload vom SAP ins Excel sind am Ende einer Zahl jeweils zwei Leerzeichen. Auf Grund dieser Leerzeichen wird die Zahl nicht als Zahl, sondern als Text erkannt. Da wir dies jedoch für einen SVERWEIS benötigten, muss die Zahl auch wirklich eine Zahl sein. Im ganzen handelt es sich jedoch um über 10'000 Datensätzen, so dass dies nicht von Hand gemacht werden kann. Aus diesem Grund habe ich dazu ein kleines Visual Basic Script verwendet:

  1. Sub Clean()
  2.  
  3.     Dim c As Range
  4.     For Each c In Range("A1:A100")
  5.         c.Value = Application.WorksheetFunction.Clean(Trim(c.Value))
  6.     Next c
  7.    
  8. End Sub

In der Zeile 4 muss die Range der "falschen" Zahlen angegeben werden. Das Script entfernt folglich alle Leerzeichen.

Wichtig zu Wissen:

Ist das Feld nicht eine reine Zahl, sondern z.B. eine Artikelnummer die im Format:

ABC 0010

ist, dann kann dieses Script auch angewendet werden. Es entfernt nur die Leerzeichen am Ende der Zelle und nicht diese dazwischen.

Bei Fragen oder Unklarheiten einfach diesen Beitrag kommentieren.

Posted by Alessandro Banzer

Twitter Facebook
Apr 7
programming / scripting

Heute hatten wir das Problem, dass ein User in seinem Excel-Dokument über 200 Diagramme hatte. Nach einer bestimmten Anzahl an Diagrammen hatte Excel ein Problem und meldete "Es können keine weiteren neuen Schriftarten dieser Arbeitsmappe hinzugefügt werden". Nun hatten wir die Möglichkeit, bei jedem Diagramm die automatische Skalierung von Hand zu entfernen. Da dies aber zu Aufwändig ist/war, haben wir dazu ein Marko verwendet. Um die Skalierung von Hand zu entfernen, habe ich hier das Vorgehen: "Diagrammfläche formatieren > Font > "Automatisch skaklieren" deaktivieren". Vorallem bei grossen Dokumenten mit vielen Diagrammen empfiehlt es sich, dies über ein Makro zu tun.

  1. Public Sub TurnOffAutoScaleFont()
  2.         Dim wksWorksheet As Worksheet
  3.         Dim objChartObject As ChartObject
  4.         Dim objChart As Chart
  5.         Dim intCount As Integer
  6.         For Each wksWorksheet In ActiveWorkbook.Worksheets
  7.                 For Each objChartObject In wksWorksheet.ChartObjects
  8.                         intCount = intCount + 1
  9.                         objChartObject.Chart.ChartArea.AutoScaleFont = False
  10.                 Next objChartObject
  11.         Next
  12.         For Each objChart In ActiveWorkbook.Charts
  13.                 objChart.ChartArea.AutoScaleFont = False
  14.                 intCount = intCount + 1
  15.         Next
  16.         MsgBox CStr(intCount) & " Diagramme geändert."
  17. End Sub

Posted by Alessandro Banzer

Twitter Facebook
Mar 16
programming / scripting

Vorhin habe ich ein Script gepostet, mit welchem man User Objekte auslesen kann. Das selbe habe ich nun auch noch für die Computer Objekte. Hier lese ich jedoch nur den Namen, Beschreibung, Last Logon, OS, OS Version, OS Hotfix und OS Servicepack aus. Weitere Informationen könnten natürlich ebenfalls ausgelsen werden, sind für mich jedoch nicht relevant. Auch in diesem Beispiel arbeite ich wieder mit einer Text Datei, die mir die entsprechende OU angibt. Der Inhalt der Text Datei sieht folgendermassen aus:

OU=Clients,OU=EUROPE,OU=Computers,OU=Produktiv,DC=admins,DC=li

Anbei nun das VBS Script:

  1. '=================================================================  
  2. '  
  3. ' NAME: Get_All_Computers.vbs  
  4. ' AUTHOR: Alessandro Banzer  
  5. ' DATE  : 16.03.2011  
  6. '  
  7. '=================================================================  
  8.  
  9. On Error Resume Next
  10.  
  11. Set objFSO = CreateObject("Scripting.FileSystemObject")
  12. Set objExcel = CreateObject("Excel.Application")
  13.  
  14. objExcel.Visible = True
  15. objExcel.Workbooks.Add
  16.  
  17. Set objWorksheet = objWorkbook.Worksheets(3)
  18. Set colSheets = objWorkbook.Sheets
  19.  
  20.  
  21. ' Textfile für OU Scan - Textfile muss angepasst werden
  22. Dim arrFileLines()
  23. i = 0
  24. Set objFile = objFSO.OpenTextFile("ou_computer.txt", 1)
  25.  
  26. Do Until objFile.AtEndOfStream
  27.      Redim Preserve arrFileLines(i)
  28.      arrFileLines(i) = objFile.ReadLine
  29. i = i + 1
  30. Loop
  31. objFile.Close
  32.  
  33. x = 2
  34. oucount = 1
  35.  
  36. For l = Ubound(arrFileLines) to LBound(arrFileLines) Step -1
  37.        
  38.         Set objWorksheet = objWorkbook.Worksheets(1)
  39.         objWorksheet.Activate
  40.  
  41.         objExcel.ActiveSheet.Cells(1, 1).Value = "Name"
  42.         objExcel.ActiveSheet.Cells(1, 2).Value = "Description"
  43.         objExcel.ActiveSheet.Cells(1, 3).Value = "LastLogon"
  44.         objExcel.ActiveSheet.Cells(1, 4).Value = "Operating System"
  45.         objExcel.ActiveSheet.Cells(1, 5).Value = "OS Version"
  46.         objExcel.ActiveSheet.Cells(1, 6).Value = "OS Hotfix"
  47.         objExcel.ActiveSheet.Cells(1, 7).Value = "OS Servicepack"
  48.        
  49.         Const ADS_UF_ACCOUNTDISABLE = 2
  50.         Const ADS_UF_PASSWORD_EXPIRED = &h800000
  51.         Const ADS_ACETYPE_ACCESS_DENIED_OBJECT = &H6
  52.         Const CHANGE_PASSWORD_GUID = "{ab721a53-1e2f-11d0-9819-00aa0040529b}"
  53.  
  54.         Set objHash = CreateObject("Scripting.Dictionary")
  55.  
  56.         objHash.Add "ADS_UF_DONT_EXPIRE_PASSWD", &h10000
  57.  
  58.         Set objConnection = CreateObject("ADODB.Connection")
  59.         objConnection.Open "Provider=ADsDSOObject;"
  60.         Set objCommand = CreateObject("ADODB.Command")
  61.         objCommand.ActiveConnection = objConnection
  62.  
  63.         objCommand.Properties("Page Size") = 1000
  64.         objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
  65.  
  66. objCommand.CommandText = _
  67.     "<GC://" & arrFileLines(l) & ">;(objectCategory=Computer)" & _
  68.         ";userAccountControl,distinguishedName,cn;subtree"
  69.  
  70. Set objRecordSet = objCommand.Execute
  71.         Do Until objRecordset.EOF
  72.        
  73.                 intUserAccountControl = objRecordset.Fields("userAccountControl")
  74.            
  75.                 If NOT intUserAccountControl AND ADS_UF_ACCOUNTDISABLE Then
  76.            
  77.                 For Each Key In objHash.Keys           
  78.                 set objcomp = getObject ("LDAP://" & objRecordset.Fields("distinguishedName").value)
  79.             lastlogon = objcomp.LastLogin
  80.                 dtmValue = objcomp.description
  81.         cnName = objcomp.cn
  82.         dnName = objRecordset.Fields("distinguishedName").value
  83.                
  84.         dnnamesumcount = Len(dnname)
  85.         dnnamecount = InStr(1,dnname,"OU")
  86.         cut = dnnamesumcount - dnnamecount
  87.         dncut = Right(dnname, cut)             
  88.                
  89.                 objExcel.ActiveSheet.Cells(x, 1).Value = cnName
  90.                 objExcel.ActiveSheet.Cells(x, 2).Value = dtmValue
  91.                 objExcel.ActiveSheet.Cells(x, 3).Value = lastlogon
  92.                 objExcel.ActiveSheet.Cells(x, 4).Value = objcomp.operatingSystem
  93.                 objExcel.ActiveSheet.Cells(x, 5).Value = objcomp.operatingSystemVersion
  94.                 objExcel.ActiveSheet.Cells(x, 6).Value = objcomp.operatingSystemHotfix
  95.                 objExcel.ActiveSheet.Cells(x, 7).Value = objcomp.operatingSystemServicePack
  96.        
  97.                 x = x + 1              
  98.          
  99.             Next
  100.         End If
  101.          objRecordset.MoveNext
  102.         Loop
  103.  
  104. objConnection.Close
  105. oucount = oucount + 1
  106.  
  107. Next
  108. Set objRange = objWorksheet.UsedRange
  109. objRange.EntireColumn.Autofit()
  110. objExcel.close
  111. wscript.echo "done !"

Bei Fragen oder Unklarheiten, oder sollte eine Verbesserung anstehen, so bitte melden.

Posted by Alessandro Banzer

Twitter Facebook
Mar 16
programming / scripting

Ich hab hier ein kleines VBS Script geschrieben, welches alle User Objekte aus einer entsprechenden OU ausliest. Im selben Verzeichnis, wo das VBS Script liegt, muss auch eine Datei ou.txt erstellt werden. In dieser Text Datei ist die entsprechende OU zu definieren, die ausgelesen wird. Inhalt meiner OU.txt ist folgender:

OU=Standard Users,OU=EUROPE,OU=Users,OU=Produktiv,DC=admins,DC=li

Das Script schreibt die Informationen zu den User Objekten in eine Excel Instanz, welche zuerst geöffnet wird.

  1. '=================================================================  
  2. '  
  3. ' NAME: Get_All_Users.vbs  
  4. ' AUTHOR: Alessandro Banzer  
  5. ' DATE  : 16.03.2011  
  6. '  
  7. '=================================================================  
  8.  
  9. On Error Resume Next
  10.  
  11. Set objFSO = CreateObject("Scripting.FileSystemObject")
  12. Set objExcel = CreateObject("Excel.Application")
  13.  
  14. objExcel.Visible = True
  15. objExcel.Workbooks.Add
  16.  
  17. Set objWorksheet = objWorkbook.Worksheets(3)
  18. Set colSheets = objWorkbook.Sheets
  19.  
  20. ' Textfile für OU Scan - Textfile muss angepasst werden
  21. Dim arrFileLines()
  22. i = 0
  23. Set objFile = objFSO.OpenTextFile("ou.txt", 1)
  24.  
  25. Do Until objFile.AtEndOfStream
  26.      Redim Preserve arrFileLines(i)
  27.      arrFileLines(i) = objFile.ReadLine
  28. i = i + 1
  29. Loop
  30. objFile.Close
  31.  
  32. x = 2
  33. oucount = 1
  34. mustchangepw = 1
  35. ischangedpw = 1
  36.  
  37. For l = Ubound(arrFileLines) to LBound(arrFileLines) Step -1
  38.        
  39.         Set objWorksheet = objWorkbook.Worksheets(1)
  40.         objWorksheet.Activate
  41.  
  42.         objExcel.ActiveSheet.Cells(1, 1).Value = "Full Name"
  43.         objExcel.ActiveSheet.Cells(1, 2).Value = "Description"
  44.         objExcel.ActiveSheet.Cells(1, 3).Value = "Office"
  45.         objExcel.ActiveSheet.Cells(1, 4).Value = "Telephone number"
  46.         objExcel.ActiveSheet.Cells(1, 5).Value = "Mobile"
  47.         objExcel.ActiveSheet.Cells(1, 6).Value = "Fax"
  48.         objExcel.ActiveSheet.Cells(1, 7).Value = "Email"
  49.         objExcel.ActiveSheet.Cells(1, 8 ).Value = "Web Page"
  50.         objExcel.ActiveSheet.Cells(1, 9).Value = "Street"
  51.         objExcel.ActiveSheet.Cells(1, 10).Value = "City"
  52.         objExcel.ActiveSheet.Cells(1, 11).Value = "Postal Code"
  53.         objExcel.ActiveSheet.Cells(1, 12).Value = "Country"
  54.         objExcel.ActiveSheet.Cells(1, 13).Value = "User Logon name"
  55.         objExcel.ActiveSheet.Cells(1, 14).Value = "Windows 2k Name"
  56.         objExcel.ActiveSheet.Cells(1, 15).Value = "Logon Script"
  57.         objExcel.ActiveSheet.Cells(1, 16).Value = "Home Folder"
  58.         objExcel.ActiveSheet.Cells(1, 17).Value = "Home Dir Drive"
  59.         objExcel.ActiveSheet.Cells(1, 18).Value = "Title"
  60.         objExcel.ActiveSheet.Cells(1, 19).Value = "Department"
  61.         objExcel.ActiveSheet.Cells(1, 20).Value = "Company"
  62.         objExcel.ActiveSheet.Cells(1, 21).Value = "Last Password Change"
  63.         objExcel.ActiveSheet.Cells(1, 22).Value = "Organisation Unit"
  64.     objExcel.ActiveSheet.Cells(1, 23).Value = "Pw Age"
  65.     objExcel.ActiveSheet.Cells(1, 24).Value = "Pw Info "
  66.         objExcel.ActiveSheet.Cells(1, 25).Value = "Last Logon"
  67.         objExcel.ActiveSheet.Cells(1, 26).Value = "Account Disabled"
  68.         objExcel.ActiveSheet.Cells(1, 27).Value = "Terminal Services Profil"
  69.         objExcel.ActiveSheet.Cells(1, 28).Value = "Manager"
  70.         objExcel.ActiveSheet.Cells(1, 29).Value = "Max Storage"
  71.         objExcel.ActiveSheet.Cells(1, 30).Value = "Locked?"
  72.        
  73.         Const ADS_UF_ACCOUNTDISABLE = 2
  74.         Const ADS_UF_PASSWORD_EXPIRED = &h800000
  75.         Const ADS_ACETYPE_ACCESS_DENIED_OBJECT = &H6
  76.         Const CHANGE_PASSWORD_GUID = "{ab721a53-1e2f-11d0-9819-00aa0040529b}"
  77.  
  78.         Set objHash = CreateObject("Scripting.Dictionary")
  79.  
  80.         objHash.Add "ADS_UF_DONT_EXPIRE_PASSWD", &h10000
  81.  
  82.         Set objConnection = CreateObject("ADODB.Connection")
  83.         objConnection.Open "Provider=ADsDSOObject;"
  84.         Set objCommand = CreateObject("ADODB.Command")
  85.         objCommand.ActiveConnection = objConnection
  86.  
  87.         objCommand.Properties("Page Size") = 1000
  88.         objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
  89.  
  90. objCommand.CommandText = _
  91.     "<GC://" & arrFileLines(l) & ">;(objectCategory=User)" & _
  92.         ";userAccountControl,distinguishedName,cn;subtree"
  93.  
  94. Set objRecordSet = objCommand.Execute
  95.         Do Until objRecordset.EOF
  96.        
  97.                 intUserAccountControl = objRecordset.Fields("userAccountControl")
  98.            
  99.                 If NOT intUserAccountControl AND ADS_UF_ACCOUNTDISABLE Then
  100.            
  101.                 For Each Key In objHash.Keys           
  102.                 set objuser = getObject ("LDAP://" & objRecordset.Fields("distinguishedName").value)
  103.             lastlogon = objuser.LastLogin
  104.                 dtmValue = objuser.PasswordLastChanged
  105.         cnName = objuser.cn
  106.         dnName = objRecordset.Fields("distinguishedName").value
  107.                
  108.         dnnamesumcount = Len(dnname)
  109.         dnnamecount = InStr(1,dnname,"OU")
  110.         cut = dnnamesumcount - dnnamecount
  111.         dncut = Right(dnname, cut)
  112.                
  113.                 objExcel.ActiveSheet.Cells(x, 1).Value = cnName
  114.                 objExcel.ActiveSheet.Cells(x, 2).Value = objuser.description
  115.                 objExcel.ActiveSheet.Cells(x, 3).Value = objuser.physicalDeliveryOfficeName
  116.                 objExcel.ActiveSheet.Cells(x, 4).Value = objuser.telephoneNumber
  117.                 objExcel.ActiveSheet.Cells(x, 5).Value = objuser.mobile
  118.                 objExcel.ActiveSheet.Cells(x, 6).Value = objuser.facsimiletelephonenumber
  119.                 objExcel.ActiveSheet.Cells(x, 7).Value = objuser.mail
  120.                 objExcel.ActiveSheet.Cells(x, 8 ).Value = objuser.wWWHomePage
  121.                 objExcel.ActiveSheet.Cells(x, 9).Value = objuser.StreetAddress
  122.                 objExcel.ActiveSheet.Cells(x, 10).Value = objuser.l
  123.                 objExcel.ActiveSheet.Cells(x, 11).Value = objuser.postalCode
  124.                 objExcel.ActiveSheet.Cells(x, 12).Value = objuser.co
  125.                 objExcel.ActiveSheet.Cells(x, 13).Value = objuser.userPrincipalName
  126.                 objExcel.ActiveSheet.Cells(x, 14).Value = objuser.sAMAccountName
  127.                 objExcel.ActiveSheet.Cells(x, 15).Value = objuser.scriptPath
  128.                 objExcel.ActiveSheet.Cells(x, 16).Value = objuser.homeDirectory
  129.                 objExcel.ActiveSheet.Cells(x, 17).Value = objuser.homeDrive
  130.                 objExcel.ActiveSheet.Cells(x, 18).Value = objuser.title
  131.                 objExcel.ActiveSheet.Cells(x, 19).Value = objuser.department
  132.                 objExcel.ActiveSheet.Cells(x, 20).Value = objuser.company
  133.                 objExcel.ActiveSheet.Cells(x, 21).Value = Left(dtmValue,10)
  134.                 objExcel.ActiveSheet.Cells(x, 22).Value = arrFileLines(l)
  135.                
  136.         datepw = Left(dtmValue,10)
  137.                 today = Now
  138.                 'today1 = "19."
  139.                 days = DateDiff ("d", datepw, today)
  140.                        
  141.                 objExcel.ActiveSheet.Cells(x, 23).Value = days
  142.                
  143.                 If objHash(Key) And intUserAccountControl Then
  144.                         objExcel.ActiveSheet.Cells(x, 24).Value = "PW don't expires"
  145.                         objExcel.Cells(x, 24).Interior.ColorIndex = 3
  146.                 else
  147.                         objExcel.ActiveSheet.Cells(x, 24).Value = "PW expires"
  148.                         objExcel.Cells(x, 24).Interior.ColorIndex = 4
  149.                 End if
  150.                         If days > 90 Then
  151.                            objExcel.Cells(x, 23).Interior.ColorIndex = 3
  152.                    mustchangepw = mustchangepw + 1
  153.                         Else
  154.                            objExcel.Cells(x, 23).Interior.ColorIndex = 4
  155.                            ischangedpw = ischangedpw + 1
  156.                         End if
  157.        
  158.  
  159.         objExcel.ActiveSheet.Cells(x, 25).Value = Left(lastlogon,10)
  160.                
  161.                 If intUserAccountControl AND ADS_UF_ACCOUNTDISABLE Then
  162.                         objExcel.ActiveSheet.Cells(x, 26).Value = "Account disabled"
  163.                         objExcel.Cells(x, 26).Interior.ColorIndex = 3
  164.                 End If
  165.                
  166.                 objExcel.ActiveSheet.Cells(x, 27).Value = objuser.userParameters               
  167.                 objExcel.ActiveSheet.Cells(x, 28).Value = objuser.manager
  168.                 objExcel.ActiveSheet.Cells(x, 29).Value = objuser.maxStorage
  169.                
  170.                 If objUser.IsAccountLocked = True Then
  171.                         objExcel.ActiveSheet.Cells(x, 30).Value = "Account locked out"
  172.                         objExcel.Cells(x, 30).Interior.ColorIndex = 3
  173.                 End If
  174.                
  175.                 x = x + 1              
  176.          
  177.             Next
  178.         End If
  179.          objRecordset.MoveNext
  180.         Loop
  181.  
  182. objConnection.Close
  183.  
  184. oucount = oucount + 1
  185.  
  186. Next
  187. Set objRange = objWorksheet.UsedRange
  188. objRange.EntireColumn.Autofit()
  189. objExcel.close
  190. wscript.echo "done !"

Bei Fragen oder Unklarheiten zum Script, oder sollten Verbesserungen angebracht werden, so bitte melden.

Posted by Alessandro Banzer

Twitter Facebook
Sep 28
programming / scripting

Heute mussten wir eine Massenänderung an AD-Objekten vornehmen. Da ich zu faul war um dies bei jedem User händisch zu machen, haben wir uns ein kleines Script geschrieben. Dieses Script verändert alle User-Objekte in der entsprechenden OU. Das Script ist eigentlich selbsterklärend.

  1. Const ADS_PROPERTY_CLEAR = 1 Set OU = GetObject(&quot;LDAP://OU=Standard Users,OU=Users,DC=admins,DC=li&quot;) For Each oUser In OU If oUser.Class = &quot;user&quot; Then oUser.PutEx ADS_PROPERTY_CLEAR, &quot;userParameters&quot;, 0 oUser.SetInfo End If Next Wscript.echo &quot;All Users has been updated!&quot; Wscript.Quit

Mit der If-Schlaufe If oUser.Class = "user" wird überprüft, ob das Objekt wirklich ein User-Objekt ist. Es werden nur diese verändert. In diesem Beispiel setze ich das Property userParameters auf NULL zurück. Dies sind die Terminal Services Profiles.

Posted by Alessandro Banzer

Twitter Facebook
Aug 4
programming / scripting

Heute erreichte mich die Anfrage, ob ich ein Batch-Script schreiben kann, welches mehrere CSV-Dateien zusammenführt. Weiters sollte die Überschrift nur einmal angezeigt werden. Dazu hier der entsprechende Code, welcher in einer Batch-Datei (*.bat) eingefügt werden kann. Die beiden Variablen Ordner/Sammel müssen entsprechend verändert werden.

  1. @echo off & setlocal
  2. set "Ordner=W:\Scripts"
  3. set "Sammel=W:\Scripts\DeineSammeldatei.csv"
  4.  
  5. pushd "%Ordner%"
  6. if exist "%Sammel%" del "%Sammel%"
  7. for %%i in (*.csv) do if not exist "%Sammel%" for /f "usebackq delims=" %%z in ("%%i") do if not exist "%Sammel%" echo %%z>"%Sammel%"
  8. for /f "delims=" %%i in ('dir /b /od *.csv') do more +1 "%%i">>"%Sammel%"
  9.  
  10. popd
  11.  

Posted by Alessandro Banzer

Twitter Facebook
Mar 4
programming / scripting

In Windows XP gibts drei Möglichkeiten um die Systemsprache auszulesen. Zum einen unter HKEY_LOCAL_MACHINE\System\CurrentControlset\Control\Nls\Language gibt es das den Wert "InstallLanguage". Bei einem Deutschen XP steht hier als Wert 0407. Dann gibt's die sogenannten Default Language die unter HKEY_LOCAL_MACHINE\System\CurrentControlset\Control\Nls\Language\"Default" zu finden sind. Bei Multilanguage Systemen gibt es noch den folgenden Wert
HKEY_CURRENT_USER\Control Panel\Desktop\"MultiUILanguageId" der die Spracheinstellungen des Dekstops des aktuellen Users anzeigt. Bei normalen XP Systemen gibt es den Wert nicht.

In dem folgenden Batch File werden alle drei Werte ausgelesen und angezeigt.

  1.  @echo off :: Abfrage und Anzeige der Windows Sprache for /F &quot;tokens=2* skip=4 usebackq&quot; %%f in (`reg query &quot;HKEY_LOCAL_MACHINE\System\CurrentControlset\Control\Nls\Language&quot; /v &quot;InstallLanguage&quot;`) do @set x9=%%g set InstallLanguage=%x9:ü=% for /F &quot;tokens=2* skip=4 usebackq&quot; %%f in (`reg query &quot;HKEY_LOCAL_MACHINE\System\CurrentControlset\Control\Nls\Language&quot; /v &quot;Default&quot;`) do @set x10=%%g set DefaultLanguage=%x10:ü=% for /F &quot;tokens=2* skip=4 usebackq&quot; %%f in (`reg query &quot;HKEY_CURRENT_USER\Control Panel\Desktop&quot; /v &quot;MultiUILanguageId&quot;`) do @set x11=%%g set UserProfileLanguage=%x11:~-4% if &quot;%InstallLanguage%&quot;==&quot;0407&quot; ( set InstallLanguage=0407 German ) if &quot;%InstallLanguage%&quot;==&quot;0409&quot; ( set InstallLanguage=0409 English-US ) if &quot;%InstallLanguage%&quot;==&quot;040A&quot; ( set InstallLanguage=040A Spain ) if &quot;%InstallLanguage%&quot;==&quot;040C&quot; ( set InstallLanguage=040C French ) if &quot;%InstallLanguage%&quot;==&quot;040E&quot; ( set InstallLanguage=040E Ungarisch ) if &quot;%InstallLanguage%&quot;==&quot;0410&quot; ( set InstallLanguage=0410 Italienisch ) if &quot;%InstallLanguage%&quot;==&quot;0415&quot; ( set InstallLanguage=040E Polnisch ) if &quot;%InstallLanguage%&quot;==&quot;0418&quot; ( set InstallLanguage=0418 Rumänisch ) if &quot;%InstallLanguage%&quot;==&quot;0419&quot; ( set InstallLanguage=0419 Russisch ) echo Install-Sprache ist %InstallLanguage% echo Default Sprache ist %DefaultLanguage% if &quot;%UserProfileLanguage%&quot;==&quot;~-4&quot; ( echo No Multi-Language System detected! ) if &quot;%UserProfileLanguage%&quot; NEQ &quot;~-4&quot; ( echo Aktuelle User Sprache ist %UserProfileLanguage% ) pause

Posted by Alessandro Banzer

Twitter Facebook
Sep 15
programming / scripting

Hier sieht man mein Project "Helium" aus der Visual Studio Umgebung. Ich bin dabei, eine komplette Library mit Anbindung an Datenbanken (Oracle, Access, MySQL), an IRC (IRC.NET-Klassen), Active Directory, Microsoft Office, und vieles mehr zu schreiben. Auch befasse ich mich momentan mit ein par Crypting Klassen.

Das ganze Projekt hat zwischenzeitlich eine Grösse von 9.83MB, und umfasst 455 Files > 127311 Zeilen Code.

Posted by Alessandro Banzer

Twitter Facebook
Sep 3
programming / scripting

Nach dem Re-Launch von chatmania.ch wollten wir natürlich auch die aktuellen Userzahlen und die Top-Channels auf der Homepage veröffentlichen. Zuerst versuchte ich das ganze mit einem PHP Script, so eine Art PHP IRC Bot. Es hat allerdings nicht schön geklappt, auch ist die IRC-Klasse von PHP mir nicht bekannt, da habe ich kurzerhand ein TCL-Modul für den Eggdrop geschrieben.

Das ganze liest die Userzahlen anhand von /LUSERS aus und speichert sie in einer Datenbank. Desweiteren werden alle Channels ausgelesen und in der DB abgelegt. Das ganze geschieht mit /LIST. Die Datenbank hat zwei Spalten, einmal KEY und einmal VALUE. Im Key speichere ich den Channel und im Value die Userzahl. Die totale Anzahl an Usern speichere ich als KEY USERCOUNT und dem entsprechenden Wert.

  1. ###########################
  2. ### Settings
  3. ###########################
  4.  
  5. # Database Settings
  6. set dbhost "localhost"
  7. set dbuser "dbuser"
  8. set dbpass "dbpass"
  9. set dbbase "database"
  10. set dbtable "dbtable"
  11.  
  12. # Set the time in minuets to update the file here.
  13. set chatmania_setting(timer_update) "5"
  14.  
  15. ###########################
  16. ### Code
  17. ###########################
  18.  
  19. bind raw - 322 chatmania_listrecieve
  20. bind raw - 323 chatmania_listend
  21. bind raw - 255 chatmania_write_lusers
  22.  
  23. if {![string match *chatmania_update* [timers]]} {
  24.         timer $chatmania_setting(timer_update) chatmania_update
  25. }
  26. proc chatmania_write_lusers {from keyword text} {
  27.         global chatmania_lusers_data
  28.         set chatmania_lusers_data($keyword) [lindex $text 3]
  29. }
  30. proc chatmania_listrecieve {from keyword text} {
  31.         global chatmania_list_data
  32.         regsub -all -- "^:" "[lindex [split $text] 3]" "" text2
  33.         set text [lreplace [split $text] 3 3 $text2]
  34.         set chatmania_list_data([lindex $text 1]) "[lrange $text 2 end]"
  35. }
  36. proc chatmania_listend {from keyword text} {
  37.         chatmania_do_final
  38. }
  39. proc chatmania_do_final {} {
  40.         global dbhost dbuser dbpass dbbase dbtable chatmania_setting chatmania_list_data chatmania_lusers_data
  41.        
  42.         # mysql connect
  43.         mysql_connect $dbbase $dbhost $dbuser $dbpass
  44.        
  45.         # mysql querys
  46.        
  47.         # LUSERS
  48.         foreach i [array names chatmania_lusers_data] {
  49.                 mysql_query "INSERT INTO `website_chatstats` ( `Key` , `Value` ) VALUES ('USERCOUNT', '$chatmania_lusers_data($i)')"
  50.         }
  51.        
  52.         # LIST
  53.         foreach i [array names chatmania_list_data] {
  54.                 regsub -all -- ":$" "[join $chatmania_list_data($i)]" "" text2
  55.                 mysql_query "INSERT INTO `website_chatstats` ( `Key` , `Value` ) VALUES ('$i', '$text2')"
  56.         }
  57.        
  58.         # mysql close
  59.         mysql_close
  60. }
  61. proc chatmania_update {} {
  62.         global chatmania_setting chatmania_uplink
  63.         if {[info exists chatmania_uplink]} {
  64.                 unset chatmania_uplink
  65.         }
  66.        
  67.         putserv "LUSERS"
  68.         putserv "LIST"
  69.        
  70.         if {![string match *chatmania_update* [timers]]} {
  71.                 timer $chatmania_setting(timer_update) chatmania_update
  72.         }
  73. }
  74.  
  75. putlog "Chatmania Stats Script loaded. Update every $chatmania_setting(timer_update) minutes."

Ich freue mich über Feedback dieses Scripts. 

Posted by Alessandro Banzer

Twitter Facebook
Aug 18
programming / scripting

Es ist sehr wichtig, dass Clientseitiger Java Script Code nicht auf andere Domains oder Server zugreifen kann. Dies deshalb, weil man so Cross Site Scripting Angriffe auf den Client vermeiden kann. Manchmal ist es aber von nöten, dass man auf Ressourcen von einem entfernten Server zugreifen muss. Hierzu eignet sich die PHP Funktion libcurl, welche auf den meisten PHP Server läuft. Mit dieser Funktion ist es möglich, den Browserinhalt eines anderen Webservers zu ziehen und diese weiter zu verarbeiten.

In meinem kleinen Beispiel senden wir einfach ein par GET Variablen an den anderen Webserver und geben die daraus resultierende Antwort an den Client weiter. Mittels dem XMLHttpRequest Object kann wie gewohnt auf das Script zugegriffen werden.

Wichtig beim Zugriff auf einen fremden Webserver ist, dass man die Urheberrechte im Auge behält. Denn die bei einem unerlaubten Zugriff verstösst man gegen die Urheberrechtsverletzung, welche durchaus rechtliche Konsequenzen haben kann.

  1.  
  2. // erzeuge einen neuen cURL-Handle
  3. $ch = curl_init();
  4.  
  5.  
  6. // setze die URL und andere Optionen
  7. curl_setopt($ch, CURLOPT_URL, “http://www.helium.li/CURL/?”.$_SERVER['QUERY_STRING']);
  8. curl_setopt($ch, CURLOPT_HEADER, 0);
  9. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  10.  
  11.  
  12. // führe die Aktion aus und gebe die Daten an $result weiter
  13. $result = curl_exec($ch);
  14.  
  15.  
  16. // schließe den cURL-Handle und gebe die Systemresourcen frei
  17. curl_close($ch);
  18.  
  19.  
  20. // Das Resultat des cURL Handels an den Browser zurückgeben
  21. echo $result;
  22.  

Weitere Informationen zu der PHP Funktion findet man auf http://ch.php.net/curl

Posted by Alessandro Banzer

Twitter Facebook
Aug 7
programming / scripting

Beim Zugreiffen auf eine Microsoft Excel 2007 Instanz (Deutsche Version) kommt folgende Fehlermeldung:

System.Runtime.InteropServices.COMException was unhandled
Message="Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))"

Dies ist ein Bug im Office 2007 (Deutsch) und kann wie folgt umgangen werden:

  1. // Bug: http://support.microsoft.com/kb/320369/en-us
  2. CultureInfo tOldCI = System.Threading.Thread.CurrentThread.CurrentCulture;
  3. System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

Hier werden im aktuellen Thread die Culture Infos auf en-us verändert..

Posted by Alessandro Banzer

Twitter Facebook
Jul 29
programming / scripting

Mit diesem kleinen Snippet kann man anhand eines Dialogs ein Verzeichnis auswählen.

  1. fbdPath.Description = "Beschreibung im Dialog";
  2. fbdPath.SelectedPath = @"C:\SYS\"; // Vorgegebener Pfad
  3.  
  4. DialogResult objResult = fbdPath.ShowDialog(this);
  5. if (objResult == DialogResult.OK)
  6.     linkRecord.Text = fbdPath.SelectedPath; // Selektierter Pfad in ein LabelLink schreiben

Falls du Fragen zu diesem kleinen Snippet hast, schreibe einen Kommentar.

Posted by Alessandro Banzer

Twitter Facebook
Jul 28
programming / scripting

Mit diesem kleinen Script kann man sich vor ständigem Excess Flood mittels Eggdrop/Windrop schützen:

  1. bind sign - * quit:check
  2. proc quit:check {nick uhost hand chan reason} {
  3.   global botnick
  4.   if {([isop $botnick $chan]) && (![validuser $hand]) && (![isop $nick $chan]) && (![isvoice $nick $chan])} {
  5.     if {([string match -nocase "*excess*" $reason]) && ([string match -nocase "*flood*" $reason]) || ([string match -nocase "*killed*" $reason]) && (![string match -nocase "*ghost*" $reason]) && (![string match -nocase "*collision*" $reason])} {
  6.       set mask *!*@[lindex [split [getchanhost $nick $chan] @] 1]
  7.       putquick "MODE $chan +b $mask"
  8.     }
  9.   }
  10. }

Posted by Alessandro Banzer

Twitter Facebook
Jul 28
programming / scripting

Mit dieser kleiner Protection kann man als Operator (+o) darauf schauen, dass niemand im Channel GROSS SCHREIBT.

  1. on *:TEXT:*:#: {
  2.         if ($len($1-) < 8 ) || ($nick isop #) return
  3.         var %text = $strip($remove($1-,$chr(32)))
  4.         var %non.caps = $len($removecs(%text,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z))
  5.         var %full.line = $len($strip($remove(%text,$chr(32))))
  6.         var %percent = $calc(1 - (%non.caps / %full.line))
  7.         if (%percent >= 0.7 ) {
  8.           if (%wiederholung [ $+ [ $nick ] ] == $null) { notice $nick Bitte nicht grossschreiben, dies bedeutet schreien. | set %wiederholung [ $+ [ $nick ] ] 1 | halt }
  9.           if (%wiederholung [ $+ [ $nick ] ] == 1) { kick # $nick Bitte nicht grossschreiben, dies bedeutet schreien.  | inc %wiederholung [ $+ [ $nick ] ] 1 | halt }
  10.           if (%wiederholung [ $+ [ $nick ] ] == 2) { kick # $nick Bitte nicht grossschreiben, dies bedeutet schreien.  | inc %wiederholung [ $+ [ $nick ] ] 1 | halt }] ] 1 | halt }
  11.           if (%wiederholung [ $+ [ $nick ] ] == 3) { ban $chan $nick 2 | kick # $nick Bitte nicht grossschreiben, dies bedeutet schreien.  | unset %wiederholung [ $+ [ $nick ] ] | halt }
  12.         }
  13. }

Die Sensitivität kann bei "if ( %percent >= 0.7 )" eingestellt werden. Dies ist eine Prozentangabe. 0.7 bedeutet, dass wenn ab 70% der Zeichen Grossbuchstaben sind, gehandelt wird.

Posted by Alessandro Banzer

Twitter Facebook

(Page 1 of 2, totaling 29 entries)