web-dev-qa-db-de.com

Ordnen Sie ein Netzlaufwerk zu, das von einem Dienst verwendet werden soll

Angenommen, ein Windows-Dienst verwendet Code, für den Netzlaufwerke und keine UNC-Pfade zugeordnet werden sollen. Wie kann ich die Laufwerkszuordnung für die Sitzung des Dienstes verfügbar machen, wenn der Dienst gestartet wird? Wenn Sie sich als Dienstbenutzer anmelden und eine permanente Zuordnung erstellen, wird die Zuordnung nicht im Kontext des tatsächlichen Dienstes erstellt.

205
VoidPointer

Sie müssen den Dienst entweder ändern oder in einen Hilfsprozess einbinden: Abgesehen von Problemen mit dem Sitzungs-/Laufwerkzugriff werden dauerhafte Laufwerkzuordnungen nur bei einer interaktiven Anmeldung wiederhergestellt, die Dienste normalerweise nicht ausführen.

Der Ansatz des Hilfsprozesses kann recht einfach sein: Erstellen Sie einfach einen neuen Dienst, der das Laufwerk abbildet und den "echten" Dienst startet. Die einzigen Dinge, die diesbezüglich nicht ganz unbedeutend sind, sind:

  • Der Hilfsdienst muss alle entsprechenden SCM-Befehle (Start/Stopp usw.) an den realen Dienst weiterleiten. Wenn der echte Dienst benutzerdefinierte SCM-Befehle akzeptiert, denken Sie daran, diese ebenfalls weiterzugeben (ich erwarte jedoch keinen Dienst, der UNC-Pfade für exotisch hält, um solche Befehle zu verwenden ...).

  • In Bezug auf die Anmeldeinformationen kann es schwierig werden. Wenn der echte Dienst unter einem normalen Benutzerkonto ausgeführt wird, können Sie den Hilfsdienst auch unter diesem Konto ausführen. Alle sollten in Ordnung sein, solange das Konto über den entsprechenden Zugriff auf die Netzwerkfreigabe verfügt. Wenn der echte Dienst nur dann funktioniert, wenn er als LOCALSYSTEM oder so ausgeführt wird, werden die Dinge interessanter, da er entweder das Netzlaufwerk überhaupt nicht "sehen" kann oder ein gewisses Jonglieren der Anmeldeinformationen benötigt, um die Dinge zum Laufen zu bringen.

40
mdb

Die Verwendung erfolgt auf eigenes Risiko. (Ich habe es auf XP und Server 2008 x64 R2) getestet.)

Für diesen Hack benötigen Sie SysinternalsSuite von Mark Russinovich :

Erster Schritt: Öffnen Sie eine Eingabeaufforderung mit erhöhten Rechten für cmd.exe (Als Administrator ausführen)

Schritt 2: Mit PSExec.exe erneut zum Root-Verzeichnis wechseln: Navigieren Sie zum Ordner mit SysinternalsSuite und führen Sie den folgenden Befehl aus: psexec -i -s cmd.exe Sie befinden sich jetzt in einer Eingabeaufforderung mit dem Namen nt authority\system und Sie können dies beweisen, indem Sie whoami eingeben. Das -i wird benötigt, da Laufwerkszuordnungen mit dem Benutzer interagieren müssen

Dritter Schritt: Erstellen Sie das persistent zugeordnete Laufwerk als SYSTEM-Konto mit dem folgenden Befehl Net Use z: \\servername\sharedfolder /persistent:yes

So einfach ist das!

