myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns
» Datenschutzerklärung
» Impressum

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Rund um die Programmierung » Prozess als bestimmter Benutzer von SystemDienst aus starten
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Prozess als bestimmter Benutzer von SystemDienst aus starten

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
HexEdit HexEdit ist männlich
myCSharp.de-Mitglied

Dabei seit: 18.02.2019
Beiträge: 38
Entwicklungsumgebung: VisualStudio 2019


HexEdit ist offline

Prozess als bestimmter Benutzer von SystemDienst aus starten

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Folgendes Problem ich habe ein WindowsDienst der als SYSTEM ausgeführt wird und möchte von diesem Dienst ein Programm auf einem bestimmten Benutzerkonto X starten.

C#-Code:
            Process.Start(new ProcessStartInfo
            {
                FileName = "regedit.exe",  //zb regedit
               //Arguments = "...",
            }).WaitForExit();

So wird regedit zwar gestartet aber auf dem SYSTEM-Konto

Das ich btw. nur erreichen kann wenn ich mittels System Dienst die GUI(explorer.exe) auf dem SystemKonto starte. und meine GUI Prozesse kille.
was ja nicht das Ziel ist...

C#-Code:
            Process.Start(new ProcessStartInfo
            {
                FileName = "regedit.exe",  //zb regedit
               //Arguments = "...",
               User = "Username",
               Domain = "Computername"
            }).WaitForExit();

Das geht auch nicht.

Hat irgendjemand eine Iddee, würde mich freuen.
07.04.2019 13:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.271
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Suche mal mit dem Stichwort "Impersonation" im Forum oder in Internet danach.
07.04.2019 13:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
HexEdit HexEdit ist männlich
myCSharp.de-Mitglied

Dabei seit: 18.02.2019
Beiträge: 38
Entwicklungsumgebung: VisualStudio 2019

Themenstarter Thema begonnen von HexEdit

HexEdit ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Meinst du so:

C#-Code:
         WindowsIdentity impersonatedIdentity = new WindowsIdentity(hToken);
            WindowsImpersonationContext myImpersonation = impersonatedIdentity.Impersonate();
            //Prozess starten
            myImpersonation.Undo();

Weist du zufällig wie ich den UserToken bekomme - warscheinlich mit nem DLLImport - oder müsste ich da mal das Internet durchwühlen.
07.04.2019 13:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.785
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

HexEdit Dein Code sieht aus, dass Du ihn 1:1 von der Microsoft Doku kopiert hast.
So wird das nichts werden....

Wenn Du nach "c# windowsidentity impersonation" suchst - zB nur zwei Minuten - dann findest Du Samples wie

C#-Code:
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);

Im Endeffekt bist Du damit also schneller bei der Zielfindung.

Es gibt aber verschiedene Wege der Impersonation.
Welche Du brauchst, das ist aus diesem Thread nicht ersichtlich.
07.04.2019 13:31 Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.271
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Probiere mal den ImpersonateManager (bzw. ProcessImpersonator) von  Impersonation with C#. Das müsste deine Anforderungen bzgl. Anmelden über "Domain", "User" (und "Passwort") erfüllen.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am 07.04.2019 13:36.

07.04.2019 13:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
HexEdit HexEdit ist männlich
myCSharp.de-Mitglied

Dabei seit: 18.02.2019
Beiträge: 38
Entwicklungsumgebung: VisualStudio 2019

Themenstarter Thema begonnen von HexEdit

HexEdit ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Warumm sollte ich nicht den Code der ms Doku verwenden. :D Aber egal.

C#-Code:
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);

Das geht ja nicht da das Programm das Passwort des Benutzers nicht kennt.
Gibt es noch eine andere Möglichkeit ohne Passwort?
Im Prinzip sollte es ja gehen das das Programm Systemrechte hat oder sehe ich falsch?

Und

Zitat:
Es gibt aber verschiedene Wege der Impersonation.
Welche Du brauchst, das ist aus diesem Thread nicht ersichtlich.

Kenne mich überhaupt nicht mit aus, hab das Thema noch nie angefasst.
Werde aber gleich mal Googlen welche "Formen" es da gibt.
07.04.2019 13:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.785
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von HexEdit:
Warumm sollte ich nicht den Code der ms Doku verwenden. :D Aber egal.

Naja, das eine ist den Code aus der Doku nehmen und verstehen, das andere blind kopieren.
Die Doku verweist ja auch auf die Quelle von hToken.

