Auto-It: Administration von COM+ Komponenten

  • Hallo zusammen.

    Wiedereinmal stehe ich vor einer knacknuss ;(

    Ich soll eine Com+ Komponente starten / beenden können, sowie auf basis einer AD Gruppe berechtigen.

    Administrative Vorlagen - Component Services - hat man ja ein nettes Gui zum Thema :huh:

    Nur: wie kann ich das Scriptgesteuert, bzw mit Auto-It erledigen?

    Bin mich gerade am Einlesen, vielleicht weiss ja auch hier jemand rat: Laut hilfe ist das jedoch auch hier absolutes Neuland...

    http://msdn.microsoft.com/en-us/library/ms688285

    Anscheinend kann man Com+ Komponenten auch in ein MSI Exportieren! Aber bei mir endet das im Error Code 8002801D

    http://www.carlosag.net/Articles/configureComPlus.aspx

    http://en.wikipedia.org/wiki/Component_Object_Model

    Erstellen von Com+ Komponenten: http://www.vbgold.com/asp-printer-in…-services.shtml

    Ich hoffe mal wieder auf euch,

    Surfy

    Einmal editiert, zuletzt von Surfy (23. September 2010 um 11:15)

    • Offizieller Beitrag

    Ich soll eine Com+ Komponente starten / beenden können, sowie auf basis einer AD Gruppe berechtigen.


    Werd bitte mal etwas konkreter und benenne genau, welche Komponente du wozu nutzen möchtest. Dann kann man sehen, ob das überhaupt mit AutoIt realisierbar ist. Ganz pauschal kann man deine Frage nicht beantworten.

  • Hi Bugfix

    Ich soll eine mir gelieferte Com+ Komponente im Netzwerk automatisiert verteilen können

    Ich habe inzwischen herausgefunden, dass man die fast die komplette Konfiguration an einem PC mit Adminrechten durchführen kann, und dann das ganze COM+ gedöns als MSI exportieren kann, inkl. berechtigten AD Gruppen.

    Die ganze Com+ Komponente kann man als noch unter einer anderen Identität laufen lassen, und da klemmt es noch als letztes...

    Das ganze ist eher ein Scriptingproblem als solches, gewusst wie bekomme ich es wahrscheinlich dann auch einfach in Autoit umgesetzt. Zum durchklicken ginge das ganze so:


    [list=1]
    [*]On the Start menu, point to Settings, click to Control Panel, double-click Administrative Tools, and then double-click Component Services.

    [*]In the console tree, expand Component Services, expand Computers, expand My Computer, and then expand COM+ Applications.

    [*]Click the COM+ application for which you want to change the identity, and on the Action menu, click Properties.

    [*]On the Advanced tab, in the Permission area, verify that the Disablechanges check box is cleared, and then click OK.
    The properties dialog box closes.
    [*]Right-click the COM+ application again, and then click Properties.

    [*]On the Identity tab, in the Account area, click This user.

    [*]Type the information for the account that you want to use.

    [*]Click OK.
    The following message appears: The applications were created by one or more external products. Are you certain the changes you are about to make are supported by these products?
    [*]Click Yes.

  • Dieser VBScrip ausgeführt mit cscript soll das ganze richten *kopfkratz*


    • Offizieller Beitrag

    Du mußt die notwendigen Argumente in das Array $aAppID einfügen.

    Spoiler anzeigen
    [autoit]

    ;~ ' VBScript source code
    ;~ if WScript.Arguments.Count <> 1 Then
    ;~ WScript.Echo "usage: COMAdmin <appid>"
    ;~ WScript.End
    ;~ end if

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

    ;~ appID = WScript.Arguments(0)
    Dim $aAppID[1] = ['Argument1'] ; Argumente hier auflisten, Anzahl Arrayelemente anpassen

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

    $oCatalog = ObjCreate("ComAdmin.COMAdminCatalog")

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

    $oApplications = $oCatalog.GetCollection("Applications")

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

    $oApplications.PopulateByKey($aAppID)
    $oApp = $oApplications.Item(0)

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

    ;~ ' Or

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

    ;~ $oApplications.Populate
    ;~ For $oTempApp In $oApplications
    ;~ If $oTempApp.Name = "System Application" Then
    ;~ $oApp = $oTempApp
    ;~ ExitLoop
    ;~ EndIf
    ;~ Next

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

    ;~ ConsoleWrite($oApp.Name & ": " & $oApp.Value("Identity") & @CRLF)

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

    ;~ $oApp.Value("Identity") = "LocalSystem"
    ;~ $oApp.Value("Identity") = "Interactive User"

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

    ;~ $oApp.Value("Identity") = "DOMAIN\newIdentity"
    ;~ $oApp.Value("Password") = "newPassword"

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

    ;~ $oApplications.SaveChanges()

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

    ;~ ' Iterate Components of the application if you need to.
    $oComponents = $oApplications.GetCollection("Components", $oApp.Key)
    $oComponents.Populate
    For $oComp In $oComponents
    ConsoleWrite("Component: " & $oComp.Name)
    ConsoleWrite(" " & $oComp.Value("CLSID") & @CRLF)
    Next

    [/autoit]
  • Danke Dir Bugfix.

    Aber was Du da machst - puhhh, übersteigt mein noobwissen um welten *staun*

    ;~ $oApp.Value("Identity") = "DOMAIN\newIdentity"
    ;~ $oApp.Value("Password") = "newPassword"

    Ich müsste eigentlich das hier setzten, aber bekomme es auch mit deiner Vorarbeit nicht hin.

    Zitat

    Du mußt die notwendigen Argumente in das Array $aAppID einfügen.


    Ich müsste ja identity und Password übergeben, und irgendwie noch den Namen oder die ClassID angeben?!

    Identity=Domain\MyUser

    Password: MyPassword

    Application: {4ECA9F7C-5886-4C64-AA33-7032CC6598C7} oder den Namen "PerTax"

    Ich hoffe ihr könnt mir auch noch bei der hürde helfen!

    Surfy

    • Offizieller Beitrag

    Ich kann da bei mir leider nicht viel testen - habe nur localhost ;).
    Vielleicht stolpert ja einer unserer Netzwerkadmins hier drüber.

    Das Umsetzen von VBScript ist nicht so schwer. Schau doch mal die Befehlszeilen im direkten Vergleich an. Sie sind sich ziemlich ähnlich.

  • Ich kann da bei mir leider nicht viel testen - habe nur localhost ;).
    Vielleicht stolpert ja einer unserer Netzwerkadmins hier drüber.


    Also die lokale Variante müsste eigentlich auch reichen, das Domaintesting kann ich schon übernehmen

    'oApp.Value("Identity") = "LocalSystem"
    'oApp.Value("Identity") = "Interactive User"

    Mir ist nur unklar, wie ich die Argumente übergeben kann

    Dim $aAppID[1] = ['Identity, Password, ClassID']

    oder doch

    Dim $aAppID[1] = ['Identity=LocalSystem, Password=1234, ClassID={4ECA9F7C-5886-4C64-AA33-7032CC6598C7}']

    • Offizieller Beitrag

    Du willst ja Komponenten installieren. Ich habe mich damit bisher nie befasst, aber mal kurz bei MSDN nachgelesen.
    Folgendes sollte doch laufen:

    [autoit]

    Local $oCatalog = ObjCreate("ComAdmin.COMAdminCatalog")
    Local $compName = "Q277984"
    Local $aInstallComponents[2] = ["Q277984.dll","Q277984b.dll"]
    Local $aInstallCLSID[2] = ["{44DAAEC9-F383-42CC-BA1A-8F3A036B0DAE}", "{DB2E2C08-2285-4105-925E-B7ECBA8C6C5D}"]

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

    $oCatalog.InstallMultipleComponents($compName, $aInstallComponents, $aInstallCLSID)

    [/autoit]


    Als Skript verteilen an die Arbeitsplätze und mit Eintrag in RunOnce ausführen. Dann brauchst du dich nicht um User/PW kümmern.
    Vielleicht geht es auch nicht ;) - wie gesagt, ist eigentlich nicht meine Baustelle. :D


    Edit:
    Wenn du mit COM+ herumdoktorst - vielleicht kannst du das ja auch brauchen:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    ; Rückgabe als String
    ConsoleWrite(_COMplusAppl_Get() & @CRLF)

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

    ; Rückgabe als Array
    $aRet = _COMplusAppl_Get(True)
    _ArrayDisplay($aRet)

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

    ;===============================================================================
    ; Function Name: _COMplusAppl_Get([$fRetArray=False])
    ; Description:: Auflistung aller aktiven COM+ Anwendungen
    ; Parameter(s): optional $fRetArray Standard ist False = Rückgabe als @CRLF getrennter String
    ; Return Value(s): @CRLF getrennter String (Standard) oder Array mit Anzahl in $array[0]
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _COMplusAppl_Get($fRetArray=False)
    Local $oCatalog = ObjCreate("ComAdmin.COMAdminCatalog")
    Local $oApplications = $oCatalog.GetCollection("Applications")
    $oApplications.Populate
    Local $sAppl = ''
    For $oApp In $oApplications
    $sAppl &= $oApp.Name & @CRLF
    Next
    $oCatalog = 0
    If $fRetArray Then Return StringSplit(StringTrimRight($sAppl, 2), @CRLF, 1)
    Return StringTrimRight($sAppl, 2)
    EndFunc ;==>_COMplusAppl_Get

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

    ;===============================================================================
    ; Function Name: _COMplusAppl_ShutDown()
    ; Description:: Beenden aller aktiven COM+ Anwendungen
    ; Parameter(s): keine
    ; Return Value(s): Anzahl beendeter COM+ Anwendungen
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _COMplusAppl_ShutDown()
    Local $oCatalog = ObjCreate("ComAdmin.COMAdminCatalog")
    Local $oApplications = $oCatalog.GetCollection("Applications")
    $oApplications.Populate
    Local $count = $oApplications.Count
    For $oApp In $oApplications
    If $oApp.Name <> "System Application" Then $oCatalog.ShutdownApplication($oApp.Name)
    Next
    $oCatalog.ShutdownApplication("System Application")
    $oCatalog = 0
    Return $count
    EndFunc ;==>_COMplusAppl_ShutDown

    [/autoit]
  • Hallo zusammen

    Mein Skill reicht nicht aus, um das ganze in Auto-It umzuschreiben, aber vielleicht hilft folgender VB Script ja mal jemandem weiter:

    Der Aufruf erfolgt so:

    cscript.exe vbsname.vbs APPID

    Der User muss natürlich im Ad existieren, und das Kennwort muss stimmen

    Beispiel bei mir: csript.exe c:\setidentity.vbs {4ECA9F7C-5886-4C64-AA33-7032CC6598C7}

    Und dann geht alles :rock: Danke an Bugfix für die Hilfestellungen ;)