[~ # ~] Warnung [~ # ~] : Sie können diese Zuordnung nur auf die gleiche Weise, wie Sie sie erstellt haben, aus dem SYSTEM-Konto entfernen. Wenn Sie es entfernen müssen, befolgen Sie die Schritte 1 und 2, ändern Sie jedoch den Befehl in Schritt 3 in Net Use z: /delete.

[~ # ~] note [~ # ~] : Das neu erstellte zugeordnete Laufwerk wird jetzt für ALLE Benutzer dieses Systems angezeigt, wird jedoch angezeigt als "Disconnected Network Drive (Z :)". Lass dich nicht vom Namen täuschen. Es kann behaupten, getrennt zu sein, aber es wird für alle funktionieren. So können Sie feststellen, dass dieser Hack von M $ nicht unterstützt wird.

213
ForcePush

Ich habe eine Lösung gefunden, die der mit psexec ähnelt, aber funktioniert ohne zusätzliche Tools und überlebt einen Neustart.

Fügen Sie einfach eine geplante Aufgabe hinzu, fügen Sie "system" in das Feld "run as" ein und verweisen Sie die Aufgabe mit dem einfachen Befehl auf eine Batch-Datei

Net Use z: \servername\sharedfolder /persistent:yes

Wählen Sie dann "Beim Systemstart ausführen" (oder ähnlich, ich habe keine englische Version) und Sie sind fertig.

58
larry

Ein besserer Weg wäre die Verwendung eines symbolischen Links mit mklink.exe. Sie können einfach einen Link im Dateisystem erstellen, den jede App verwenden kann. Siehe http://en.wikipedia.org/wiki/NTFS_symbolic_link .

42
Hal

Hier gibt es eine gute Antwort: https://superuser.com/a/651015/299678

Das heißt Sie können einen symbolischen Link verwenden, z.

mklink /D C:\myLink \\127.0.0.1\c$
20
philu

Sie könnten uns den 'Net Use'-Befehl geben:

var p = System.Diagnostics.Process.Start("net.exe", "use K: \\\\Server\\path");
var isCompleted = p.WaitForExit(5000);

Wenn dies in einem Dienst nicht funktioniert, versuchen Sie es mit Winapi und PInvoke WNetAddConnection2

Edit: Offensichtlich habe ich dich falsch verstanden - du kannst den Quellcode des Dienstes nicht ändern, oder? In diesem Fall würde ich dem Vorschlag von mdb folgen, aber mit einem kleinen Dreh: Erstellen Sie Ihren eigenen Dienst (nennen wir ihn Zuordnungsdienst), der das Laufwerk zuordnet und diesen Zuordnungsdienst den Abhängigkeiten für den ersten hinzufügt (der eigentliche Arbeits-) Service. Auf diese Weise wird der Arbeitsdienst nicht gestartet, bevor der Zuordnungsdienst gestartet wurde (und das Laufwerk zugeordnet wurde).

9
Treb

ForcePush,

NOTE : Das neu erstellte zugeordnete Laufwerk wird jetzt für ALLE Benutzer dieses Systems angezeigt, sie sehen es jedoch als "Disconnected Network Drive (Z :)". Lass dich nicht vom Namen täuschen. Es kann behaupten, getrennt zu sein, aber es wird für alle funktionieren. So können Sie feststellen, dass dieser Hack von M $ nicht unterstützt wird ...

Alles hängt von den Freigabeberechtigungen ab. Wenn Sie über die Freigabeberechtigungen Jeder verfügen, können andere Benutzer auf dieses zugeordnete Laufwerk zugreifen. Wenn Sie jedoch nur einen bestimmten Benutzer haben, dessen Anmeldeinformationen Sie in Ihrem Stapelskript verwendet haben und dieses Stapelskript den Startskripten hinzugefügt wurde, hat nur das Systemkonto Zugriff auf diese Freigabe, nicht einmal der Administrator. Wenn Sie beispielsweise einen geplanten ntbackuo-Job verwenden, muss das Systemkonto unter "Ausführen als" verwendet werden. Wenn Ihr Dienst "Anmelden als: Lokales Systemkonto" ist, sollte dies funktionieren.

Was ich getan habe, ich habe keinen Laufwerksbuchstaben in meinem Startskript zugeordnet, habe nur Net Use \\\server\share ... Und den UNC-Pfad in meinen geplanten Jobs verwendet. Es wurde ein Anmeldeskript hinzugefügt (oder einfach eine Batchdatei zum Startordner hinzugefügt), mit der Zuordnung zu derselben Freigabe mit einem Laufwerksbuchstaben: Net Use Z: \\\... Mit denselben Anmeldeinformationen. Jetzt kann der angemeldete Benutzer das zugeordnete Laufwerk sehen und darauf zugreifen. Es gibt 2 Verbindungen zu derselben Freigabe. In diesem Fall sieht der Benutzer das ärgerliche "Disconnected Network Drive ..." nicht. Wenn Sie jedoch wirklich Zugriff auf diese Freigabe durch den Laufwerksbuchstaben und nicht nur durch UNC benötigen, ordnen Sie diese Freigabe den verschiedenen Laufwerksbuchstaben zu, z. Y für System und Z für Benutzer.

5
lk7777

Es wurde eine Möglichkeit gefunden, dem Windows-Dienst Zugriff auf Network Drive zu gewähren.

Nehmen Sie Windows Server 2012 mit NFS-Datenträger zum Beispiel:

Schritt 1: Schreiben Sie eine Batch-Datei zum Mounten.

Schreiben Sie eine Batchdatei, z. B .: C:\mount_nfs.bat

echo %time% >> c:\mount_nfs_log.txt
Net Use Z: \\{your ip}\{netdisk folder}\ >> C:\mount_nfs_log.txt 2>&1

Schritt 2: Hängen Sie die Festplatte als NT AUTHORITY/SYSTEM ein.

Öffne "Task Scheduler", erstelle eine neue Aufgabe:

  1. Führen Sie unter "Systemstart" den Befehl "SYSTEM" aus.
  2. Aktion erstellen: Führen Sie "C:\mount_nfs.bat" aus.

Nach diesen beiden einfachen Schritten wird mein Windows ActiveMQ-Dienst unter dem Privileg "Lokales System" ausgeführt und funktioniert ohne Anmeldung einwandfrei.

4
Val

Der Grund, warum Sie auf das Laufwerk zugreifen können, wenn Sie die ausführbare Datei normalerweise über die Eingabeaufforderung ausführen, besteht darin, dass Sie die Anwendung in dem Benutzerkonto ausführen, über das Sie angemeldet sind, wenn Sie sie als normale Exe ausführen. Dieser Benutzer hat die Berechtigung, auf das Netzwerk zuzugreifen. Wenn Sie die ausführbare Datei jedoch als Dienst installieren, wird sie in der Taskverwaltung standardmäßig unter dem Konto "SYSTEM" ausgeführt. Vielleicht wissen Sie auch, dass das SYSTEM keine Zugriffsrechte für Netzwerkressourcen besitzt.

Für dieses Problem gibt es zwei Lösungen.

  1. So ordnen Sie das Laufwerk als dauerhaft zu, wie oben bereits angegeben.

  2. Es gibt noch einen weiteren Ansatz, der verfolgt werden kann. Wenn Sie den Dienstmanager durch Eingabe von "services.msc" öffnen, können Sie zu Ihrem Dienst wechseln. In den Eigenschaften Ihres Dienstes befindet sich eine Registerkarte "Anmelden", auf der Sie das Konto als jedes andere Konto als "System" angeben können Starten Sie den Dienst über Ihr eigenes angemeldetes Benutzerkonto oder über "Netzwerkdienst". Wenn Sie dies tun, kann der Dienst auf alle Netzwerkkomponenten und Laufwerke zugreifen, auch wenn diese nicht dauerhaft sind. Um dies programmgesteuert zu erreichen, können Sie die Funktion 'CreateService' unter http://msdn.Microsoft.com/en-us/library/ms682450 (v = vs.85) .aspx aufrufen und den Wert festlegen Parameter 'lpServiceStartName' auf 'NT AUTHORITY\NetworkService'. Damit wird Ihr Dienst unter dem Konto "Netzwerkdienst" gestartet und Sie sind fertig.

  3. Sie können auch versuchen, den Dienst interaktiv zu machen, indem Sie SERVICE_INTERACTIVE_PROCESS im Parameterflag "servicetype" Ihrer Funktion "CreateService ()" angeben. Dies ist jedoch nur begrenzt, bis XP, da Vista und 7 diese Funktion nicht unterstützen.

Ich hoffe, die Lösungen helfen Ihnen. Lassen Sie mich wissen, ob dies für Sie funktioniert hat.

3
Kushagra

Sie möchten entweder den Benutzer, unter dem der Dienst ausgeführt wird, von "System" aus ändern oder einen raffinierten Weg finden, um Ihre Zuordnung als System auszuführen.

Das Lustige daran ist, dass dies mit dem Befehl "at" möglich ist. Planen Sie Ihre Laufwerkszuordnung einfach eine Minute in die Zukunft und sie wird unter dem Systemkonto ausgeführt, damit das Laufwerk für Ihren Dienst sichtbar wird.

Anstatt sich auf ein beständiges Laufwerk zu verlassen, können Sie das Skript so einstellen, dass das Laufwerk bei jeder Verwendung zugeordnet wird:

Net Use Q: \\share.domain.com\share 
forfiles /p Q:\myfolder /s /m *.txt /d -0 /c "cmd /c del @path"
Net Use Q: /delete

Das funktioniert bei mir.

1
jeff

Ich kann noch keinen Kommentar abgeben (ich arbeite an der Reputation), habe aber ein Konto erstellt, um @Tech Jerk @ spankmaster79 (Nice name lol) und @NMC-Probleme zu beantworten, die sie als Antwort auf die Frage "Ich habe eine Lösung gefunden, die der mit ähnlich ist" gemeldet psexec funktioniert aber ohne zusätzliche tools und überlebt einen neustart. " post @ Larry hatte gemacht.

Die Lösung hierfür besteht darin, einfach in dem angemeldeten Konto zu diesem Ordner zu navigieren, dh:

    \\servername\share  

und lassen Sie es zur Anmeldung auffordern und geben Sie die gleichen Anmeldeinformationen ein, die Sie für die UNC in psexec verwendet haben. Danach fängt es an zu arbeiten. In meinem Fall liegt dies wahrscheinlich daran, dass der Server mit dem Dienst nicht zu derselben Domäne gehört wie der Server, dem ich eine Zuordnung vornehme. Ich denke, wenn die UNC und die geplante Aufgabe beide auf die IP anstelle des Hostnamens verweisen

    \\123.456.789.012\share 

es kann das Problem insgesamt vermeiden.

Wenn ich hier jemals genug Wiederholungspunkte bekomme, füge ich dies stattdessen als Antwort hinzu.

0
CanadaDave