Zitat von HexEdit:
Gibt es noch eine andere Möglichkeit ohne Passwort?

Das wäre ein Sicherheitsleck.

Erklär, was Du tun willst.
Dann kann man Dir sagen, ob der Weg überhaupt aus Sicherheitsaspekten so valide ist.

Aber etwas auszuführen im Namen des Users, wenn Du dessen Credentials nicht kennst: nicht valide.
Und in Unternehmen auch in 99% der Fälle nicht legal (vor allem nicht mit Betriebsräten).
07.04.2019 13:52 Beiträge des Benutzers | zu Buddylist hinzufügen
HexEdit HexEdit ist männlich
myCSharp.de-Mitglied

Dabei seit: 18.02.2019
Beiträge: 38
Entwicklungsumgebung: VisualStudio 2019

Themenstarter Thema begonnen von HexEdit

HexEdit ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich will ein Tool erstellen das unter anderem die Funktionalitäten von psexec hat.
Und da bei psexec das Passwort nicht erforderlich ist habe ich jetzt angenommen das das ohne Passwort möglich ist.

Zitat:
Und in Unternehmen auch in 99% der Fälle nicht legal (vor allem nicht mit Betriebsräten).

Bin noch in der Schule und hab sowas btw auch nicht mit Schul-PCs vor :D
07.04.2019 14:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.785
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Auch psExec wird nicht wahllos irgendein User impersonaten können.
Das wäre eine Windows-Lücke.

Und soweit ich weiß, funktioniert das Impersonate in PsExec durchaus mit Passwort - und fragt diese auch beim User Parameter ab.
Der -Credentials Parameter funktioniert mit gecachten Credentials; auch dort ist also eine Eingabe dieser notwendig.
07.04.2019 14:50 Beiträge des Benutzers | zu Buddylist hinzufügen
HexEdit HexEdit ist männlich
myCSharp.de-Mitglied

Dabei seit: 18.02.2019
Beiträge: 38
Entwicklungsumgebung: VisualStudio 2019

Themenstarter Thema begonnen von HexEdit

HexEdit ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

So nach ein bisschen googlen habe ich einen DLLImport (CreateProcessAsUser) erstellt und obwohl der Dienst SYSTEM rechte hat hab ich den ErrorCode für Zugriff verweigert erhalten, weiß jemand warum?

Dann ist mir aufgefallen das der import eig. nichts anderes macht als einen Prozess mit diesen Optionen in der ProcessStartInfo zu starten. (Hätte ich auch früher darauf kommen können :D)

C#-Code:
UseShellExecute = false,
Domain = "computername",
UserName = "username",
PasswordInClearText = "password" //oder Password

Problem ist das da hier (logischerweise wenn CreateProcessAsUser auch einen Fehler zurückgibt) auch Folgende Exception geworfen wird: "Access denied"

Weiß jemand warum?
07.04.2019 15:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.785
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Anhand dieser Informationen kann man sagen: weil Du keine Rechte hast.
Zumindest ist wurde nicht mit der Gabe des Hellsehens versehen ;-)
07.04.2019 16:18 Beiträge des Benutzers | zu Buddylist hinzufügen
HexEdit HexEdit ist männlich
myCSharp.de-Mitglied

Dabei seit: 18.02.2019
Beiträge: 38
Entwicklungsumgebung: VisualStudio 2019

Themenstarter Thema begonnen von HexEdit

HexEdit ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Anhand der Fehlermeldung ist das das Naheliegenste aber der Prozess ist zu 100% als "Local System" gestartet, jedenfals sagt Regedit und Services das.
07.04.2019 16:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.785
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das heisst aber noch lange nicht, dass Du dazu genügend Rechte hast.
"LocalSystem" kann auch nicht irgendwas einfach so im Namen anderer Ausführen - und das ist gut so.
07.04.2019 16:40 Beiträge des Benutzers | zu Buddylist hinzufügen
HexEdit HexEdit ist männlich
myCSharp.de-Mitglied

Dabei seit: 18.02.2019
Beiträge: 38
Entwicklungsumgebung: VisualStudio 2019

Themenstarter Thema begonnen von HexEdit

HexEdit ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Kann ich dem Dienst irgendwie die Rechte dazu geben?
07.04.2019 16:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.785
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wozu? Es ist absolut nicht ersichtlich, was Du tust oder vor hast.
07.04.2019 16:55 Beiträge des Benutzers | zu Buddylist hinzufügen
HexEdit HexEdit ist männlich
myCSharp.de-Mitglied

