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

213

Angenommen, ein Windows-Dienst verwendet Code, der zugeordnete Netzlaufwerke und keine UNC-Pfade benötigt. 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 dauerhafte Zuordnung erstellen, wird die Zuordnung nicht im Kontext des tatsächlichen Dienstes erstellt.

VoidPointer
quelle
6
Siehe ForcePushs Antwort, seine Problemumgehung funktioniert.
Ubikuity

Antworten:

44

Sie müssen den Dienst entweder ändern oder in einen Hilfsprozess einbinden: Abgesehen von Problemen mit dem Sitzungs- / Laufwerkszugriff werden dauerhafte Laufwerkszuordnungen 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 trivial sind, sind:

  • Der Hilfsdienst muss alle entsprechenden SCM-Befehle (Start / Stopp usw.) an den eigentlichen Dienst weiterleiten. Wenn der echte Dienst benutzerdefinierte SCM-Befehle akzeptiert, denken Sie daran, diese ebenfalls weiterzugeben (ich erwarte jedoch nicht, dass ein Dienst, der UNC-Pfade als exotisch betrachtet, solche Befehle verwendet ...).

  • In Bezug auf die Anmeldeinformationen kann es etwas 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 Dienste sollten in Ordnung sein, solange das Konto über den entsprechenden Zugriff auf die Netzwerkfreigabe verfügt. Wenn der eigentliche Dienst nur funktioniert, wenn er als LOCALSYSTEM oder ähnliches ausgeführt wird, werden die Dinge interessanter, da er entweder das Netzwerklaufwerk überhaupt nicht "sehen" kann oder ein Jonglieren mit Anmeldeinformationen erfordert, damit die Dinge funktionieren.

mdb
quelle
2
Sehr informativ ... Bin ich zu Recht davon ausgegangen, dass Anmeldeskripte auch nur für interaktive Anmeldesitzungen und nicht für Service-Sitzungen ausgeführt werden?
VoidPointer
220

Verwenden Sie dies 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 :

Schritt eins: Öffnen Sie eine Eingabeaufforderung mit erhöhten cmd.exe-Werten (Als Administrator ausführen).

Schritt 2: Mit PSExec.exe erneut auf root erhöhen: Navigieren Sie zu dem Ordner, der SysinternalsSuite enthält, und führen Sie den folgenden Befehl psexec -i -s cmd.exe aus, der sich jetzt innerhalb einer Eingabeaufforderung befindet. nt authority\systemSie können dies durch Eingabe beweisen whoami. Dies -iist erforderlich, da Laufwerkszuordnungen mit dem Benutzer interagieren müssen

Schritt 3: Erstellen Sie mit dem folgenden Befehl das dauerhaft zugeordnete Laufwerk als SYSTEM-Konto net use z: \\servername\sharedfolder /persistent:yes

So einfach ist das!

WARNUNG : Sie können diese Zuordnung nur so entfernen, wie Sie sie erstellt haben, und zwar aus dem SYSTEM-Konto. 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.

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

