1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. edmann

Beiträge von edmann

  • #Require Admin Freeze

    • edmann
    • 6. August 2011 um 00:52

    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.

  • remote Prozess verwalten

    • edmann
    • 5. August 2011 um 17:20

    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.

  • #Require Admin Freeze

    • edmann
    • 5. August 2011 um 17:08

    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.

  • Hilfe bei der MD5 Hash Erstellung (Hash.au3)

    • edmann
    • 5. August 2011 um 16:52

    Hallo progandy. Könntest du die Änderung der _MD5ForFile trotzdem mal posten. (wenn's keine großen Umstände macht)
    Vielen Dank...

  • Hilfe bei der MD5 Hash Erstellung (Hash.au3)

    • edmann
    • 3. August 2011 um 17:26

    Super. Funktioniert!!! Vielen Dank. Weiss garnicht warum ich da nicht selber darauf gekommen bin ?( 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)

    [/autoit]


    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 :thumbup:

  • Hilfe bei der MD5 Hash Erstellung (Hash.au3)

    • edmann
    • 3. August 2011 um 14:25

    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.

  • Hilfe bei der MD5 Hash Erstellung (Hash.au3)

    • edmann
    • 3. August 2011 um 11:26

    Klingt einleuchtend :huh: Kennt jemand evtl. eine andere Möglichkeit oder andere Funktion, mit der man in AutoIt auch von großen Dateien MD5 Hashes erstellen kann?

  • Hilfe bei der MD5 Hash Erstellung (Hash.au3)

    • edmann
    • 3. August 2011 um 11:02

    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"
    Weiss einer von euch wie man diese Funktion so erweitert, dass sie die Dateien in kleineren Blöcken bearbeitet?
    Vielen Dank schon mal...

    [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)

    [/autoit][autoit][/autoit][autoit]

    Local $a_hCall = DllCall("kernel32.dll", "hwnd", "CreateFileW", _
    "wstr", $sFile, _
    "dword", 0x80000000, _ ; GENERIC_READ
    "dword", 1, _ ; FILE_SHARE_READ
    "ptr", 0, _
    "dword", 3, _ ; OPEN_EXISTING
    "dword", 0, _ ; SECURITY_ANONYMOUS
    "ptr", 0)

    [/autoit][autoit][/autoit][autoit]

    If @error Or $a_hCall[0] = -1 Then
    Return SetError(1, 0, "")
    EndIf

    [/autoit][autoit][/autoit][autoit]

    Local $hFile = $a_hCall[0]

    [/autoit][autoit][/autoit][autoit]

    $a_hCall = DllCall("kernel32.dll", "ptr", "CreateFileMappingW", _
    "hwnd", $hFile, _
    "dword", 0, _ ; default security descriptor
    "dword", 2, _ ; PAGE_READONLY
    "dword", 0, _
    "dword", 0, _
    "ptr", 0)

    [/autoit][autoit][/autoit][autoit]

    If @error Or Not $a_hCall[0] Then
    DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
    Return SetError(2, 0, "")
    EndIf

    [/autoit][autoit][/autoit][autoit]

    DllCall("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", _
    "hwnd", $hFileMappingObject, _
    "dword", 4, _ ; FILE_MAP_READ
    "dword", 0, _
    "dword", 0, _
    "dword", 0)

    [/autoit][autoit][/autoit][autoit]

    If @error Or Not $a_hCall[0] Then
    DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
    Return SetError(3, 0, "")
    EndIf

    [/autoit][autoit][/autoit][autoit]

    Local $pFile = $a_hCall[0]
    Local $iBufferSize = FileGetSize($sFile)

    [/autoit][autoit][/autoit][autoit]

    Local $tMD5_CTX = DllStructCreate("dword i[2];" & _
    "dword buf[4];" & _
    "ubyte in[64];" & _
    "ubyte digest[16]")

    [/autoit][autoit][/autoit][autoit]

    DllCall("advapi32.dll", "none", "MD5Init", "ptr", DllStructGetPtr($tMD5_CTX))

    [/autoit][autoit][/autoit][autoit]

    If @error Then
    DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
    DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
    Return SetError(4, 0, "")
    EndIf

    [/autoit][autoit][/autoit][autoit]

    DllCall("advapi32.dll", "none", "MD5Update", _
    "ptr", DllStructGetPtr($tMD5_CTX), _
    "ptr", $pFile, _
    "dword", $iBufferSize)

    [/autoit][autoit][/autoit][autoit]

    If @error Then
    DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
    DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
    Return SetError(5, 0, "")
    EndIf

    [/autoit][autoit][/autoit][autoit]

    DllCall("advapi32.dll", "none", "MD5Final", "ptr", DllStructGetPtr($tMD5_CTX))

    [/autoit][autoit][/autoit][autoit]

    If @error Then
    DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
    DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
    Return SetError(6, 0, "")
    EndIf

    [/autoit][autoit][/autoit][autoit]

    DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
    DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)

    [/autoit][autoit][/autoit][autoit]

    Local $sMD5 = Hex(DllStructGetData($tMD5_CTX, "digest"))

    [/autoit][autoit][/autoit][autoit]

    Return SetError(0, 0, $sMD5)

    [/autoit][autoit][/autoit][autoit]

    EndFunc ;==>_MD5ForFile

    [/autoit]
  • Unterschied zwischen VBS Arrays und AutoIT Arrays

    • edmann
    • 10. März 2011 um 01:11

    Problem gelöst. Hatte nichts mit dem Array zu tun, Das Array war OK. Die Übergabe an das Object hat nicht funktioniert

    [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

    [/autoit]


    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") = $oCondition

    Weiss 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!!!

  • Unterschied zwischen VBS Arrays und AutoIT Arrays

    • edmann
    • 9. März 2011 um 13:36

    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

    Code
    List<IResultObject> operands = condition.GetArrayItems("Operands");
    operands.Add(registryExpression);
    condition.SetArrayItems("Operands", operands);


    Gibt es in AutoIT evtl eine Möglichkeit so etwas zu realisieren?

  • Unterschied zwischen VBS Arrays und AutoIT Arrays

    • edmann
    • 9. März 2011 um 12:00

    Hallo BugFix,
    du bist doch ein Array Profi. Ist meine Annahme mit der Array Funktion richtig gewesen? Wird bei der Zuweisung

    Code
    operands=Array(oExpression)


    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

    Code
    operands=Array(oExpression)


    aber nicht die

    Code
    operands(0)=oExpression


    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.

  • Unterschied zwischen VBS Arrays und AutoIT Arrays

    • edmann
    • 8. März 2011 um 23:20

    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
    Sub 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 Sub
    Alles anzeigen

    2. Meine AutoIT Portierung

    [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
    EndFunc

    [/autoit]

    Als 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:

    Code
    operands=Array(oExpression)
    condition.Operands=operands


    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

    Code
    Dim operands(1)
    operands(0) = oExpression
    condition.Operands=operands


    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

    [/autoit]


    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

  • Hilfe beim Übersetzen von VBS in AutoIt

    • edmann
    • 1. Februar 2011 um 08:53

    Danke für den Tip. Habe schlicht nicht gefunden wie man es macht.

  • Hilfe beim Übersetzen von VBS in AutoIt

    • edmann
    • 31. Januar 2011 um 15:39

    Problem gelöst.
    Ich habe die Zeilen

    [autoit]


    $oInParams.TaskSequence = $oTaskSequence
    $oInParams.TaskSequencePackage = $oTaskSequencePackage

    [/autoit]

    duch:

    [autoit]


    $oInParams.Properties_.Item("TaskSequence") = $oTaskSequence
    $oInParams.Properties_.Item("TaskSequencePackage") = $oTaskSequencePackage

    [/autoit]

    ersetzt und schon hats funktioniert.
    Lösung gefunden unter:
    http://msdn.microsoft.com/en-us/library/…4(v=vs.85).aspx

    Vielen Dank für eure Unterstützung.

  • Hilfe beim Übersetzen von VBS in AutoIt

    • edmann
    • 31. Januar 2011 um 15:14

    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)^ ERROR

    Wenn man in VBS Parameter weglässt, werden sich doch automatisch mit Null ersetzt? Entspricht der Default dem Null wert?

  • Hilfe beim Übersetzen von VBS in AutoIt

    • edmann
    • 31. Januar 2011 um 01:03

    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)^ ERROR

    und hier der AutoIt Code dazu:

    [autoit]


    Global $strSmsServer = "."

    [/autoit][autoit][/autoit][autoit]

    $oSwbemLocator = ObjCreate("WbemScripting.SWbemLocator")
    $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)

    [/autoit]

    Zum Vergleich hier der VBS Code

    Code
    server = "."
    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)
    Alles anzeigen

    Die Beschreibung der Klasse gibt es hier:
    http://msdn.microsoft.com/en-us/library/cc144760.aspx

    Wäre echt cool wenn jemand eine Idee hätte wo das Problem liegt.
    Vielen Dank schon mal...

  • AutoIt script als "native service"

    • edmann
    • 25. September 2009 um 10:21

    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.

  • DllCall und Array als Parameter

    • edmann
    • 7. September 2009 um 12:00

    Hallo,
    vielen Dank für eure Unterstützung.
    Ich habs getestet und es funktioniert :thumbup:

  • DllCall und Array als Parameter

    • edmann
    • 4. September 2009 um 08:55

    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

  • DllCall und Array als Parameter

    • edmann
    • 3. September 2009 um 23:34

    Hallo Greenhorn
    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]


    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.

    [/autoit][autoit][/autoit][autoit]

    Global $strSite = "P01"
    Global $strComputer = "TESTPC"
    Global $strDdrFileName = "TEST.DDR"
    Global $strOS = "Windows XP Professional"
    Global $strDomainName = "TEST.LOCAL"

    [/autoit][autoit][/autoit][autoit]

    Global $arrGroups = DllStructCreate ("char [" & $MAX_STRING & "];" & _
    "char [" & $MAX_STRING & "];")

    [/autoit][autoit][/autoit][autoit]

    DllStructSetData ($arrGroups, 1, "GROUP1")
    DllStructSetData ($arrGroups, 2, "GROUP2")

    [/autoit][autoit][/autoit][autoit]

    Global $arrOUs = DllStructCreate ("char [" & $MAX_STRING & "];" & _
    "char [" & $MAX_STRING & "];")

    [/autoit][autoit][/autoit][autoit]

    DllStructSetData ($arrOUs, 1, "OU1")
    DllStructSetData ($arrOUs, 2, "OU2")

    [/autoit][autoit][/autoit][autoit]

    Global $arrContainer = DllStructCreate ("char [" & $MAX_STRING & "];")

    [/autoit][autoit][/autoit][autoit]

    DllStructSetData ($arrContainer, 1, "")

    [/autoit][autoit][/autoit][autoit]

    Global $SMSRsGendll = DllOpen("SMSRsGen.dll")
    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)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func DDRNew ($sArchitecture, $sAgentName, $sSiteCode)
    Local $aRes = DllCall($SMSRsGendll, "int", "DDRNew", _
    "str", $sArchitecture, _
    "str", $sAgentName, _
    "str", $sSiteCode)
    Return $aRes[0]
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func DDRAddStringArray ($sName, $sArray, $nArraySize, $nSQLWidth, $dwFlags)
    Local $aRes = DllCall($SMSRsGendll, "int", "DDRAddStringArray", _
    "str", $sName, _
    "ptr", $sArray, _
    "int", $nArraySize, _
    "int", $nSQLWidth, _
    "dword", $dwFlags)
    Return $aRes[0]
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func DDRAddString ($sName, $sValue, $nSQLWidth, $dwFlags)
    Local $aRes = DllCall($SMSRsGendll, "int", "DDRAddString", _
    "str", $sName, _
    "str", $sValue, _
    "int", $nSQLWidth, _
    "dword", $dwFlags)
    Return $aRes[0]
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func DDRWrite ($sFileName)
    Local $aRes = DllCall($SMSRsGendll, "int", "DDRWrite", _
    "str", $sFileName)
    Return $aRes[0]
    EndFunc

    [/autoit]

    Damit 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_PROPERTY

    In 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.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™