Dabei seit: 18.02.2019
Beiträge: 38
Entwicklungsumgebung: VisualStudio 2019

Themenstarter Thema begonnen von HexEdit

HexEdit ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Mein Problem liegt darin: von einem Windows Dienst aus ein Programm in einem anderen Benutzer auszuführen.
07.04.2019 17:01 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.785
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Was heisst "in einem anderen Benutzer"? In einer anderen aktiven Anmeldung? Oder als einen anderen Benutzer?
Ohne Credentials (Username+Password oder bereits den User Token) ist das in Windows nicht möglich.

Da Du aber weiterhin nicht sagen willst, was dieses andere Programm (wirklich ein Programm mit einer Instanz, wenn ja was für eine Art von Instanz? Shell, UI, Service, Call? oder nur ein Code Snippet?) ist, kann man Dir auch nicht genau helfen.
07.04.2019 17:44 Beiträge des Benutzers | zu Buddylist hinzufügen
HexEdit HexEdit ist männlich
myCSharp.de-Mitglied

Dabei seit: 18.02.2019
Beiträge: 38
Entwicklungsumgebung: VisualStudio 2019

Themenstarter Thema begonnen von HexEdit

HexEdit ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ja in der GUI des anderen Benutzers und das Problem mit dem Passwort hab ich mittlerweite auch verstanden dh.
Ein Programm im betreffenden Konto führt den folgenden cmd Command aus "sc start Dienstname -rp -userName:userName -password:(Vom Benutzer eingegebenes Passwort) -path:regedit.exe -args:regeditArgs"

der Dienst:

C#-Code:
class Dienst : ServiceBase
{
override OnStart(string[] args)
{
ArgumentParser parser = ArgumentParser .Parse(args);
StartProzessAlsBenutzer(parser.accountName, parser.password, parser.Path, parser.args);
}

void StartProzessAlsBenutzer(string userName, string passwd, string appPath, string[] args)
{
//Wie oben beschrieben
}
}
07.04.2019 17:53 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.785
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Sorry, für mich hört sich das Vorhaben sehr dubios an.

Was ist der wirkliche Sinn dahinter? Wieso installierst Du den Service nicht einfach und hinterlegst bei der Registrierung die Credentials?

Danach kannst Du einfach eine Impersonation mit CurrentUser arbeiten.
07.04.2019 17:57 Beiträge des Benutzers | zu Buddylist hinzufügen
HexEdit HexEdit ist männlich
myCSharp.de-Mitglied

Dabei seit: 18.02.2019
Beiträge: 38
Entwicklungsumgebung: VisualStudio 2019

Themenstarter Thema begonnen von HexEdit

HexEdit ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Was soll daran Dubios sein bräuchte ich auch "Fremden" Rechnern SystemRechte würde ich A: PsExcec herunterladen oder B: von einem Linux USB-Stick booten und gewisse Systemdateien durch cmd austauschen(zb Utilman.exe die in logonUI.exe startbar ist)...

Der Sinn dahinter ist: Gewisse Aktionen in Windows erfordern Systemrechte(manchmal aleine das lesen von bestimmten Dateien oder Ordnern)

Und deswegen benötigt mein Programm Systemrechte und da ich denke dass so ein Dienst mit wenigen Zeilen Code geschrieben ist will ich nicht unbedingt auf ein externes Programm wie PsExec ausweichen.

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von HexEdit am 07.04.2019 18:07.

07.04.2019 18:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.785
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wenn Du Credentials sicher und korrekt behandeln willst, dann kannst Du von mir beschrieben Weg verwenden:

Zitat von Abt:
Wieso installierst Du den Service nicht einfach und hinterlegst bei der Registrierung die Credentials?

Danach kannst Du einfach eine Impersonation mit CurrentUser arbeiten.

Das ist in Windows bereits eingebaut.
Utilman ist ein Hack - kein Tool für produktive Umgebungen.

"Einfach so" braucht man niemals auf fremden Rechnern Systemrechte.
Das ist einer der ersten Punkte, die man bei einer Systemhärtung entfernt.

Das Missbrauchspotential solcher Dinge ist hoch.
07.04.2019 18:11 Beiträge des Benutzers | zu Buddylist hinzufügen
HexEdit HexEdit ist männlich
myCSharp.de-Mitglied

