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.
windows
windows-services
unc
system-administration
mapped-drive
VoidPointer
quelle
quelle
Antworten:
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.
quelle
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\system
Sie können dies durch Eingabe beweisenwhoami
. Dies-i
ist erforderlich, da Laufwerkszuordnungen mit dem Benutzer interagieren müssenSchritt 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.
quelle
net use z: \\servername\sharedfolder
zum 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./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)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
Wählen Sie dann "Beim Systemstart ausführen" (oder ähnlich, ich habe keine englische Version) und Sie sind fertig.
quelle
/persistent:yes
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 .
quelle
Hier gibt es eine gute Antwort: https://superuser.com/a/651015/299678
Dh Sie können einen symbolischen Link verwenden, z
quelle
Sie könnten uns den Befehl 'net use' geben:
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).
quelle
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.quelle
Es wurde eine Möglichkeit gefunden, Windows-Dienstzugriff auf das Netzwerklaufwerk zu gewähren.
Nehmen Sie zum Beispiel Windows Server 2012 mit NFS Disk:
Schreiben Sie eine Batchdatei, z. B.: C: \ mount_nfs.bat
Öffnen Sie "Task Scheduler" und erstellen Sie eine neue Aufgabe:
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.
quelle
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.
So ordnen Sie das Laufwerk so dauerhaft zu, wie oben bereits angegeben.
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.
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.
quelle
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.
quelle
Anstatt sich auf ein dauerhaftes Laufwerk zu verlassen, können Sie das Skript so einstellen, dass das Laufwerk bei jeder Verwendung zugeordnet / aufgehoben wird:
Das funktioniert bei mir.
quelle
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:
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
es kann das Problem insgesamt vermeiden.
Wenn ich hier jemals genug Wiederholungspunkte bekomme, füge ich dies stattdessen als Antwort hinzu.
quelle