@stefanwue
Rufe diskpart mit dem Parameter /s <Skript> auf. Der Parameter /s verwendet ein Datenträgerpartitionierungsskript. In dem Skript fasst Du Deine diskpart-Befehle zusammen.
@stefanwue
Rufe diskpart mit dem Parameter /s <Skript> auf. Der Parameter /s verwendet ein Datenträgerpartitionierungsskript. In dem Skript fasst Du Deine diskpart-Befehle zusammen.
Const $FILEPATH = 'test.ini'
Dim $Sections = IniReadSectionNames($FILEPATH)
Dim $IDs[$Sections[0] + 1]
Dim $Types[$Sections[0] + 1]
Dim $Names[$Sections[0] + 1]
Dim $Prices[$Sections[0] + 1]
$IDs[0] = 'IDs'
$Types[0] = 'Types'
$Names[0] = 'Names'
$Prices[0] = 'Prices'
ConsoleWrite('Ini-File: ' & $FILEPATH & @CRLF)
ConsoleWrite('Sectioncount: ' & $Sections[0] & @CRLF)
For $i = 1 To $Sections[0]
ConsoleWrite('Section: ' & $Sections[$i] & @CRLF)
Dim $Elements = IniReadSection($FILEPATH, $Sections[$i])
; Die For-Schleife dient nur der Kontrolle. Die Schleife kann gelöscht werden.
For $j = 1 To $Elements[0][0]
ConsoleWrite('Key: ' & $Elements[$j][0] & '; Value: ' & $Elements[$j][1] & @CRLF)
Next
; ~~~~
$IDs[$i] = $Elements[1][1]
$Types[$i] = $Elements[2][1]
$Names[$i] = $Elements[3][1]
$Prices[$i] = $Elements[4][1]
Next
; Diese Zeilen dienen ebenfalls zur Kontrolle und können ebenfalls gelöscht werden.
_DumpArray($IDs)
_DumpArray($Types)
_DumpArray($Names)
_DumpArray($Prices)
Func _DumpArray($array)
ConsoleWrite($array[0] & @CRLF)
For $i = 1 To UBound($array) - 1
ConsoleWrite($array[$i] & @CRLF)
Next
EndFunc ;==>_DumpArray
Alles anzeigen
Da Deine WMI-Abfrage in PowerShell auf dem Windows 2012R2-Server funktioniert, rufe doch PowerShell aus Deinem AutoIt-Script auf und übergebe das Ergebnis wieder an Dein AutoIt-Script. Leider besteht die Rückgabe nicht aus Objekten, sondern die Ausgabe wird als Zeichenkette zurückgegeben.
AutoItSetOption('MustDeclareVars', 1)
Const $STDOUT_CHILD = 2
Dim $ScriptBlock = '{ $WmiDate = [System.Management.ManagementDateTimeConverter]::ToDmtfDateTime((Get-Date).AddDays(-15)); $EventLogEntries = Get-WmiObject -Query (""""SELECT * FROM Win32_NTLogEvent WHERE LogFile=''System'' AND EventCode=''10016'' AND TimeWritten>=''"""" + $WmiDate + """"''""""); $EventLogEntries.User}'
Dim $PID = Run('powershell.exe -NoLogo -NoProfile -Command "& ' & $ScriptBlock & '"', @WindowsDir, @SW_HIDE, $STDOUT_CHILD)
Dim $StdOutPut = ''
While 1
$StdOutPut &= StdoutRead($PID)
If @error Then ExitLoop
WEnd
Dim $Users = StringSplit($StdOutPut, @CRLF, 1)
For $i = 1 To $Users[0] - 1
ConsoleWrite($Users[$i] & @CRLF)
Next
Alles anzeigen
Aufgrund der Datenschutzbedenken würde ich das Namensschema der Log-Dateien dahin ändern, dass keine Rückschlüsse auf den Nutzer gemacht werden kann. Ebenfalls würde ich die NTFS-Berechtigung anpassen, dass der Benutzer auf seine Protokolldatei lesenden und schreibenden Zugriff erhält.
Um Ordner und Dateien auszublenden, auf die ein Benutzer keine Zugriffsrechte hat, würde ich zusätzlich ABE (Zugriffsbasierte Aufzählung) auf den Dateiserver aktivieren.
Genaue Einstellungen würde ich morgen nachmittag testen.
Zu guter Letzt sollte dieses mit dem Betriebs- oder Personalrat geklärt sein.
Die Installation von 7-Zip kann unbeaufsichtigt durchgeführt werden. Dem Installer kannst Du Schalter mitgeben. Da brauchst Du keine Fenster automatisiert durchklicken.
Schaue hier --> 7-Zip FAQs und hier --> WPKG - 7-Zip
Hallo Schokolade.
Du musst die NTFS-Berechtigungen wie folgt anpassen. Wichtig: Bei Anwenden auf, Nur Dateien auswählen.
Wer lesen kann, ist klar im Vorteil. Ich hatte es überlesen, dass Du ein asymmetrischen Verschlüsselungsverfahren suchst. Da wir gerade beim Lesen sind; in der Dokumentation zu CAPICOM von Microsoft steht alles, was Du brauchst.
Hier der Quellcode zum Verschlüsseln ...
; ============================================================================================================
; Name: CAPICOM-Beispiel
; ------------------------------------------------------------------------------------------------------------
; Dlls: capicom.dll
; Dokumentation: https://msdn.microsoft.com/en-us/library/windows/desktop/aa375732(v=vs.85).aspx
; Download: http://www.microsoft.com/en-us/download/details.aspx?id=25281
;
; Anmerkung: Nach der Installation der CAPICOM-SDK musst die capicom.dll manuell registiert werden.
; Dieses Beispiel wurde mit Windows 8.1 64-Bit Enterprise und AutoIt-Version 3.3.14.1
; getestet.
; ============================================================================================================
AutoItSetOption('MustDeclareVars', 1)
; CAPICOM_ENCRYPTION_ALGORITHM
Dim Const $CAPICOM_ENCRYPTION_ALGORITHM_RC2 = 0 ; Use RSA RC2 encryption.
Dim Const $CAPICOM_ENCRYPTION_ALGORITHM_RC4 = 1 ; Use RSA RC4 encryption.
Dim Const $CAPICOM_ENCRYPTION_ALGORITHM_DES = 2 ; Use DES encryption.
Dim Const $CAPICOM_ENCRYPTION_ALGORITHM_3DES = 3 ; Use triple DES encryption.
Dim Const $CAPICOM_ENCRYPTION_ALGORITHM_AES = 4 ; Use the Advanced Encryption Standard(AES) algorithm.
; CAPICOM_ENCODING_TYPE
Dim Const $CAPICOM_ENCODE_BASE64 = 0 ; Data is saved as a base64-encoded String
Dim Const $CAPICOM_ENCODE_BINARY = 1 ; Data is saved as a pure binary sequence
Dim $Store = ObjCreate('CAPICOM.Store') ; As IStore3
; Store.Open([ ByVal StoreLocation ], [ ByVal StoreName ], [ ByVal OpenMode ])
$Store.Open()
; Certificates.Select([ ByVal Title ], [ ByVal DisplayString ], [ ByVal bMultiSelect ])
Dim $Certificates = $Store.Certificates.Select('Zertifikate', 'Bitte Zertifikat auswählen ...') ; As ICertificates2
If $Certificates >= 1 Then
Dim $Certificate = $Certificates.Item(1) ; As ICertificate2
ConsoleWrite('Ausgestellt für: ' & $Certificate.GetInfo(0) & @CRLF)
ConsoleWrite('Ausgestellt von: ' & $Certificate.GetInfo(1) & @CRLF)
ConsoleWrite('Privater Schlüssel vorhanden: ' & $Certificate.HasPrivateKey() & @CRLF)
ConsoleWrite('Version: ' & $Certificate.Version & @CRLF)
ConsoleWrite('Gültig ab: ' & $Certificate.ValidFromDate & @CRLF)
ConsoleWrite('Gültig bis: ' & $Certificate.ValidToDate & @CRLF)
ConsoleWrite('Seriennummer: ' & $Certificate.SerialNumber & @CRLF)
ConsoleWrite('Fingerabdruck: ' & $Certificate.Thumbprint & @CRLF)
ConsoleWrite(@CRLF)
Dim $EnvelopedData = ObjCreate('CAPICOM.EnvelopedData') ; As IEnvelopedData
$EnvelopedData.Algorithm.Name = $CAPICOM_ENCRYPTION_ALGORITHM_RC4
$EnvelopedData.Content = 'Dies ist eine geheime Nachricht!'
$EnvelopedData.Recipients.Add($Certificate)
Dim $EncryptedText = $EnvelopedData.Encrypt($CAPICOM_ENCODE_BASE64) ; As String
ConsoleWrite('Verschlüsselter Text: ' & $EncryptedText & @CRLF)
Dim $EncryptedFile = FileOpen('EncryptedFile.txt', 1)
FileWriteLine($EncryptedFile, $EncryptedText)
FileClose($EncryptedFile)
EndIf
Alles anzeigen
; ============================================================================================================
; Name: CAPICOM-Beispiel
; ------------------------------------------------------------------------------------------------------------
; Dlls: capicom.dll
; Dokumentation: https://msdn.microsoft.com/en-us/library/windows/desktop/aa375732(v=vs.85).aspx
; Download: http://www.microsoft.com/en-us/download/details.aspx?id=25281
;
; Anmerkung: Nach der Installation der CAPICOM-SDK musst die capicom.dll manuell registiert werden.
; Dieses Beispiel wurde mit Windows 8.1 64-Bit Enterprise und AutoIt-Version 3.3.14.1
; getestet.
; ============================================================================================================
AutoItSetOption('MustDeclareVars', 1)
Dim Const $CAPICOM_ENCRYPTION_ALGORITHM_RC2 = 0 ; Use RSA RC2 encryption.
Dim Const $CAPICOM_ENCRYPTION_ALGORITHM_RC4 = 1 ; Use RSA RC4 encryption.
Dim Const $CAPICOM_ENCRYPTION_ALGORITHM_DES = 2 ; Use DES encryption.
Dim Const $CAPICOM_ENCRYPTION_ALGORITHM_3DES = 3 ;Use triple DES encryption.
Dim Const $CAPICOM_ENCRYPTION_ALGORITHM_AES = 4 ; Use the Advanced Encryption Standard(AES) algorithm.
Dim Const $SECRET_PASSWORD = 'Bzi9i/uEfgg'
; Verschlüsseln
Dim $Encrypter = ObjCreate('CAPICOM.EncryptedData') ; As IEncryptedData
$Encrypter.Content = 'Dies ist eine geheime Nachricht!'
$Encrypter.SetSecret($SECRET_PASSWORD)
$Encrypter.Algorithm.Name = $CAPICOM_ENCRYPTION_ALGORITHM_RC4
Dim $EncryptedText = $Encrypter.Encrypt() ; As String
ConsoleWrite('Verschlüsselter Text: ' &$EncryptedText & @CRLF)
; Entschlüsseln
Dim $Encrypter = ObjCreate('CAPICOM.EncryptedData')
$Encrypter.SetSecret($SECRET_PASSWORD)
$Encrypter.Algorithm.Name = $CAPICOM_ENCRYPTION_ALGORITHM_RC4
$Encrypter.Decrypt($EncryptedText)
Dim $DecryptedText = $Encrypter.Content ; As String
ConsoleWrite('Entschlüsselter Text: ' & $DecryptedText & @CRLF)
Alles anzeigen
ConsoleWrite(ExitsLocalUser("test"))
[/autoit][autoit][/autoit][autoit]Func ExitsLocalUser($name)
Return IsObj(ObjGet(StringFormat('WinNT://localhost/%s,user', $name)))
EndFunc ;==>ExitsLocalUser
Es stimmt leider, dass es doch etwas Zeit kostet, bis die Powershell geladen ist. Aus diesem Grunde habe ich immer eine Instanz von Powershell geöffnet. Bei Gelegenheit werde ich mal AutoIt und Powerhell gegeneinander antreten lassen und große Mengen im AD abfragen.
Du hast auch damit recht, dass nicht alle cmdlets auf alle Rechner installiert sind. Sobald ich einen Server zum Domänencontroller hochstufe, werden die AD-Cmdlets installiert. Möchte ich meine Server remote verwalten, dann installiere ich die Remoteserver-Verwaltungstools auf meinen Administratorrechner oder ich könnte PS-Remoting auf dem Server aktivieren.
Persönlich habe ich jahrelang auf AutoIt gesetzt. Vieles, was ich nicht mit VBScript machen konnte, konnte ich dann in AutoIt realisieren. Die Mächtigkeit von Powershell aber hat mich davon überzeugt, immer mehr Powershell-Skripte einzusetzen.
Welches sind die Gründe, warum die AD-Udf nicht in den Standard aufgenommen werden soll?
Dies kann man auch von AutoIt behaupten. Natürlich kann ich Dich verstehen, dass immer mehr Benutzer Deine UDF verwenden sollen. Schließlich hast Du viel Arbeit in die AD-UDF gesteckt und Du möchtest, dass Deine UDF endlich zum Standardinstallationsumfang von AutoIt gehört.
Da wir uns hier im Bereich des Forums befinden, welches sich nicht ausschließlich mit AutoIt beschäftigt, habe ich nur eine mögliche Alternative ausgezeigt. Powershell gehört zur Standardinstallation von Windows Server 2008 und jeder Domänencontroller hat die AD-Cmdlets bereits mitinstalliert. Viele administrative Werkzeuge setzen auf Powershell. Zum Beispiel ist der Active Directory Verwaltungscenter eine grafische Oberfläche zu den AD-Cmdlets. Als Systemadministrator sollte man sich unbedingt mit Powershell auseinander setzen. Die Server Core-Installation eines Windows Server 2008 lässt sich fast ausschließlich über die Shell verwalten.
Microsoft setzt immer mehr auf Powershell. Hier hast Du bereits eine Vielzahlt von cmdlets, um die AD zu administrieren. Am Besten schaust Du mal hier.
Du kannst mit Powershell natürlich auch eine grafische Oberfläche erstellen, wenn es erwünscht ist.
; Getestet unter Windows XP Professional mit SP 3
; Getestet unter Windows 7 Professional 32-Bit mit SP 1
Const $adOpenStatic = 3
[/autoit] [autoit][/autoit] [autoit]Dim $filepath = FileOpenDialog('', '', 'CSV-Datei (*.csv)')
If $filepath = -1 Then
ConsoleWrite('! Abbruch durch den Benutzer' & @CRLF)
Exit
EndIf
$fso = ObjCreate('Scripting.FileSystemObject')
Dim $cnn = ObjCreate('ADODB.Connection')
$cnn.Provider = 'Microsoft.Jet.OLEDB.4.0'
; ggf. den Delimiter inn der Registry anpassen.
; HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text\Format
$cnn.ConnectionString = StringFormat( _
'Data Source=%s;Extended Properties="text;HDR=YES;FMT=Delimited"', _
$fso.GetParentFolderName($filepath))
$cnn.Open()
Dim $rs = ObjCreate('ADODB.RecordSet')
$rs.Open(StringFormat( _
'SELECT * FROM [%s]', _
$fso.GetFileName($filepath)), _
$cnn, $adOpenStatic)
Dim $xmlDoc = ObjCreate('Microsoft.XMLDOM')
Dim $rootNode = $xmlDoc.createElement($fso.GetFileName($filepath))
$xmlDoc.appendChild($rootNode)
For $r = 0 To $rs.RecordCount - 1
Dim $node = $xmlDoc.createElement('Datensatz')
$rootNode.appendChild($node)
For $field In $rs.Fields
Dim $childNode = $xmlDoc.createElement($field.Name)
$childNode.Text = $rs.Fields($field.Name).Value
$node.appendChild($childNode)
Next ; field
$rs.MoveNext()
Next ; r
Dim $intro = $xmlDoc.createProcessingInstruction _
('xml', 'version=''1.0''')
$xmlDoc.insertBefore _
($intro, $xmlDoc.childNodes(0))
$xmlpath = FileSaveDialog('', $fso.GetParentFolderName($filepath), _
'XML (*.xml)', 2, StringFormat('%s.xml', $fso.GetBaseName($filepath)))
If @error Then
ConsoleWrite('! Abbruch durch den Benutzer' & @CRLF)
Exit
EndIf
$xmlDoc.Save($xmlpath)
ShellExecute($xmlpath)
[/autoit]@warhwolf.
Der Artikel Verwendung von ADO mit Excel-Daten ... erklärt sehr ausführlich die Herangehensweise. Hier ist aber dennoch der kommentierte Quelltext.
; SchemaEnum
Const $adSchemaTables = 20
; CursorLocationEnum
Const $adUseClient = 3
; Instanziirung der Connection-Klasse. Mit diesem Objekt wird eine dauerhafte Verbindung
; zu einer Datenquelle hergestellt.
Dim $cn = ObjCreate('ADODB.Connection')
; OLEDB-Provider für die Verbindung festlegen.
$cn.Provider = 'Microsoft.Jet.OLEDB.4.0'
; Es wird eine Verbindungszeichenfolge(Connection String auch Init String) erwartet. Die Zeichenfolge ist
; eine Reihenfolge von Attribut-Wert-Zuweisungen.
$cn.ConnectionString = 'Data Source=' & @ScriptDir & '\Test.xls;Extended Properties=Excel 8.0;'
; Speicherort der Cursorbibliothekt setzen.
$cn.CursorLocation = $adUseClient
; Eine Verbindung zur Datenquelle öffnen.
$cn.Open()
; Die Datenbankschemainformationen ermitteln. Die OpenSchema-Methode gibt selbstbeschreibene
; Informationen üder die Datenquelle zurück.
; Tabellen zurückgeben
Dim $rsTables = $cn.OpenSchema($adSchemaTables)
ConsoleWrite('Anzahl Tabellenblätter: ' & $rsTables.RecordCount & @CRLF)
; Iterationen über alle Tabellen
For $t = 1 To $rsTables.RecordCount
ConsoleWrite(@CRLF)
; Gibt den Tabellennamen zurück
Dim $tableName = $rsTables.Fields('TABLE_NAME').Value
ConsoleWrite('Tabelle: ' & $tableName & @CRLF)
ConsoleWrite('----------------------' & @CRLF)
; Ausgabe der Eigenschaften mit deren Werte
For $f = 0 To $rsTables.Fields.Count - 1
ConsoleWrite(' ' & $rsTables.Fields($f).Name & ' = ' & $rsTables.Fields($f).Value & @CRLF)
Next ; f
; Array für die Abfragekriterien
Dim $criterias[4]
$criterias[2] = $tableName
; Gibt die Spalten der Tabelle zurück
; adSchemaColumns = 4
Dim $rsColumns = $cn.OpenSchema(4, $criterias)
ConsoleWrite(@CRLF & ' Anzahl Spalten: ' & $rsColumns.RecordCount & @CRLF)
; SQL Statement ausführen. Wird nur der Tabellenname angegeben, vervollständig ADO automatisch
; die SQL-Anweisung. "SELECT * FROM [<tablename>]"
Dim $rs = $cn.Execute('[' & $tableName & ']')
; Iteration über alle Spalten
For $c = 1 To $rsColumns.RecordCount
; Gibt Spaltennamen zurück
Dim $columnName = $rsColumns.Fields('COLUMN_NAME').Value
ConsoleWrite(@CRLF & ' Spalte: ' & $columnName & @CRLF)
ConsoleWrite(' ----------------------' & @CRLF)
; Ausgabe der Eigenschaften mit deren Werte
For $f = 0 To $rsTables.Fields.Count - 1
ConsoleWrite(' ' & $rsColumns.Fields($f).Name & ' = ' & $rsColumns.Fields($f).Value & @CRLF)
Next ; f
ConsoleWrite(@CRLF)
ConsoleWrite(' Ausgabe Zeilen:' & @CRLF)
; Springt zum ersten Datensatz
$rs.MoveFirst()
; Iteration über alle Datensätze
For $r = 0 To $rs.RecordCount - 1
; Ausgabe der Werte
ConsoleWrite(' ' & $rs.Fields($columnName).Value & @CRLF)
; zum nächsten Datensatz springen
$rs.MoveNext()
Next ; r <-- Daten
; zum nächsten Datensatz springen
$rsColumns.MoveNext()
Next ; $c <-- Spalten
; Geöffnete Verbindungen schliesen
$rs.Close()
$rsColumns.Close()
; zum nächsten Datensatz springen
$rsTables.MoveNext()
Next ; $t <-- Tabellen
; Geöffnete Verbindungen schliesen
$rsTables.Close()
$cn.Close()
Mittels ActiveX Data Objects(ADO) kannst Du Excel-Arbeitsmappe auslesen:
[autoit]
Const $adSchemaTables = 20
Const $adUseClient = 3
Dim $cn = ObjCreate('ADODB.Connection')
$cn.Provider = 'Microsoft.Jet.OLEDB.4.0'
$cn.ConnectionString = 'Data Source=' & @ScriptDir & '\Test.xls;Extended Properties=Excel 8.0;'
$cn.CursorLocation = $adUseClient
$cn.Open()
Dim $rsTables = $cn.OpenSchema($adSchemaTables)
ConsoleWrite('Anzahl Tabellenblätter: ' & $rsTables.RecordCount & @CRLF)
For $t = 1 To $rsTables.RecordCount
ConsoleWrite(@CRLF)
Dim $tableName = $rsTables.Fields('TABLE_NAME').Value
ConsoleWrite('Tabelle: ' & $tableName & @CRLF)
ConsoleWrite('----------------------' & @CRLF)
For $f = 0 To $rsTables.Fields.Count - 1
ConsoleWrite(' ' & $rsTables.Fields($f).Name & ' = ' & $rsTables.Fields($f).Value & @CRLF)
Next ; f
Dim $criterias[4]
$criterias[2] = $tableName
Dim $rsColumns = $cn.OpenSchema(4, $criterias)
ConsoleWrite(@CRLF & ' Anzahl Spalten: ' & $rsColumns.RecordCount & @CRLF)
Dim $rs = $cn.Execute('[' & $tableName & ']')
For $c = 1 To $rsColumns.RecordCount
Dim $columnName = $rsColumns.Fields('COLUMN_NAME').Value
ConsoleWrite(@CRLF & ' Spalte: ' & $columnName & @CRLF)
ConsoleWrite(' ----------------------' & @CRLF)
For $f = 0 To $rsTables.Fields.Count - 1
ConsoleWrite(' ' & $rsColumns.Fields($f).Name & ' = ' & $rsColumns.Fields($f).Value & @CRLF)
Next ; f
ConsoleWrite(@CRLF)
ConsoleWrite(' Ausgabe Zeilen:' & @CRLF)
$rs.MoveFirst()
For $r = 0 To $rs.RecordCount - 1
ConsoleWrite(' ' & $rs.Fields($columnName).Value & @CRLF)
$rs.MoveNext()
Next ; r
$rsColumns.MoveNext()
Next ; $c
$rs.Close()
$rsColumns.Close()
$rsTables.MoveNext()
Next ; $t
$rsTables.Close()
$cn.Close()
Vielleicht hilft Dir dieses Skript weiter:
[autoit]; Link: http://msdn.microsoft.com/en-us/library/…4(v=vs.85).aspx
; Link: http://msdn.microsoft.com/en-us/library/…9(v=vs.85).aspx
Dim $fileshares = ObjGet('WinNT://./lanmanserver') ; As IADsFileService
[/autoit][autoit][/autoit][autoit]For $share In $fileshares
ConsoleWrite(StringFormat('Freigabe:\t%s\n', $share.Name))
ConsoleWrite(StringFormat('Lokaler Pfad:\t%s\n', $share.Path))
ConsoleWrite(StringFormat('Beschreibung:\t%s\n', $share.Description))
Next ; $share
AutoItSetOption('MustDeclareVars', 1)
Global $Err = ObjEvent('AutoIt.Error', '_ComErr')
Dim $user = ObjGet('LDAP://cn=Lemon,ou=Becks,dc=Bier,dc=local') ; As IADsUser
_GetGroups($user)
Func _GetGroups($ADsObject)
; Die ADSI-Methode 'GetEx' gibt IMMER ein Array zurück!!!
Dim $memberOf = $ADsObject.GetEx('memberOf')
For $groupDN In $memberOf
Dim $group = ObjGet('LDAP://' & $groupDN) ; As IADsGroup
ConsoleWrite('Gruppe: ' & $group.cn & @CRLF)
_GetGroups($group)
Next
EndFunc ;==>_GetGroups
Func _ComErr()
;ConsoleWrite(StringFormat('\tFehlernummer: %s\n', Hex($Err.Number, 8)))
;ConsoleWrite(StringFormat('\tBeschreibung: %s\n', $Err.Windescription))
;ConsoleWrite(StringFormat('\tSkriptzeile: %s\n', $Err.Scriptline))
SetError(1)
EndFunc ;==>_ComErr
@F1109
Die Active Directory-UDF von water benutze ich nicht, aber so solltest Du verschachtelte Gruppenmitgliedschaften auslesen können.
[autoit]
Global $Err = ObjEvent('AutoIt.Error', '_ComErr')
Func _IsMember($UserDN, $GroupDN)
Local $Group = ObjGet('LDAP://' & $GroupDN) ; As IADsGroup
For $Member In $Group.Members
If StringLower($Member.Class) = 'group' Then
If _IsMember($UserDN, $Member.distinguishedName) Then
Return True
EndIf
Else
If StringLower($Member.distinguishedName) = $UserDN Then
Return True
EndIf
EndIf
Next ; $Member
Return False
EndFunc ;==>_IsMember
Func _ComErr()
ConsoleWrite(StringFormat('\tFehlernummer: %s\n', Hex($Err.Number, 8)))
ConsoleWrite(StringFormat('\tBeschreibung: %s\n', $Err.Windescription))
SetError(1)
EndFunc ;==>_ComErr
Die Technologie "Windows Management Instrumentation" (WMI) ermöglicht neben den Zugriff auf alle Arten von Systeminformationen, auch den Zugriff auf das Dateisystem. Solltest Du entfernte Computer abfragen müssen, hilft Dir die Möglichkeit mittels WMI auch auf entferne Systeme zugreifen zu können; vorausgesetzt Du hast die notwendigen Rechte (WMI-Remoting)
AutoItSetOption('MustDeclareVars', 1)
_ListNullByteFiles('c:\windows', True)
Func _ListNullByteFiles($FolderPath, $Recurse = False, $Computer = '.')
Local $WMIService = ObjGet(StringFormat('winmgmts:\\\%s\\root\\cimv2', $Computer))
Local $FolderList = $WMIService.ExecQuery( _
StringFormat( _
'Associators of {Win32_Directory.Name=''%s''} ' & _
'WHERE AssocClass = Win32_Subdirectory ' & _
'ResultRole = PartComponent', $FolderPath))
For $Folder In $FolderList
ConsoleWrite(StringFormat('Verzeichnis: %s\n', $Folder.Name))
; --- Verzeichnispfad "escapen"
Local $Parts = StringSplit($Folder.Name, '\')
Local $Path = ''
For $i = 2 To UBound($Parts) - 1
$Path = StringFormat('%s\\\%s', $Path, $Parts[$i])
Next
$Path = StringFormat('%s\\\', $Path)
; ---
Local $FileList = $WMIService.ExecQuery( _
StringFormat( _
'SELECT FileName, FileSize ' & _
'FROM CIM_DataFile ' & _
'WHERE Path = ''%s'' AND FileSize = 0', $Path))
For $File In $FileList
ConsoleWrite(StringFormat('\t%s %s Byte\n', _
$File.FileName, $File.FileSize))
Next ; File
If $Recurse Then
_ListNullByteFiles($Folder.Name)
EndIf
Next ; $Folder
EndFunc ;==>_ListNullByteFile
Warum die Textdatei nicht mittels ADO einlesen und auswerten?
AutoItSetOption('MustDeclareVars', 1)
; Konstanten bitte anpassen
Const $DIRECTORY = 'C:\Dokumente und Einstellungen\Administrator\Desktop\cvsexample\'
Const $TEXT_FILE = 'daten.txt'
; ---
Const $REGKEY_PATH = 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text'
Dim $Buffer = ''
If StringLower(RegRead($REGKEY_PATH, 'Format')) <> 'tabdelimited' Then
$Buffer = RegRead($REGKEY_PATH, 'Format')
RegWrite($REGKEY_PATH, 'Format', 'REG_SZ', 'TabDelimited')
EndIf
Dim $con = ObjCreate('ADODB.Connection')
Dim $rs = ObjCreate('ADODB.RecordSet')
$con.Provider = 'Microsoft.Jet.OLEDB.4.0'
$con.ConnectionString = StringFormat( _
'Data Source="%s";' & _
'Extended Properties="text;HDR=NO";', _
$DIRECTORY)
$con.Open
$rs.Open(StringFormat( _
'SELECT F2, SUM(F1), COUNT(F2), AVG(F1) ' & _
'FROM %s ' & _
'GROUP BY F2', $TEXT_FILE), $con)
ConsoleWrite(StringFormat('%-10s%-10s%-10s%s\n', 'Wert', 'Summe', 'Anzahl', 'Durschnitt'))
While Not $rs.EOF
ConsoleWrite(StringFormat('%-10s%-10s%-10s%s\n', _
$rs.Fields(0).Value, $rs.Fields(1).Value, $rs.Fields(2).Value, $rs.Fields(3).Value))
$rs.MoveNext()
WEnd
$rs.Close()
$con.Close()
If $Buffer <> '' Then
RegWrite($REGKEY_PATH, 'Format', 'REG_SZ', $Buffer)
EndIf