Striponly! Na klar!
Das ist doch mal eine gute Erfindung!
Ich glaube, ich werde es so machen.
Vielen Dank an alle!
Gruss Veronesi
Striponly! Na klar!
Das ist doch mal eine gute Erfindung!
Ich glaube, ich werde es so machen.
Vielen Dank an alle!
Gruss Veronesi
Hallo Water,
ganz ehrlich: Deine AD UDF ist genial! Auch die Beispiele. Da werde ich sicher einiges daraus gebrauchen können!
Trotzdem wäre es mir manchmal lieber, eine Funktion selber zu schreiben, um sie auch zu verstehen!
Den Obfuscator setze ich eher weniger ein, da er mir auch schon ein Script zerschossen hat. (Gut er macht ja vorher ein Backup.... - trotzdem)
Lange rede, kurzer Sinn: Deine UDF werde ich sicher verwenden. Aber einiges möchte ich auch selber machen.
Gruss Veronesi
Nun besteht noch folgendes Problem:
Wenn eine Eigenschaft bei dem bestimmten Benutzer nicht ausgefüllt ist, dann bricht AutoIt ab. Ich möchte dies aber abfangen und einfach einen leeren String haben!
Wie geht das?
Hier das Script:
#include "S:\UE_Std\TestPC\Source\Functions\Func_GetFQDN.au3"
Dim $FQDN = _GetFQDN(InputBox("Benutzernamen eingeben", "Bitte geben Sie den Benutzernamen ein, über welchen Sie etwas wissen möchten", @UserName))
Dim $sInfo = ""
$oIADsUser = ObjGet("LDAP://" & $FQDN) ;http://msdn.microsoft.com/en-us/library/…0(v=VS.85).aspx / http://msdn.microsoft.com/en-us/library/…0(v=VS.85).aspx
If Not @error And IsObj($oIADsUser) Then
$sInfo &= "Name: " & @TAB & @TAB & $oIADsUser.Get("displayName") & @LF
$sInfo &= "Abteilung: " & @TAB & $oIADsUser.Get("description") & @LF
$sInfo &= "Geschäftsnummer: " & @TAB & $oIADsUser.Get("telephoneNumber") & @LF
$sInfo &= "Natelnummer: " & @TAB & $oIADsUser.Get("mobile") & @LF
$sInfo &= "Fax: " & @TAB & @TAB & $oIADsUser.Get("facsimileTelephoneNumber") & @LF
EndIf
MsgBox(64, "Info", $sInfo)
$oIADsUser = 0
Und hier die benötigte _GetFQDN UDF:
#cs
==================================================================================
Function: _GetFQDN($User)
Description: Returns the FQDN (Fully Qualified Domain Name) of the given user
Parameter(s): $User = @Username
Return Value(s): On Success - Return FQDN String (@Error = 0)
On Failure: - Return 0, @ERROR <> 0
Author(s): Veronesi
http://www.cb-net.co.uk/index.php?opti…script&Itemid=8
==================================================================================
#ce
#include-once
[/autoit] [autoit][/autoit] [autoit]Func _GetFQDN($User = @UserName)
Local $oRoot, $oDomain, $fqDomain, $oConnection, $oCommand, $oRecordSet, $FQDN
$oRoot = ObjGet("LDAP://rootDSE")
If @error Or Not IsObj($oRoot) Then
$oRoot = 0
Return SetError(1, 1, 0)
EndIf
$oDomain = ObjGet("LDAP://" & $oRoot.Get("defaultNamingContext"))
If @error Or Not IsObj($oDomain) Then
$oRoot = 0
$oDomain = 0
Return SetError(2, 2, 0)
EndIf
$fqDomain = $oRoot.Get("defaultNamingContext")
[/autoit] [autoit][/autoit] [autoit]$oConnection = ObjCreate("ADODB.Connection")
If @error Or Not IsObj($oConnection) Then
$oConnection.Close
$oRoot = 0
$oDomain = 0
$oConnection = 0
Return SetError(3, 3, 0)
EndIf
$oConnection.Open("Provider=ADsDSOObject")
$oCommand = ObjCreate("ADODB.Command")
If @error Or Not IsObj($oCommand) Then
$oConnection.Close
$oRoot = 0
$oDomain = 0
$oConnection = 0
$oCommand = 0
Return SetError(4, 4, 0)
EndIf
$oCommand.ActiveConnection = $oConnection
[/autoit] [autoit][/autoit] [autoit]$oCommand.CommandText = "<LDAP://" & $fqDomain & ">;(&(objectCategory=" & "User" & ")" & "(samAccountName=" & $User & "));samAccountName,distinguishedName;subtree"
$oRecordSet = $oCommand.Execute
If $oRecordSet.RecordCount = 0 Then
$oConnection.Close
$oRoot = 0
$oDomain = 0
$oConnection = 0
$oCommand = 0
$oRecordSet = 0
Return SetError(5, 5, 0)
EndIf
$FQDN = $oRecordSet.Fields("distinguishedName").Value
$oConnection.Close
$oRoot = 0
$oDomain = 0
$oConnection = 0
$oCommand = 0
$oRecordSet = 0
Return $FQDN
EndFunc ;==>_GetFQDN
Gruss Veronesi
Ich habe nun herausgefunden, dass wenn ich den String "FullName" durch "displayName" ersetze, es funktioniert!
Aber woher kenne / finde ich diese Schlüsselwörter?
In http://msdn.microsoft.com/en-us/library/…0(v=VS.85).aspx heisst es eben "FullName"....
Hallo zusammen,
eines vorweg: ich weiss, dass es irgendwo eine AD.au3 gibt. Diese möchte ich jedoch nicht nutzen, da ich nur sehr wenig an der AD auslesen möchte, und das sonst Overkill wäre.
Zudem möchte ich auch selber etwas lernen ![]()
Also hier mein Problem: Ich möchte von einem gegebenen Benutzer gewisse Informationen (Voller Name, Telefonnummern etc.) aus dem Active Directory auslesen. Dazu gibt es diesen MSDN Artikel.
Die Groups kann ich auch in einer Schleife erfolgreich abfragen. Aber mit dem Rest funktioniert nichts....
Hier mein Script:
$FQDN = "CN=User,OU=General,OU=Departement,DC=company,DC=com"
[/autoit] [autoit][/autoit] [autoit]$oIADsUser = ObjGet("LDAP://" & $FQDN) ;http://msdn.microsoft.com/en-us/library/…0(v=VS.85).aspx
If @error Or Not IsObj($oIADsUser) Then MsgBox(0,"","Fehler1")
;*******************************Funktioniert!!!
For $Group In $oIADsUser.Groups
MsgBox(0,"",$Group.Name)
MsgBox(0,"",$Group.Description)
Next
;*******************************Funktioniert NICHT!!!
MsgBox(0,"",$oIADsUser.Get("FullName"))
$oIADsUser = 0
Vielleicht findet jemand einen Fehler!
Mit dem Programm kannst Du das auslesen.
Aber damit Du auf fremden PCs überhaupt die Registry auslesen kannst muss die Remoteregistry aktiviert sein!
Local $Username = @UserName
Local $Domain = @LogonDomain
Local $PW = "XYZ"
Local $RemotePC = "XYZ"
Local $RegistryPath = "HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate"
Local $RegistryKey = "WUServer"
Local $Program = '"' & @ComSpec & '" /c Reg Query \\' & $RemotePC & "\" & $RegistryPath & " /v " & $RegistryKey
Local $PID = RunAs($Username, $Domain, $PW, 0, $Program, @TempDir, @SW_HIDE, 0x2)
Local $Return = ""
While 1
$Return &= StdoutRead($PID)
If @error Then ExitLoop
WEnd
MsgBox(64, "Value", $Return)
[/autoit]Gruss Veronesi
Naja, Du kannst mit dem RunAs natürlich auch ein Dos Kommando abschicken.
Also z.B. den Befehl Reg Query \\HKLM\Software\Microsoft.......
Das Problem wird dann aber sein, dass Du ja den Wert von dem Schlüssel lesen möchtest..... Aber du bekommst nur die PID zurück...
Verwende RunAs in dem Du mit diesem Befehl ein zweites Script aufrufst. Dieses läuft dann unter dem anderen Benutzerkontext.
Die beiden Programme können Daten mithilfe des $STDIN_CHILD und $STDOUT_CHILD austauschen!
Manchmal ist die Lösung so nah.....
Hier ein zweites Script, welches ohne die externe devcon.exe auskommt und auch keine Admin-Rechte benötigt und erst noch schneller ist ![]()
Ansonsten die gleichen Einschränkungen / Features, wie die letzte UDF!
#cs
==================================================================================
Function: _GetPnPScreens()
Description: Rescan PnP Hardware and get all Registry Keys from PnP Screens
Parameter(s): -
Return Value(s): On Success - Return Array with registry keys, @ERROR = 0
On Failure: - Return 0, @ERROR <> 0
Author(s): Veronesi
==================================================================================
#ce
#include-once
#include <WinAPI.au3>
Func _GetPnPScreens()
Local $aGPU[1] = [0]
Local $aScreens[1] = [0]
Local $aEnumDisplayDevices
Local $iDevNum = 0
Local $iGPU
ShellExecuteWait(@WindowsDir & "\System32\DisplaySwitch.exe", "/extend") ;Force Windows 7 to read all screens!
While 1
$aEnumDisplayDevices = _WinAPI_EnumDisplayDevices("", $iDevNum) ;Find all GPU controllers
If $aEnumDisplayDevices[3] = 0 Then ExitLoop ;When Flag = 0 the end of all GPUs found
If Not BitAND($aEnumDisplayDevices[3], 4) Then ;Only if this device is no pseudo device (virtual screen)
If BitAND($aEnumDisplayDevices[3], 1) Then ;Only if this device is part of the desktop
$aGPU[0] += 1 ;Increment number of GPUs found
ReDim $aGPU[$aGPU[0] + 1]
$aGPU[$aGPU[0]] = $aEnumDisplayDevices[1]
EndIf
EndIf
$iDevNum += 1
WEnd
If Not IsArray($aGPU) Then Return SetError(1, 1, 0)
$iDevNum = 0
For $iGPU = 1 To $aGPU[0] ;For each GPU... find all screens
While 1
$aEnumDisplayDevices = _WinAPI_EnumDisplayDevices($aGPU[$iGPU], $iDevNum)
If $aEnumDisplayDevices[3] = 0 Then ExitLoop ;When Flag = 0 the end of all screens of this GPU found
If Not BitAND($aEnumDisplayDevices[3], 4) Then ;Only if this device is no pseude device (virtual screen)
If BitAND($aEnumDisplayDevices[3], 1) Then ;Only if this device is part of the desktop
$aScreens[0] += 1 ;Increment number of screens found
ReDim $aScreens[$aScreens[0] + 1]
$aScreens[$aScreens[0]] = $aEnumDisplayDevices[4]
EndIf
EndIf
$iDevNum += 1
WEnd
$iDevNum = 0
Next
If Not IsArray($aScreens) Then Return SetError(2, 2, 0)
For $iDevNum = 1 To $aScreens[0]
$aScreens[$iDevNum] = StringReplace(StringTrimLeft($aScreens[$iDevNum], 4), "#", "\")
Next
Return $aScreens
EndFunc ;==>_GetPnPScreens
Gruss Veronesi
Hallo zusammen!
So, ich habe nun eine Lösung, welche für mich funktioniert, und mit welcher ich die 8'000 Monitore testen kann.
Leider werden die EDID Daten nicht direkt vom Monitor gelesen. Das wäre das schönste!
Aber mit dem devcon.exe Tool von Microsoft kann ich doch wenigstens ein rescan der PnP Hardware durchführen und mir
dann alle Hardware-IDs von den angeschlossenen Monitoren zurückgeben lassen.
In diesen steht jeweils auch der Registry Schlüssel! (z.B. DISPLAY\HWP286E\5&F5BF76&0&UID41943312)
Alles was zwischen diesen beiden Backslash steht, ist der Herstellername.
Wenn die EDID Daten nicht gelesen werden konnte, steht dort DEFAULT_MONITOR
Da ich (momentan) nur wissen muss, ob EDID Daten empfangen wurden und wer der Hersteller ist, reicht mir das aus!
In meinen Test's hat diese Funktion immer den richtigen Wert zurückgeliefert - auch bei denen, bei welchen softMCCs versagt oder extrem lange gebraucht hat.
Die Funktion gibt ein Array zurück.
Index 0 = Anzahl gefundene Monitore
Index 1 - .... = jeweiliger Registry Key.
Dieses Array muss man dann nur noch nach DEFAULT_MONITOR durchsuchen, dann weiss man, ob von allen die EDID Daten gesendet wurden, oder nicht!
Die Hersteller ID kann man dann auch herausparsen!
Enjoy!
#cs
==================================================================================
Function: _GetPnPScreens()
Description: Rescan PnP Hardware and get all Registry Keys from PnP Screens
Parameter(s): -
Return Value(s): On Success - Return Array with registry keys, @ERROR = 0
On Failure: - Return 0, @ERROR <> 0
Author(s): Veronesi
==================================================================================
#ce
#RequireAdmin
#include-once
Func _GetPnPScreens()
Local $PID, $Timer, $Read, $aTmp, $aRead[1] = [0], $iGetPnPScreens
Local Const $Timeout = 5000
If Not FileExists(@TempDir & "\devcon.exe") Then FileInstall("S:\UE_Std\TestPC\Tools\DevCon\i386\devcon.exe", @TempDir & "\devcon.exe", 1)
RunWait('"' & @ComSpec & '" /c ' & @TempDir & '\devcon.exe rescan', @TempDir, @SW_HIDE) ;Rescan for new PnP hardware
$PID = Run('"' & @ComSpec & '" /c ' & @TempDir & '\devcon.exe hwids Monitor*', @TempDir, @SW_HIDE, 0x2) ;Get IDs from all screens
$Timer = TimerInit()
While 1
$Read &= StdoutRead($PID)
If @error Or TimerDiff($Timer) > $Timeout Then ExitLoop
Sleep(10)
WEnd
#cs
$Read =
DISPLAY\HWP286E\5&F5BF76&0&UID41943312
Name: PnP-Monitor (Standard)
Hardware ID's:
MONITOR\HWP286E
Compatible ID's:
*PNP09FF
DISPLAY\ENC2012\5&F5BF76&0&UID41943313
Name: PnP-Monitor (Standard)
Hardware ID's:
MONITOR\ENC2012
Compatible ID's:
*PNP09FF
2 matching device(s) found.
#ce
$aTmp = StringSplit($Read, @CRLF) ;Split into array
For $iGetPnPScreens = 1 To UBound($aTmp) - 1
If StringInStr($aTmp[$iGetPnPScreens], "DISPLAY\") Then ;Take only the registry string!
$aTmp[$iGetPnPScreens] = StringStripWS($aTmp[$iGetPnPScreens],
;Strip ALL spaces in the correct registry path (if any found)
$aRead[0] += 1 ;Increment number of found screens
ReDim $aRead[$aRead[0] + 1]
$aRead[$aRead[0]] = $aTmp[$iGetPnPScreens]
EndIf
Next
#cs
When in registry path the string "DEFAULT_MONITOR" is found, then this monitor didn't sent any EDID datas!
$aRead =
[0] | 2
[1] | DISPLAY\HWP286E\5&F5BF76&0&UID41943312
[2] | DISPLAY\ENC2012\5&F5BF76&0&UID41943313
#ce
If $aRead[0] = 0 Then Return SetError(1, 1, 0)
Return $aRead
EndFunc ;==>_GetPnPScreens
Gruss Veronesi
Hier habe ich noch einen älteren Code gefunden, der EDID Daten lesen soll. 3. Post!
Kann mir jemand sagen, ob das mit dem klappen könnte und kann den vielleicht sogar jemand in AutoIt übersetzen??????
Veronesi
So, leider habe ich keine mögliche Lösung gefunden.
Auch im softMCCs Forum habe ich einen negativen Bescheid bezüglich einer ansteuerbaren DLL bekommen.
Das ist sehr schade!
Ok. Dann danke ich!
Gruss Veronesi
Hallo zusammen,
ich habe eine Menge Strings, welche ein AutoIt Makro enthalten.
Also z.B. Teststringblablabla@YEARWeitererString.....
Das ganze ist ein STRING und wird aus einer Datenbank ausgelesen.
Was ist nun die eleganteste und schnellste Methode, um alle AutoIt speziellen Makros zu finden und durch die wirklichen Makros zu ersetzen?
Also der oben genannte String würde heute dann z.b. so lauten. Teststringblablabla2011WeitererString.....
Ich möchte nicht unbedingt alles mit StringReplace abarbeiten müssen!
Danke!
Den kenne ich nicht!
Ich schaue mir den mal an. Aber ein kurzer Blick auf der Homepage lässt mich vermuten, dass es wohl eher schwieriger wird, dies automatisiert und ohne Installation einzusetzen.
Doch ich schaue mir das morgen oder übermorgen mal an!
Hallo Progandy,
vielen Dank.
Das Tool habe ich schon getestet.
Ich glaube, es liesst wirklich nur aus der Registry!
Zudem funktioniert es leider bei meinem Monitortyp nicht.
==> Failed to extract the EDID record. <==
Sehr schade. Danke trotzdem!
Hier habe ich von einem Kollegen noch was bekommen.
Eine DLL und eine Hilfe.
Es ist von einem anderen Programm. Allerdings weiss ich nicht, wie es mit der Lizenz aussieht! Der Kollege hat das Programm gekauft......
Falls ich das hier nicht posten darf, dann sollen die Mods die Anhänge löschen!
Ansonsten: Vielleicht kann ja jemand mit dieser DLL was anfangen!
Veronesi
Es sind ja nicht nur die Chefs...
Ich könnte so eine Funktion auch gut in 2-3 anderen AutoIt Programmen gebrauchen.
Und da die Benutzer der Programme diverse Kriterien der Monitore überprüfen sollen (auf ganz speziellen und spezifischen Hintergrundbildern) würde das offene Fenster von softMCCS nur stören!!!
Wenn jemand dazu eine Idee hat, oder den Code doch irgendwie übersetzen kann, bin ich dankbar.
Ansonsten muss ich mich damit abfinden, die 8'000 Monitore manuell zu prüfen!
Aber mal schauen!
Ja, es wird wohl schon gehen, es zu automatisieren.
Aber die 8'000 Monitore, die damit geprüft werden sollen, werden mit diesem Tool falsch erkannt. (Stichproben bei 30 Monitoren)
Zudem dauerte es zT sehr lange (mehrere Minuten) bis die Daten gelesen wurden.
Manchmal geht's in wenigen Sekunden.....
Manchmal läuft es auf unserem (frisch aufgesetzten) Win 7 x64 gar nicht.
Dann muss man zwei oder dreimal neu booten, manchmal auch das softMCCS neu installieren - erst dann läuft es wieder!
Alles in allem wollte ich eine AutoIt Lösung, damit alles integriert ist und keine "unbekannten" externe Programme genutzt werden müssen!
Automatisieren ließe es sich vermutlich schon, aber die Zuverlässigkeit des gesamten Programmes hat die Chefs leider nicht überzeugt!
Schade!!!
Habe soeben im Forum gefragt ![]()
Aber ich denke, ich kenne die Antwort von denen...
Naja, fragen kostet nichts!
Wenn trotzdem jemand das C Script übersetzen kann... Bin gerne Abnehmer davon ;))
Veronesi