Laden...

Starten einer Exe mit einem Windows Dienst mit einem passenden Benutzer

Erstellt von omega90 vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.758 Views
Thema geschlossen
O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren
Starten einer Exe mit einem Windows Dienst mit einem passenden Benutzer

hallo Zusammen

Ich habe einen Windows Dienst (local System) erstellt der nur zu testzwecken läuft. Dieser soll eine exe (Konsolenanwendung) starten die wiederrum eine Benutzerabfrage bei einem Webservice der im IIS läuft macht, dieser liegt natürlich auf einem anderen Rechner.

Nun habe ich festgestellt, wenn Ich über die Konsolenanwendung die Webmethode aufrufe um meinen dort angelemdeten Benutzer zu ermitteln..bekomme ich meinen benutzer zurück (So soll es auch sein)...

wenn Ich aber den Dienst starte bekomme ich den Rechner selbst nur zurück...

Die Frage ist nun die, gibt es eine Möglichkeit aus einem localsystem dienst eine exe zu starten so das diese als mein Benutzer agiert? Impersonate in der Konsolenanwendung und im dienst selbst(nur getestet) bringt nichts und gibt mir nur die folgende meldung zurück...

Fehlermeldung:
Fehler bei der Anforderung mit HTTP-Status 401: Unauthorized.

😦

wenn mir jemand einen Tipp geben kann oder mir einen andere Lösung nennen könnte wäre ich sehr sehr dankbar 😃 Aber der Dienst muss local system bleiben!

Gruß W.T 🙂

T
708 Beiträge seit 2008
vor 11 Jahren

Aber der Dienst muss local system bleiben!

Hallo omega90,

mit der o.g. Einschränkung wirst du das nicht erreichen.
Entweder muss der Dienst mit einem anderen (dem WS bekannten) Konto gestartet werden oder du musst die Anmeldeinformationen für den Webservice in dem Programm hinterlegen. (UseDefaultCredentials = False, usw.)

Gruß,
trib

O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren

Das heißt ich kann ein Impersonate im Webservice machen?

Gruß W.T 🙂

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo omega90,

nach dem was trib sagt nicht im WebService, sondern im Windows Dienst. Da du nach deiner Aussage den Benutzer, unter dem der Windows Dienst läuft, nicht ändern kannst, musst du den Windows Dienst dazu bringen, dass er wenigstens beim Zugriff auf den WebService als anderer Benutzer auftritt (eben Impersonate / UseDefaultCredentials = False).

herbivore

T
708 Beiträge seit 2008
vor 11 Jahren

Genau, der Windowsdienst muss den Webservice und dessen Anmeldung kennen.

Dazu baue ich mir immer eine Helfer-Klasse, die mir zentral ermöglicht zwischen dem Windowsuser und hinterlegten Daten zu wechseln.

Aufruf:


            myWebServices = new WebServices.MyMainService_Binding();
            myWebServices.UseDefaultCredentials = Webservice.UseDefaultCredentials;
            if (!Webservice.UseDefaultCredentials)
            {
                myWebServices.Credentials = Webservice.Credential;
            }
            if (Webservice.UseProxy)
                myWebServices.Proxy = Webservice.Proxy;

Webservice.cs:


 public static class Webservice
    {
        /// <summary>
        /// Das Event wird angesprochen, wenn die Credentials verwendet werden,
        /// aber kein Passwort hinterlegt wurde.
        /// </summary>
        public static event EventHandler CredentialsRead = delegate { };        
                
        private static string path = string.Empty;
        /// <summary>
        /// Der Pfad des Webservices z.B.:
        /// http://Server:7047/ServiceName/WS/Mandant/Services
        /// </summary>
        public static string Path
        {
            get { return path; }
            set { path = value; }
        }
                
        private static bool useStandardWS = true;
        /// <summary>
        /// Übersteuert die Einstellungen, den in den Resourcen hinterlegten Webservicepfad zu nutzen.
        /// </summary>
        public static bool UseStandardWS
        {
            get { return Webservice.useStandardWS; }
            set { Webservice.useStandardWS = value; }
        }

        public static string ProxyPath = string.Empty;
        /// <summary>
        /// WebProxy Klasse
        /// </summary>
        public static IWebProxy Proxy
        {            
            get;
            set;
        }

        private static bool useProxy = false;
        /// <summary>
        /// Legt fest, ob der hinterlegte Proxyserver genutzt werden soll
        /// </summary>
        public static bool UseProxy
        {
            get { return Webservice.useProxy; }
            set { Webservice.useProxy = value; }
        }
                
        private static bool useDefaultCredentials = true;
        /// <summary>
        /// Legt fest, ob die hinterlegten Credentials genutzt werden sollen
        /// </summary>
        public static bool UseDefaultCredentials
        {
            get
            { CheckCredentials();
                return Webservice.useDefaultCredentials; }
            set { Webservice.useDefaultCredentials = value; }
        }

        private static NetworkCredential credential;
        public static NetworkCredential Credential
        {            
            get
            {                
                return credential;}
            set { credential = value; }
        }
    }

        private static void CheckCredentials()
        {
            if (!useDefaultCredentials)
                if(credential.Password == string.Empty || credential.UserName == string.Empty || credential.Domain == string.Empty)
                {
                    if (CredentialsRead != null)
                    {                        
                        CredentialsRead("", EventArgs.Empty);
                    }
                }
        }

Zur Erklärung: Um das Passwort nicht speichern zu müssen, prüfe ich beim Zugriff auf die Credentials (System.Net.NetworkCredential) ob Benutzername oder das Passwort eingetragen sind und zwinge den Benutzer ggf. zur Eingabe dieser Informationen. Bei UseDefaultCredentials wird dies natürlich ignoriert. Ist für deinen Anwendungsfall natürlich nicht nötig.

O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren

ich bin zwar gerade im Urlaub 😛 aber ich danke euch für diese Hilfe, Ich schaue mir das ganze mal an und teste es mal ^^

Gruß W.T 🙂

O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren

hi

myWebServices = new WebServices.MyMainService_Binding();  
myWebServices.UseDefaultCredentials = Webservice.UseDefaultCredentials;  

Das versteh ich nicht so ganz Ich bekomme nur einen Fehler angezeigt das myWebService nicht im aktuellen Kontext vorhanden sei 😕 was hat es den mit dem MyMainService_Binding() auf sich Oo

Vllt bin Ich aber auch grad nur neben der Mütze um das zu verstehen...

Gruß W.T 🙂

T
708 Beiträge seit 2008
vor 11 Jahren

Hallo omega90,

ich benutze immer den Root-Pfad des Webservices (z.B. "127.0.0.1/myWebservice/WS/Services") und kann dann auf die verschiedenen Elemente zugreifen.
Der Hintergrund dazu: Ich habe nicht für jedes Webservice Element eine Referenz in Visual Studio, sondern nur eine einzige und initialisiere diese dann mit dem entsprechenden Ziel.

Hast du in Visual Studio unter den WebReferences schon den kompletten Webservice-Pfad angegeben, kannst du dir diesen Schritt natürlich sparen und einfach "myWebServices" durch den von dir vergebenen Namen austauschen.

Das sind aber imho Grundlagen.

Hinweis von herbivore vor 11 Jahren

Fehler angezeigt das myWebService nicht im aktuellen Kontext vorhanden sei

siehe [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen) und [Hinweis] Wie poste ich richtig? Punkt 1.1.1. Das sind wirklich Grundlagen.

Thema geschlossen