ForcePush
quelle
3
Ich habe versucht, diese Lösung zu verwenden, und bin auf dieses Problem gestoßen: Das zugeordnete Laufwerk wird den Benutzern (sogar Administratoren) als nicht verbunden angezeigt. Irgendwelche Vorschläge?
Constantin Baciu
7
Nach einem Neustart ist das zugeordnete Laufwerk nicht mehr vorhanden. Irgendwelche Ideen? Die Zuordnung bleibt bestehen, aber der Status ist "Nicht verfügbar", sodass er nicht angezeigt wird
Tommy
4
Ich sehe die Zuordnung auch nach einem Neustart als nicht verfügbar an.
Dave Patterson
33
Um es nach einem Neustart net use z: \\servername\sharedfolderzum Laufen zu bringen , erstellen Sie ein Skript, das nur enthält, und stellen Sie es so ein, dass es beim Start des Computers ausgeführt wird (per technet.microsoft.com/en-us/library/cc770556.aspx). Dies wird als SYSTEM-Konto ausgeführt, sodass dies nicht erforderlich ist psexec.
TRS-80
2
Ich möchte hinzufügen, dass es wichtig ist, dass jeder die Klausel verwendet /USER:[remotecomp]\[remoteusername] [password](Befehl funktioniert manchmal nicht richtig, wenn dem Namen des Remotebenutzers kein Remotecomputername und ein Backslash vorangestellt werden. Außerdem, wenn die Freigabe kennwortgeschützt ist und für andere als nicht verbunden angezeigt wird Laufwerk, es ist NICHT für alle zugänglich. Jeder Benutzer auf diesem System, auf dem SYSTEM eine Freigabe bereitstellt, muss das Kennwort für diese Freigabe kennen (getestet auf XPx64)
Kitet
65

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

Fügen Sie einfach eine geplante Aufgabe hinzu, fügen Sie "System" in das Feld "Ausführen als" ein und verweisen Sie die Aufgabe mit dem einfachen Befehl auf eine Batchdatei

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.

Larry
quelle
Was beginnt zuerst? ein Windows-Dienst oder diese geplante Aufgabe? Unser Service stirbt beim Start, wenn der Pfad nicht verfügbar ist. Wir müssten dies neu erstellen, wenn der Dienst zuletzt gestartet wird.
Thomas
1
Ich habe dies auf 2008 R2 versucht. Es wird ein nicht verbundenes zugeordnetes Laufwerk erstellt. Wenn ich versuche, dasselbe Laufwerk zu öffnen, wird "z: \ ist nicht verfügbar. Anmeldefehler: unbekannter Benutzername oder falsches Kennwort" angezeigt. Aber ich konnte ein zugeordnetes Laufwerk erfolgreich erstellen, indem ich dieselbe Bat-Datei manuell ausführte. Ny Einblicke?
Gopi
1
@ Thomas es spielt keine Rolle, welche zuerst startet, vorausgesetzt, die Aufgabe wurde mindestens einmal ausgeführt, weil/persistent:yes
Edd
4
Warum muss es eine geplante Aufgabe sein? Es ist / hartnäckig: Ja, ist das nicht genug, um es zu behalten?
Scott Stafford
2
@ScottStafford Nein / persistent: Ja ist unter Win7 und höher nicht genug. Die Zuordnung wird nach dem Neustart unabhängig von diesem Schalter entfernt.
Eternal21
44

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

Hal
quelle
So einfach und funktioniert gut. Da es Teil des Dateisystems ist, steht der Link allen Konten zur Verfügung. Stellen Sie einfach sicher, dass der Dienst als Konto ausgeführt wird, das Zugriff auf die Netzwerkressource hat (was bei System usw. möglicherweise nicht der Fall ist).
Jeremy Frank
1
Dies ist definitiv die bessere Antwort auf die Frage, vielen Dank!
Sten Petrov
3
Wenn der Sym-Link auf eine Netzwerkfreigabe zugreift, sind Sie leider wieder auf dem ersten Platz
davidfrancis
23

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

Dh Sie können einen symbolischen Link verwenden, z

mklink /D C:\myLink \\127.0.0.1\c$
philu
quelle
1
Was passiert, wenn Sie nach dem Versuch, ein Verzeichnis innerhalb des Dienstes zu erstellen, einen Berechtigungsfehler erhalten?
Tyoc213
Sie sollten dies offline in einen Chatraum bringen und dann Details zur Fehlermeldung angeben. Sie müssen die Befehle wahrscheinlich mit erhöhten Berechtigungen ausführen.
Philu
@ tyoc213 Hast du eine Antwort bekommen?
Lsakurifaisu
9

Sie könnten uns den Befehl 'net use' 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 einer kleinen Wendung: Erstellen Sie Ihren eigenen Dienst (nennen wir ihn Zuordnungsdienst), der das Laufwerk zuordnet, und fügen Sie diesen Zuordnungsdienst zu den Abhängigkeiten für den ersten (tatsächlich funktionierenden) Dienst hinzu. Auf diese Weise wird der Arbeitsdienst nicht gestartet, bevor der Zuordnungsdienst gestartet wurde (und das Laufwerk zugeordnet hat).

Treb
quelle
Ich denke, dass mit diesem Mapping-Service-Setup die vom Mapping-Service erstellte Laufwerkszuordnung im Kontext des ursprünglichen Dienstes nicht verfügbar wäre, oder?
VoidPointer
Ich denke, es sollte <Disclaim> </ Disclaim> sein - es gibt nur eine Umgebung für jede Winlogon-Sitzung.
Treb
Ihr Code funktioniert in einem Dienst. Ich bin mit dem gleichen Problem wie das OP hierher gekommen, aber ich bin der Autor des Dienstes. Ihre Antwort hat mein Problem gelöst.
Joe Gayetty
5

ForcePush,

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

Es hängt alles von den Freigabeberechtigungen ab. Wenn Sie über alle Freigabeberechtigungen 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 zu 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 es funktionieren.

Was ich getan habe , ich habe keinen Laufwerksbuchstaben in meinem Startskript zugeordnet, sondern nur den net use \\\server\share ...UNC-Pfad in meinen geplanten Jobs verwendet und verwendet. Es wurde ein Anmeldeskript hinzugefügt (oder einfach eine Batchdatei zum Startordner hinzugefügt), das derselben Freigabe mit einem Laufwerksbuchstaben zugeordnet ist: 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 störende "Disconnected Network Drive ..." nicht. Wenn Sie jedoch wirklich Zugriff auf diese Freigabe über den Laufwerksbuchstaben und nicht nur über UNC benötigen, ordnen Sie diese Freigabe den verschiedenen Laufwerksbuchstaben zu, z. B. Y für System und Z für Benutzer.

lk7777
quelle
4

Es wurde eine Möglichkeit gefunden, Windows-Dienstzugriff auf das Netzwerklaufwerk zu gewähren.

Nehmen Sie zum Beispiel Windows Server 2012 mit NFS Disk:

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: Mounten Sie die Festplatte als NT AUTHORITY / SYSTEM.

Öffnen Sie "Task Scheduler" und erstellen Sie eine neue Aufgabe:

  1. Führen Sie als "SYSTEM" beim "Systemstart" aus.
  2. Aktion erstellen: Führen Sie "C: \ mount_nfs.bat" aus.

Nach diesen beiden einfachen Schritten kann mein Windows ActiveMQ-Dienst, der unter der Berechtigung "Lokales System" ausgeführt wird, ohne Anmeldung einwandfrei ausgeführt werden.

Val
quelle
3

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 diese Anwendung in dem Benutzerkonto ausführen, bei dem Sie sich angemeldet haben, wenn Sie sie als normale exe ausführen. Und dieser Benutzer hat die Berechtigungen, auf das Netzwerk zuzugreifen. Wenn Sie die ausführbare Datei jedoch als Dienst installieren, wird sie standardmäßig unter dem Konto "SYSTEM" ausgeführt, wenn Sie sie in der Taskverwaltung sehen. Und Sie wissen möglicherweise, dass das 'SYSTEM' keine Rechte zum Zugriff auf Netzwerkressourcen hat.

Es gibt zwei Lösungen für dieses Problem.

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

  2. Es gibt noch einen weiteren Ansatz, der verfolgt werden kann. Wenn Sie den Service Manager öffnen, indem Sie "services.msc" eingeben, können Sie zu Ihrem Service wechseln. In den Eigenschaften Ihres Service befindet sich eine Registerkarte "Anmelden", auf der Sie das Konto als jedes andere Konto als "System" angeben können Starten Sie den Dienst von Ihrem eigenen angemeldeten Benutzerkonto oder über 'Netzwerkdienst'. Wenn Sie dies tun, kann der Dienst auf jede Netzwerkkomponente und jedes Laufwerk 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 Parameter 'lpServiceStartName' auf 'NT' setzen AUTHORITY \ NetworkService '. Dadurch wird Ihr Dienst unter "Netzwerkdienst" gestartet.

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

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

Kushagra
quelle
1

Sie möchten weder den Benutzer, unter dem der Dienst ausgeführt wird, über "System" ändern, noch einen einfachen Weg finden, um Ihre Zuordnung als System auszuführen.

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

Torbjörn Gyllebring
quelle
Der Dienst wird nicht als "System" ausgeführt. Es ist so eingerichtet, dass es unter einem bestimmten lokalen Konto ausgeführt wird. Selbst wenn ich mich mit diesem Konto anmelde, eine dauerhafte Netzwerkzuordnung erstelle, mich abmelde und den Dienst neu starte, steht die Zuordnung dem Dienst nicht zur Verfügung.
VoidPointer
1

Anstatt sich auf ein dauerhaftes Laufwerk zu verlassen, können Sie das Skript so einstellen, dass das Laufwerk bei jeder Verwendung zugeordnet / aufgehoben 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.

Jeff
quelle
0

Ich kann noch keinen Kommentar abgeben (arbeite an der Reputation), habe aber ein Konto erstellt, um nur @ Tech Jerk @ spankmaster79 (netter Name lol) und @ NFC-Probleme zu beantworten, die sie als Antwort auf die Frage "Ich habe eine Lösung gefunden, die der mit ähnelt psexec funktioniert aber ohne zusätzliche Tools und überlebt einen Neustart. " post @ Larry hatte gemacht.

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

    \\servername\share  

Lassen Sie es auffordern, sich anzumelden, und geben Sie dieselben Anmeldeinformationen ein, die Sie für die UNC in psexec verwendet haben. Danach beginnt es zu arbeiten. In meinem Fall liegt dies meiner Meinung nach daran, dass der Server mit dem Dienst nicht Mitglied derselben Domäne ist wie der Server, dem ich zugeordnet bin. Ich denke, wenn sich sowohl der UNC als auch die geplante Aufgabe auf die IP anstelle des Hostnamens beziehen

    \\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.

CanadaDave
quelle