UAC (User AccountControl) ist die benutzerkontensteuerung. Man kann die abschalten. Es gibt von Microsoft einen KB Artikel dazu. Dann läuft dein Win7 in einem XP Security Mode und es kommen keine Sicherheitsabfragen mehr. Ich weiss aber nicht ob man das so ohne weiteres ein und ausschalten kann ohne das System booten zu müssen oder den anwender abmelden. Musst du testen. Ich verstehe aber dein Problem nicht. Wenn der Anwender die Installation selber starten muss, dann kann er doch auch die Sicherheitsabfrage bestätigen. Wenn du es aber z.B per Policy installieren willst, dann wird es im SYSTEM Kontext laufen.
Beiträge von edmann
-
-
Du brauchst:
1. Der User mit dem das Script ausgeführt wird muss auf dem remote PC lokaler Admin sein.
2. Firewall aus
3. DCOM Rechte (remote launch und remote execute) was aber beim Admin immer der Fall sein sollte. -
Hi Nerad.
Das Problem liegt am UAC von Windows 7. Du hast nur die Möglichkeit UAC zu deaktivieren (was aber nicht so schön ist) oder dein Skript mit runas im Administrator Modus zu starten (Nachtel: Passwort muss eingegeben werden) oder die Installation (so wie es alle Software Distribution Tools machen) aus einem Service heraus im SYSTEM Kontext auszuführen. So wie es jetzt ist wirst du nicht drum herum kommen das der Anwender die UAC Meldung bestätigen muss. -
Hallo progandy. Könntest du die Änderung der _MD5ForFile trotzdem mal posten. (wenn's keine großen Umstände macht)
Vielen Dank... -
Super. Funktioniert!!! Vielen Dank. Weiss garnicht warum ich da nicht selber darauf gekommen bin
[autoit]
Mich wundert nur warum es hier geht, denn die Funktion arbeitet sehr ähnlich der in der Hash.au3. Hier wird auch am Anfang das gesamte File mit
[/autoit]
$bTempData = FileRead($hFile, 512 * 1024)
[autoit]
eingelesen und dann mit
[/autoit]
$hHashObject = _Crypt_HashData($bTempData, $iALG_ID, False, $hHashObject)
der Hash gebildet. Im Taskmanager sieht man aber dass der Speicherverbrauch des Tasks nie über 6-7MB hinaus geht.
Sehr seltsam... Aber wie auch immer, Hauptsache es funktioniert
-
Mal ne andere Frage. Warum ist es überhaupt nötig die gasamte Datei in den Speicher einzulesen? Kann man den Hash nicht direkt von der Platte erstellen? Ich weiss, es würde daduch bedeutend langsamer laufen, würde aber wenigstens funktionieren.
-
Klingt einleuchtend
Kennt jemand evtl. eine andere Möglichkeit oder andere Funktion, mit der man in AutoIt auch von großen Dateien MD5 Hashes erstellen kann? -
Hallo,
ich habe ein Problem mit der Funktion _MD5ForFile aus der Hash.au3 einen MD5 Hash für größere (>1GB) Dateien zu erstellen. Die Funktion bricht immer mit dem Error 3 ab, was laut Beschreibung "3 - MapViewOfFile function or call to it failed" bedeutet. Ich habe schon einige Tests durchgeführt und festgestellt das es mit der RAM Größe im System zusammenhängt. Die Funktion versucht die gesamte Datei in den RAM zu laden um den Hash zu erstellen und wenn im PC nicht genügend RAM vorhanden ist, kommt diese Fehlermeldung. In der MSDN habe ich dann auch entsprechende Hinweise dazu gefunden.
http://msdn.microsoft.com/en-us/library/…1(v=vs.85).aspx
"For files that are larger than the address space, you can only map a small portion of the file data at one time. When the first view is complete, you can unmap it and map a new view"
[autoit]
Weiss einer von euch wie man diese Funktion so erweitert, dass sie die Dateien in kleineren Blöcken bearbeitet?
Vielen Dank schon mal...
[/autoit][autoit][/autoit][autoit]
; #FUNCTION# ;===============================================================================
;
; Name...........: _MD5ForFile
; Description ...: Calculates MD5 value for the specific file.
; Syntax.........: _MD5ForFile ($sFile)
; Parameters ....: $sFile - Full path to the file to process.
; Return values .: Success - Returns MD5 value in form of hex string
; - Sets @error to 0
; Failure - Returns empty string and sets @error:
; |1 - CreateFile function or call to it failed.
; |2 - CreateFileMapping function or call to it failed.
; |3 - MapViewOfFile function or call to it failed.
; |4 - MD5Init function or call to it failed.
; |5 - MD5Update function or call to it failed.
; |6 - MD5Final function or call to it failed.
; Author ........: trancexx
;
;==========================================================================================
Func _MD5ForFile($sFile)Local $a_hCall = DllCall("kernel32.dll", "hwnd", "CreateFileW", _
[/autoit][autoit][/autoit][autoit]
"wstr", $sFile, _
"dword", 0x80000000, _ ; GENERIC_READ
"dword", 1, _ ; FILE_SHARE_READ
"ptr", 0, _
"dword", 3, _ ; OPEN_EXISTING
"dword", 0, _ ; SECURITY_ANONYMOUS
"ptr", 0)If @error Or $a_hCall[0] = -1 Then
[/autoit][autoit][/autoit][autoit]
Return SetError(1, 0, "")
EndIfLocal $hFile = $a_hCall[0]
[/autoit][autoit][/autoit][autoit]$a_hCall = DllCall("kernel32.dll", "ptr", "CreateFileMappingW", _
[/autoit][autoit][/autoit][autoit]
"hwnd", $hFile, _
"dword", 0, _ ; default security descriptor
"dword", 2, _ ; PAGE_READONLY
"dword", 0, _
"dword", 0, _
"ptr", 0)If @error Or Not $a_hCall[0] Then
[/autoit][autoit][/autoit][autoit]
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
Return SetError(2, 0, "")
EndIfDllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
[/autoit][autoit][/autoit][autoit]Local $hFileMappingObject = $a_hCall[0]
[/autoit][autoit][/autoit][autoit]$a_hCall = DllCall("kernel32.dll", "ptr", "MapViewOfFile", _
[/autoit][autoit][/autoit][autoit]
"hwnd", $hFileMappingObject, _
"dword", 4, _ ; FILE_MAP_READ
"dword", 0, _
"dword", 0, _
"dword", 0)If @error Or Not $a_hCall[0] Then
[/autoit][autoit][/autoit][autoit]
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
Return SetError(3, 0, "")
EndIfLocal $pFile = $a_hCall[0]
[/autoit][autoit][/autoit][autoit]
Local $iBufferSize = FileGetSize($sFile)Local $tMD5_CTX = DllStructCreate("dword i[2];" & _
[/autoit][autoit][/autoit][autoit]
"dword buf[4];" & _
"ubyte in[64];" & _
"ubyte digest[16]")DllCall("advapi32.dll", "none", "MD5Init", "ptr", DllStructGetPtr($tMD5_CTX))
[/autoit][autoit][/autoit][autoit]If @error Then
[/autoit][autoit][/autoit][autoit]
DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
Return SetError(4, 0, "")
EndIfDllCall("advapi32.dll", "none", "MD5Update", _
[/autoit][autoit][/autoit][autoit]
"ptr", DllStructGetPtr($tMD5_CTX), _
"ptr", $pFile, _
"dword", $iBufferSize)If @error Then
[/autoit][autoit][/autoit][autoit]
DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
Return SetError(5, 0, "")
EndIfDllCall("advapi32.dll", "none", "MD5Final", "ptr", DllStructGetPtr($tMD5_CTX))
[/autoit][autoit][/autoit][autoit]If @error Then
[/autoit][autoit][/autoit][autoit]
DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
Return SetError(6, 0, "")
EndIfDllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
[/autoit][autoit][/autoit][autoit]
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)Local $sMD5 = Hex(DllStructGetData($tMD5_CTX, "digest"))
[/autoit][autoit][/autoit][autoit]Return SetError(0, 0, $sMD5)
[/autoit][autoit][/autoit][autoit]EndFunc ;==>_MD5ForFile
[/autoit] -
Problem gelöst. Hatte nichts mit dem Array zu tun, Das Array war OK. Die Übergabe an das Object hat nicht funktioniert
[autoit]
[/autoit]
Local $aOperands[1]
$aOperands[0] = $oExpression
$oCondition.Operands = $aOperands
$oGroup.Condition = $oCondition
[autoit]
Problem war in der letzten Zuweisung. Diese habe ich wie folgt geändert
[/autoit]
$oGroup.Properties_.Item("Condition") = $oCondition
und schon hat es funktioniert.Abschließend noch eine Frage an Leute, die sich mit der WMI Programmierung auskennen.
Warum funktionieren in den meißten Fällen die einfachen zuweisungen wie
$oCondition.Operands = $aOperands
und in anderen Fällen muss man es so zuweisen
$oGroup.Properties_.Item("Condition") = $oConditionWeiss jemand womit das zusammen hängt? In VBS scheint es keine Rolle zu spielen. Dort funktioniert auch die einfache Zuweisung
group.Condition=condition
AutoIT scheint hier knirschiger zu sein.Vielen Dank für eure Unterstützung!!!
-
Die Funktion erzeugt eine Tasksequence in MS SCCM 2007. Mit nachstellen wird es schwierig, da hast du Recht. Da kann ich dir nur anbieten den Code hier zu posten, ich werde es dann in meine VM ausprobieren und das Ergebnis zurück posten. Ich denke das ist auch garnicht der springende Punkt, sondern warum gibt es einen Unterschied zwischen operands=Array(oExpression) und operands(0)=oExpression. Letzteres erzeugt sogar eine Fehlermeldung "Microsoft VBScript runtime error: Object doesn't support this property or method: 'operands'". Wobei mir diese Fehlermeldung auch ziemlich spanisch vorkommt. Normalerweise kommt sie nur dann wenn ich versuche eine Methode aufzurufen oder Propery zu setzen die es nicht gibt. Hier versuche ich aber in einem Arrayfeld ein Objekt abzuspeichern. Sehr seltsam. Ich habe im SDK ein C# Beispiel gefunden.
Spoiler anzeigen
public void AddRegistryCondition(
WqlConnectionManager connection,
IResultObject taskSequenceStep)
{
try
{
IResultObject condition;if (taskSequenceStep["Condition"].ObjectValue == null)
{
// Create a new condition.
condition = connection.CreateEmbeddedObjectInstance("SMS_TaskSequence_Condition");
}
else
{ // Get the existing condition.
condition = taskSequenceStep.GetSingleItem("Condition");
}// Create and populate the expression.
IResultObject registryExpression = connection.CreateEmbeddedObjectInstance("SMS_TaskSequence_RegistryConditionExpression");registryExpression["KeyPath"].StringValue = @"HKEY_LOCAL_MACHINE\MICROSOFT";
registryExpression["Operator"].StringValue = "exists";
registryExpression["Type"].StringValue = "REG_SZ";
registryExpression["Data"].StringValue = null;// Get the operands and add the expression.
List<IResultObject> operands = condition.GetArrayItems("Operands");
operands.Add(registryExpression);// Add the expresssion to the list of operands.
condition.SetArrayItems("Operands", operands);// Add the condition to the sequence.
taskSequenceStep.SetSingleItem("Condition", condition);
}
catch (SmsException e)
{
Console.WriteLine("Failed to create Task Sequence: " + e.Message);
throw;
}
}Hier wird es nicht mit einem Array sondern mit einem List Type gemacht
CodeList<IResultObject> operands = condition.GetArrayItems("Operands"); operands.Add(registryExpression); condition.SetArrayItems("Operands", operands);
Gibt es in AutoIT evtl eine Möglichkeit so etwas zu realisieren? -
Hallo BugFix,
du bist doch ein Array Profi. Ist meine Annahme mit der Array Funktion richtig gewesen? Wird bei der Zuweisung
ein 1D Array erzeugt mit einem Feld, bei dem operands(0) das Objekt oExpression enthält oder kommt dabei was ganz anderes raus? Was mir nicht ganz einleuchtend ist, warum funktioniert die Zuweisung
aber nicht die
obwohl das ja eigentlich gleich ist. Gibt es in AutoIT etwas vergleichbares zu der VBS Array Funktion?
Die Idee mit den Collections ist mir auch schon gekommen, ich weiss aber nicht wie ich in AutoIT eine Collection erzeugen kann. Bis jetzt hatte ich mit Collections nur als Ergebnis irgend welcher Abfragen zu tun. -
Hallo zusammen,
mal wieder stehe ich vor einem Problem und brauche eure Unterstützung. Ich versuche gerade einige Funktionen aus dem SCCM SDK vom VBS ins AutoIT zu portieren. Bin dabei auf ein Problem gestoßen, welches ich mir erstmal nicht erklären kann und auch keine Lösung dafür finde. Dabei geht es um speichern von Objekten in einem Array und Übergabe des Arrays als Parameter an weitere Objekte. So, lange Rede kurzer Sinn, hier erstmal die beiden Funktionen
1. Original VBS aus dem SDK
Code
Alles anzeigenSub AddTaskSequenceGroup(connection, taskSequence, name, description) Dim group Dim steps Dim operands ' Create and populate the group. Set group = connection.Get("SMS_TaskSequence_Group").SpawnInstance_ group.Name=name group.Description=description group.Enabled=True group.ContinueOnError=False Set condition = connection.Get("SMS_TaskSequence_Condition").SpawnInstance_ Set oExpression = connection.Get("SMS_TaskSequence_VariableConditionExpression").SpawnInstance_ oExpression.Variable = "TESTVAR" oExpression.Operator = "equals" oExpression.Value = "1.0.0.0" ' Add the condition. operands=Array(oExpression) condition.Operands=operands group.Condition=condition ' Add step to task sequence steps = Array(group) taskSequence.Steps = steps End Sub2. Meine AutoIT Portierung
[autoit]
[/autoit]
Func AddTaskSequenceGroup($oConnection, $oTaskSequence, $sName, $sDescription)
Local $oGroup
Local $aSteps[1]
Local $aOperands[1]
$oGroup = $oConnection.Get("SMS_TaskSequence_Group").SpawnInstance_()
$oGroup.Name = $sName
$oGroup.Description = $sDescription
$oGroup.Enabled = True
$oGroup.ContinueOnError = False
$oCondition = $oConnection.Get("SMS_TaskSequence_Condition").SpawnInstance_()
$oExpression = $oConnection.Get("SMS_TaskSequence_VariableConditionExpression").SpawnInstance_()
$oExpression.Variable = "TESTVAR"
$oExpression.Operator = "equals"
$oExpression.Value = "1.0.0.0"
ReDim $aOperands[UBound($oCondition.Operands)+1]
$aOperands[UBound($oCondition.Operands)] = $oExpression
$oCondition.Operands = $aOperands
$oGroup.Condition = $oCondition
ReDim $aSteps[UBound($oTaskSequence.Steps)+1]
$aSteps[UBound($oTaskSequence.Steps)] = $oGroup
$oTaskSequence.Steps = $aSteps
EndFuncAls Ergebnis kommt beim Original eine Tasksequence mit einem Step, der Gruppe raus und diese hat eine Variable als Condition. So wie es sein soll. Bei meiner Variante kommt erstmal auch eine Tasksequence mit einem Step, der Gruppe raus, diese hat aber keine Condition. Ich habe stark die Vermutung das es an dieser Zuweisung liegt:
Wenn ich mich nicht irre erzeut doch die erste Zeile ein eindimensionales Array mit einem Feld, welches den Index 0 hat. Diesem Feld wird gleichzeitig das Objekt oExpression zugewiesen. Rein theoretisch könnte man doch diese Zuweisung auch durch folgende ersetzen
[autoit]
Leider funktioniert dieses Beispiel nicht. Wenn ich die Zuweisung so modifiziere, bekomme ich beim Ausführen vom VBS folgende Fehlermeldung:
Microsoft VBScript runtime error: Object doesn't support this property or method: 'operands'
Dieser Code entspricht aber ziemlich genau dem AutoIT Code von oben (vereinfacht dargestellt):
[/autoit]
Local $aOperands[1]
$aOperands[0] = $oExpression
$oCondition.Operands = $aOperands
Was mich auch zu der Vermutung geführt hat, das es mit der Array Zuweisung zu tun hat. Die Frage ist ob man die VBS Zuweisung
operands=Array(oExpression) irgendwie in AutoIT realisieren kann. Vielleich gibt es auch eine ganz andere Möglickeit. Evtl anstatt eines Arrays eine Collection oder eine ArrayList zu verwenden. Ich weiss aber nicht wie man sowas realisieren kann.Vielen Dank schon mal...
Freue mich über eure Antworten -
Danke für den Tip. Habe schlicht nicht gefunden wie man es macht.
-
Problem gelöst.
[autoit]
Ich habe die Zeilen
[/autoit]
$oInParams.TaskSequence = $oTaskSequence
$oInParams.TaskSequencePackage = $oTaskSequencePackageduch:
[autoit]
[/autoit]
$oInParams.Properties_.Item("TaskSequence") = $oTaskSequence
$oInParams.Properties_.Item("TaskSequencePackage") = $oTaskSequencePackageersetzt und schon hats funktioniert.
Lösung gefunden unter:
http://msdn.microsoft.com/en-us/library/…4(v=vs.85).aspxVielen Dank für eure Unterstützung.
-
Vielen Dank für die Antwort. Leider hats nicht funktioniert. Gleiche Fehlermeldung:
D:\test.au3 (25) : ==> The requested action with this object has failed.:
$oOutParams = $oConnection.ExecMethod("SMS_TaskSequencePackage", "SetSequence", $oInParams, Default, Default)
$oOutParams = $oConnection.ExecMethod("SMS_TaskSequencePackage", "SetSequence", $oInParams, Default, Default)^ ERRORWenn man in VBS Parameter weglässt, werden sich doch automatisch mit Null ersetzt? Entspricht der Default dem Null wert?
-
Hallo zusammen,
ich brauche mal wieder eure Hilfe. Ich versuche einen VBS Code in AutoIt zu portieren. Es geht darum eine Tasksequence in SCCM 2007 zu erstellen. In VBS funktioniert es wunderbar. In AutoIt bekomme ich eine Fehlermeldung:
G:\Test.au3 (25 : ==> The requested action with this object has failed.:
$oOutParams = $oConnection.ExecMethod("SMS_TaskSequencePackage", "SetSequence", $oInParams)
$oOutParams = $oConnection.ExecMethod("SMS_TaskSequencePackage", "SetSequence", $oInParams)^ ERRORund hier der AutoIt Code dazu:
[autoit]
[/autoit][autoit][/autoit][autoit]
Global $strSmsServer = "."$oSwbemLocator = ObjCreate("WbemScripting.SWbemLocator")
[/autoit]
$oSwbemConnection = $oSwbemLocator.ConnectServer($strSmsServer, "root\sms")
$oProviderLoc = $oSwbemConnection.InstancesOf("SMS_ProviderLocation")
For $oLocation In $oProviderLoc
If $oLocation.ProviderForLocalSite = True Then
$oSwbemConnection = $oSwbemLocator.ConnectServer($oLocation.Machine, "root\sms\site_" & $oLocation.SiteCode)
$sSiteCode = $oLocation.SiteCode
ExitLoop
EndIf
Next
$oConnection = $oSwbemConnection
$oTaskSequence = $oConnection.Get("SMS_TaskSequence").SpawnInstance_()
$oTaskSequencePackage = $oConnection.Get("SMS_TaskSequencePackage").SpawnInstance_()
$oTaskSequencePackage.Name = "New task sequence package"
$oTaskSequencePackage.Description = "A new task sequence package description"
$oPackageClass = $oConnection.Get("SMS_TaskSequencePackage")
$oInParams = $oPackageClass.Methods_("SetSequence").inParameters.SpawnInstance_()
$oInParams.TaskSequence = $oTaskSequence
$oInParams.TaskSequencePackage = $oTaskSequencePackage
$oOutParams = $oConnection.ExecMethod("SMS_TaskSequencePackage", "SetSequence", $oInParams)Zum Vergleich hier der VBS Code
Code
Alles anzeigenserver = "." Set swbemLocator = CreateObject("WbemScripting.SWbemLocator") Set swbemServices= swbemLocator.ConnectServer _ (server, "root\sms") Set providerLoc = swbemServices.InstancesOf("SMS_ProviderLocation") For Each location In providerLoc If location.ProviderForLocalSite = True Then Set swbemServices = swbemLocator.ConnectServer _ (location.Machine, "root\sms\site_" + _ location.SiteCode) Set connection = swbemServices End If Next set taskSequence = connection.Get("SMS_TaskSequence").SpawnInstance_() ' Create the new package object. Set taskSequencePackage = connection.Get("SMS_TaskSequencePackage").SpawnInstance_() ' Populate the new package properties. taskSequencePackage.Name = "New task sequence package" taskSequencePackage.Description = "A new task sequence package description" ' Get the parameters object. Set packageClass = connection.Get("SMS_TaskSequencePackage") Set objInParams = packageClass.Methods_("SetSequence"). _ inParameters.SpawnInstance_() ' Add the input parameters. objInParams.TaskSequence = taskSequence objInParams.TaskSequencePackage = taskSequencePackage ' Add the sequence. Set objOutParams = connection.ExecMethod("SMS_TaskSequencePackage", "SetSequence", objInParams)Die Beschreibung der Klasse gibt es hier:
http://msdn.microsoft.com/en-us/library/cc144760.aspxWäre echt cool wenn jemand eine Idee hätte wo das Problem liegt.
Vielen Dank schon mal... -
Hallo,
ich brauche mal wieder eure Unterstützung. Hat einer von euch schon mal ein compiliertes AutoIt script mit native service control funktionen geschrieben?
Ich habe schon viele Beiträge zu diesem Thema gelesen aber fast alle benutzen die srvany.exe um das Problem zu lösen.
Es gibt einige Beiträge die erklären wie man die Funktionen der ADVAPI.DLL benutzen kann um Dienste zu steuern oder andere Programme als Dienst zu installieren.
Es gibt auch einen Beitrag im englischen Forum, der so ziemlich in die Richtung geht die ich brauche
http://www.autoitscript.com/forum/index.php?showtopic=80201
aber es funktioniert leider nicht sauber. Ich habe aber leider nichts gefunden wo beschrieben wird wie man das eigene Script dazu befähigt als Dienst zu agieren, auf die Befehle von SCM zu reagieren und einen sauberen Status an den SCM zurück zu liefern. Ich bin mir nicht sicher ob es überhaupt möglich ist in AutoIt einen Service zu programmieren. In den vielen Beiträgen habe ich gelesen das dafür eine Multithreading Unterstützung benötigt wird, die AutoIt nicht hat.Vielen Dank schon mal für eure Hilfe.
-
Hallo,
vielen Dank für eure Unterstützung.
Ich habs getestet und es funktioniert
-
Gibt es vielleicht eine Möglichkeit anstatt einen Pointer auf einen Struct einen Pointer auf einen Array zu übergeben?
Ich habe gestern damit noch rumgespielt aber keine Möglichkeit gefunden einen Pointer von einem Array zu ermitteln.
Sowas wie GetPtr($Array[]) gibt es in AutoIt nicht oder ich habs zumindest nicht gefunden.Gruß
Edmann -
Hallo Greenhorn
[autoit]
habe deinen Code getestet. Vielen Dank noch mal. Damin komme ich auf jeden fall weiter als mit meiner Version. Leider funktioniert es noch nicht ganz. Vielleicht kannst du mich noch mal unterstützen.
Ich habe deinen Code wie folgt erweitert:
[/autoit][autoit][/autoit][autoit]
Global Const $ADDPROP_NONE = 0x00000000
Global Const $ADDPROP_GUID = 0x00000002
Global Const $ADDPROP_KEY = 0x00000008
Global Const $ADDPROP_ARRAY = 0x00000010
Global Const $ADDPROP_NAME = 0x00000044
Global Const $MAX_STRING = 255 ; hier die max. Stringlänge
; For SMS 2003, this value cannot be greater than 900 characters.
; For SMS 2.0, this value cannot be greater than 255 characters.Global $strSite = "P01"
[/autoit][autoit][/autoit][autoit]
Global $strComputer = "TESTPC"
Global $strDdrFileName = "TEST.DDR"
Global $strOS = "Windows XP Professional"
Global $strDomainName = "TEST.LOCAL"Global $arrGroups = DllStructCreate ("char [" & $MAX_STRING & "];" & _
[/autoit][autoit][/autoit][autoit]
"char [" & $MAX_STRING & "];")DllStructSetData ($arrGroups, 1, "GROUP1")
[/autoit][autoit][/autoit][autoit]
DllStructSetData ($arrGroups, 2, "GROUP2")Global $arrOUs = DllStructCreate ("char [" & $MAX_STRING & "];" & _
[/autoit][autoit][/autoit][autoit]
"char [" & $MAX_STRING & "];")DllStructSetData ($arrOUs, 1, "OU1")
[/autoit][autoit][/autoit][autoit]
DllStructSetData ($arrOUs, 2, "OU2")Global $arrContainer = DllStructCreate ("char [" & $MAX_STRING & "];")
[/autoit][autoit][/autoit][autoit]DllStructSetData ($arrContainer, 1, "")
[/autoit][autoit][/autoit][autoit]Global $SMSRsGendll = DllOpen("SMSRsGen.dll")
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
DDRNew("System", "SMS_AD_SYSTEM_GROUP_DISCOVERY_AGENT", $strSite)
DDRAddString("Netbios Name", $strComputer, 64, $ADDPROP_KEY)
DDRAddString("Operating System Name and Version", $strOS, 64, $ADDPROP_KEY)
DDRAddString("Resource Domain OR Workgroup", $strDomainName, 64, $ADDPROP_KEY)
DDRAddStringArray("System Group Name", DllStructGetPtr ($arrGroups), 2, $MAX_STRING, $ADDPROP_ARRAY)
DDRAddStringArray("System OU Name", DllStructGetPtr ($arrOUs), 2, $MAX_STRING, $ADDPROP_ARRAY)
DDRAddStringArray("System Container Name", DllStructGetPtr ($arrContainer), 1, $MAX_STRING, $ADDPROP_ARRAY)
DDRWrite($strDdrFileName)
DllClose($SMSRsGendll)Func DDRNew ($sArchitecture, $sAgentName, $sSiteCode)
[/autoit][autoit][/autoit][autoit]
Local $aRes = DllCall($SMSRsGendll, "int", "DDRNew", _
"str", $sArchitecture, _
"str", $sAgentName, _
"str", $sSiteCode)
Return $aRes[0]
EndFuncFunc DDRAddStringArray ($sName, $sArray, $nArraySize, $nSQLWidth, $dwFlags)
[/autoit][autoit][/autoit][autoit]
Local $aRes = DllCall($SMSRsGendll, "int", "DDRAddStringArray", _
"str", $sName, _
"ptr", $sArray, _
"int", $nArraySize, _
"int", $nSQLWidth, _
"dword", $dwFlags)
Return $aRes[0]
EndFuncFunc DDRAddString ($sName, $sValue, $nSQLWidth, $dwFlags)
[/autoit][autoit][/autoit][autoit]
Local $aRes = DllCall($SMSRsGendll, "int", "DDRAddString", _
"str", $sName, _
"str", $sValue, _
"int", $nSQLWidth, _
"dword", $dwFlags)
Return $aRes[0]
EndFuncFunc DDRWrite ($sFileName)
[/autoit]
Local $aRes = DllCall($SMSRsGendll, "int", "DDRWrite", _
"str", $sFileName)
Return $aRes[0]
EndFuncDamit kann ich schon mal eine TEST.DDR Datei erzeugen (liegt bei unbenannt in TEST.TXT)
Allerdings sind die Array Werte leer
<16><System Group Name><11><255>
BEGIN_ARRAY_VALUES
<>
<>
END_ARRAY_VALUES
END_PROPERTY
BEGIN_PROPERTY
<16><System OU Name><11><255>
BEGIN_ARRAY_VALUES
<>
<>
END_ARRAY_VALUES
END_PROPERTYIn den beiden ersten <> müsste GROUP1 und GROUP2 und in den zweiten <> dann OU1 und OU2
Für den Test habe ich die SMSRsGen.dll aus dem SCCM 2007 SDK 4.0 verwendet (liegt bei)
Hoffe ich habe nichts vergessen.
Vielen Dank.Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.