Announcement

Collapse
No announcement yet.

Ist ein Ändern der Identität ohne dcomcnfg.exe möglich?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ist ein Ändern der Identität ohne dcomcnfg.exe möglich?

    Hallo

    Ich habe folgendes Problem:
    Ich habe eine Server.exe und eine Client.exe erstellt.
    Die Server.exe soll auf alle Clients im Netz verteilt werden.
    Dabei soll die Server.exe mit der Identität des lokalen Administrators laufen. Diese Einstellung lässt sich manuell durch das Programm dcomcnfg.exe ändern. Leider ist das eine mühsellige Aufgabe wenn wir von mehreren 100 Clients sprechen. Gibt es nun eine Möglichkeit diese Einstellung über ein command line Tool zu erledigen? Oder gibts dafür irgendwo ein Delphi Beispiel?

    Dank im voraus

    Marc Kuschel

  • #2
    Hallo,

    ein spezielles Tool ist nicht notwendig, es reicht aus, wenn das Installations-Programm die notwendigen Einträge direkt in die Registry schreibt. Noch einfacher wäre es, wenn der eigene DCOM-Server als <i>COM+ Anwendung</i> implementiert wird. Denn dann reicht ein rechter Mausklick auf die COM+ Anwendung aus, damit das Betriebssystem automatisch ein MSI-Setup (Microsoft Installer) generiert, dass die Anwendung mit allen Einstellungen vor Ort installiert.

    In meinen COM-Büchern (beide Auflagen) sind zur Registry-Konfiguration Infos im DCOM-Kapitel (13.1.4 DCOM-Architektur, Abschnitt Registry-Konfiguration) zu finden.

    - HKEY_CLASSES_ROOT\CLSID\{TestServer}\LaunchPermiss ion <br>
    - HKEY_CLASSES_ROOT\CLSID\{TestServer}\RunAs="OssiSo ft\DCOMUser"<br>
    usw

    Comment


    • #3
      Vielen Dank für die Antwort.

      Die Standard Registry Keys waren bisher nicht das Problem, sondern das Passwort für den RunAs User das in HKLM\Security\Policy\Secrets\SCM:SID gespeichert ist.
      Ich habe das Problem jetzt erstmal mit AutoIt gelöst. Dieser Weg ist aber nicht gerade wünschenswert.
      Ich schaue mir auf jeden Fall einmal die Lösung mit der COM+ Anwendung an.
      Ist in Ihrem Buch eine Lösung für dieses Passwort Problem beschrieben

      Comment


      • #4
        Hallo,

        &gt;..dieses Passwort Problem..

        im Fall der COM+ Anwendung stellt das Betriebssystem im Exportdialog die Checkbox <i>Benutzeridentitäten exportieren</i> bereit, so dass der konfigurierte Benutzer mit Passwort auf dem Zielrechner automatisch mit eingerichtet wird. Alternativ kann das eigene Programm über Automation des COM+ Catalogs (TCOMAdminCatalog, TCOMAdminCatalogCollection, TCOMAdminCatalogObject) die Konfiguration direkt ändern. Auf der CDROM zum COM+ Buch ist im Verzeichnis <i>\Kapitel 16\Events\TransistentEvent</i> ein Beispiel zu finden, indem das COM+ Objekt direkt aus der eigenen Anwendung heraus installiert wird (allerdings ohne Passwort):
        <pre>
        unit TEPubSubHostFrm;

        interface

        uses
        Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
        StdCtrls, ComCtrls, COMAdmin_TLB, OleServer;

        type
        TForm1 = class(TForm)
        StatusBar1: TStatusBar;
        COMAdminCatalog1: TCOMAdminCatalog;
        COMAdminCatalogCollection1: TCOMAdminCatalogCollection;
        COMAdminCatalogObject1: TCOMAdminCatalogObject;
        ListBoxLog: TListBox;
        GroupBox1: TGroupBox;
        Label2: TLabel;
        Label1: TLabel;
        EditEventClassDLL: TEdit;
        EditAppID: TEdit;
        ButtonInstall: TButton;
        GroupBox2: TGroupBox;
        ButtonInstallSub: TButton;
        Label3: TLabel;
        EditSubAppID: TEdit;
        Label4: TLabel;
        EditSubObjDLL: TEdit;
        ButtonRaiseEvent: TButton;
        GroupBoxSubscription: TGroupBox;
        ButtonEnabled: TButton;
        ButtonDisabled: TButton;
        StaticText1: TStaticText;
        EditPublisher: TEdit;
        Label5: TLabel;
        procedure ButtonInstallClick(Sender: TObject);
        procedure ButtonInstallSubClick(Sender: TObject);
        procedure ButtonRaiseEventClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure ButtonEnabledClick(Sender: TObject);
        procedure ButtonDisabledClick(Sender: TObject);
        private
        { Private declarations }
        FThrdID : Integer; // Thread-ID zur Kontrolle
        FCookie : String; // Subcription-ID
        public
        { Public declarations }
        end;

        var
        Form1: TForm1;

        implementation

        {$R *.DFM}

        uses ActiveX, ComObj, TEObj_TLB, TEObjSub_TLB;

        {
        Der Publisher des COM+ Events ermittelt sofort beim Programmstart
        seine Thread-ID, damit dieser Wert mit dem vom Subscriber-Objekt
        zurückgelieferten Wert verglichen werden kann. Beide Thread-IDs
        stimmen nicht überein - also werden beide Objekte in unterschiedlichen
        Threads ausgeführt.
        }

        procedure TForm1.FormCreate(Sender: TObject);
        begin
        FThrdID := GetCurrentThreadID;
        StatusBar1.SimpleText := Format('Thread-ID: %d', [FThrdID]);
        end;

        {
        Die Event Class wird in eine bereits vorhandene COM+ Application
        installiert. Nach dem Aufruf ist das Objekt-Symbol in der
        Komponentenverwaltung von Windows 2000 sichtbar.
        }

        procedure TForm1.ButtonInstallClick(Sender: TObject);
        begin
        COMAdminCatalog1.Connect;
        COMAdminCatalog1.InstallEventClass(EditAppID.Text,
        EditEventClassDLL.Text, '','');
        COMAdminCatalog1.Disconnect;
        StatusBar1.SimpleText := 'Event Class wurde installiert.';
        end;

        {
        Das Subscriber-Objekt wird in die gleiche COM+-Anwendung wie die
        Event Class installiert. Nach dem Aufruf ist das Objekt-Symbol in der
        Komponentenverwaltung von Windows 2000 sichtbar.
        }

        procedure TForm1.ButtonInstallSubClick(Sender: TObject);
        begin
        COMAdminCatalog1.Connect;
        COMAdminCatalog1.InstallComponent(EditSubAppID.Tex t,
        EditSubObjDLL.Text, '','');
        COMAdminCatalog1.Disconnect;
        StatusBar1.SimpleText := 'Subscriber Objekt wurde installiert.';
        end;

        {
        Der Publisher löst ein COM+ Event aus, indem er kurzzeitig eine
        Instanz der Event Class anfordert und die Interfacemethode dieser
        Event Class aufruft. Danach kann dieses Objekt sofort wieder frei-
        gegeben werden, da COM+ alle Subscribers später in eigener Regie
        benachrichtigt. Das Anklicken dieses Buttons führt nur dann zur
        Benachrichtigunt, wenn eine aktive Subcription über den "Enabled"-
        Button angemeldet wird.
        }

        procedure TForm1.ButtonRaiseEventClick(Sender: TObject);
        var
        aEvent : ITransistentEventObject;
        begin
        aEvent := CoTransistentEventObject.Create;
        aEvent.TempWork(EditPublisher.Text, FThrdID);
        ListBoxLog.Items.Add(' -> Publisher löst Event aus.');
        end;

        {
        Eine transistente Subscription wird hergestellt, indem der Interface-
        Zeiger IUnknown einer bereits laufenden Subscriber-Instanz verwendet
        wird, um eine aktive Subscription anzumelden. Sobald COM+ diese
        Subscription akzeptiert hat, wird das Subscriber-Objekt von COM+
        "festgehalten". Das eigene Programm gibt daher den Interface-Zeiger
        auf das Subscriber-Objekt wieder frei (ansonsten könnte die transistente
        Subscription nicht wieder zur Laufzeit abgemeldet werden).
        }

        procedure TForm1.ButtonEnabledClick(Sender: TObject);
        var
        aSubsriber : IUnknown;
        begin
        // Step 1: Subscriber-Objektinstanz anfordern
        aSubsriber := CoTransistentEventSubscriberObject.Create as IUnknown;
        // Step 2: Transistente Subscription im System anmelden
        COMAdminCatalog1.Connect;
        COMAdminCatalogCollection1.ConnectTo(
        COMAdminCatalog1.GetCollection('TransientSubscript ions') as
        ICatalogCollection);
        COMAdminCatalogObject1.ConnectTo(
        COMAdminCatalogCollection1.Add as ICatalogObject);
        COMAdminCatalogObject1.Value['Enabled'] := True;
        COMAdminCatalogObject1.Value['SubscriberInterface'] := aSubsriber;
        COMAdminCatalogObject1.Value['InterfaceID'] := GUIDToString(IID_ITransistentEventObject);
        FCookie := COMAdminCatalogObject1.Key;
        StaticText1.Caption := FCookie;
        COMAdminCatalogCollection1.SaveChanges;
        ListBoxLog.Items.Add(Format('%d Einträge', [COMAdminCatalogCollection1.Count]));
        COMAdminCatalogObject1.Disconnect;
        COMAdminCatalogCollection1.Disconnect;
        COMAdminCatalog1.Disconnect;
        // Step 3: Interface-Zeiger auf das Subscriber-Objekt freigeben
        aSubsriber := nil;
        StatusBar1.SimpleText := 'Event Subscribtion wurde registriert.';
        end;

        {
        Die transistente Subscribtion wird zur Laufzeit wieder abgemeldet,
        somit erhält das Subscriber-Objekt keine Benachrichtigungen mehr.
        Die im privaten Objektfeld FCookie gespeicherte Subscription-ID
        enthält eine GUID in Textform und ist beim Abmelden die "Gaderoben-Marke",
        damit man nur die eigenen Subscribtion freigeben kann.
        }

        procedure TForm1.ButtonDisabledClick(Sender: TObject);
        var
        vKeys : OleVariant;
        begin
        COMAdminCatalog1.Connect;
        COMAdminCatalogCollection1.ConnectTo(
        COMAdminCatalog1.GetCollection('TransientSubscript ions') as
        ICatalogCollection);
        vKeys := VarArrayOf([FCookie]);
        COMAdminCatalogCollection1.PopulateByKey(tagVarian t(vKeys).pArray);
        if (COMAdminCatalogCollection1.Count > 0) then
        begin
        if COMAdminCatalogCollection1.RemoveEnabled then
        ListBoxLog.Items.Add(' Eintrag darf entfernt werden');
        COMAdminCatalogCollection1.Remove(0);
        ListBoxLog.Items.Add(' Subscription entfernt.');
        end;
        COMAdminCatalogCollection1.SaveChanges;
        COMAdminCatalogCollection1.Disconnect;
        COMAdminCatalog1.Disconnect;
        StatusBar1.SimpleText := 'Event Subscription wurde entfernt';
        StaticText1.Caption := '';
        end;

        end.
        </pre&gt

        Comment


        • #5
          Vielen Dank

          Ich werde mir Ihr Buch morgen in der Buchhandlung ansehen.
          Bin sicher ich finde dort noch so einige Problemlösungen, die ich bisher umständlich umgangen habe

          Comment

          Working...
          X