Dabei seit: 18.02.2019
Beiträge: 38
Entwicklungsumgebung: VisualStudio 2019

Themenstarter Thema begonnen von HexEdit

HexEdit ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Den Dienst installiere ich ja und die Credentials werden auch übergebendas Problem ist immer noch die Exception "access denied" obwohl Credentials stimmen.

Hab auch mal mein PW entfernt und es funktioniert wie folgt immer noch nicht dh Exception

Wird bei "OnStart" aufgerufen mit StartProcess("cmd.exe", "@Echo Test")

C#-Code:
        private static void StartProcess(string path, string args)
        {
            Process.Start(new ProcessStartInfo
            {
                FileName = path,
                Arguments = args,
                UseShellExecute = false,
                Domain = "COMPUTER",
                UserName = "Admin",
                PasswordInClearText = ""
            }).WaitForExit();
        }

Und ich kann dir versichern das ich es nur für Private Zwecke benötige.
Für was "Illegales" soll man den sonst so ein Programm verwenden ->
- Für die möglichen Dinge gibt es bereits Programme.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von HexEdit am 07.04.2019 18:22.

07.04.2019 18:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.785
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Naja, wenn ich hier "Admin" sehe, dann bin ich mir hier sehr sicher, dass Du jeden empfohlenen Sicherheitsaspekt einer Anwendung bzw. eines Systems missachtest.
Aber das lass ich an dieser Stelle mal Dein Problem sein.


Access Denied kann hier viele Ursachen haben
... keine Rechte auf die Exe
... keine Rechte auf ein Pfad
... keine Rechte auf eine Dependency
... falsche Credentials
... Du versuchst einen Domain User gegen Local System zu authN
... Du versuchst eine Anwendung zu starten, die eine UI / Shell hat.
... das Vorgehen matched mit einer Virenscanner Heuristik und der Virenscanner knallt Dir Dein Zeug weg
... much more...

Zitat von HexEdit:
Den Dienst installiere ich ja und die Credentials

Und wieso zeigt Dein Code dann erneut Plaintext Credentials statt einer Impersionation?
07.04.2019 18:34 Beiträge des Benutzers | zu Buddylist hinzufügen
HexEdit HexEdit ist männlich
myCSharp.de-Mitglied

Dabei seit: 18.02.2019
Beiträge: 38
Entwicklungsumgebung: VisualStudio 2019

Themenstarter Thema begonnen von HexEdit

HexEdit ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Velleicht hab ich das mit den Credentials falsch verstanden aber der Dienst bekommt als Start- Argument den Benutzernamen und das Password des Kontos auf dem das Programm ausgeführt wird mit übergeben.

Die dann an die ProcessStartInfo übergeben werden

Und installiert werden, muss der Dienst ja mit SystemRechten sonst hat das Programm ja nur Nutzerrechte.

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von HexEdit am 07.04.2019 18:39.

07.04.2019 18:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
HexEdit HexEdit ist männlich
myCSharp.de-Mitglied

Dabei seit: 18.02.2019
Beiträge: 38
Entwicklungsumgebung: VisualStudio 2019

Themenstarter Thema begonnen von HexEdit

HexEdit ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Und Plaintext nur zur "lesbarkeit"

C#-Code:
        private static void StartProcess(string domain, string userName, string passwd, string path, string args)
        {
            System.IO.File.WriteAllText("C:\\Output.txt", path + "|" + args);

            Process.Start(new ProcessStartInfo
            {
                FileName = path,
                Arguments = args,
                UseShellExecute = false,
                Domain = domain,
                UserName = userName,
                PasswordInClearText = passwd
            }).WaitForExit();
        }
07.04.2019 18:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
HexEdit HexEdit ist männlich
myCSharp.de-Mitglied

Dabei seit: 18.02.2019
Beiträge: 38
Entwicklungsumgebung: VisualStudio 2019

Themenstarter Thema begonnen von HexEdit

HexEdit ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Start Meth.

C#-Code:
protected override void OnStart(string[] args)
        {
            try
            {
                StartProcess(args[0], args[1], args[2], args[3], args[4]);
            }
            catch (Exception ex)
            {
                pipe.WriteStr(ex.Message);
            }
.....
....
07.04.2019 18:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Monate.
Der letzte Beitrag ist älter als 3 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 16.07.2019 08:06