Zamapuj dysk sieciowy do użycia przez usługę

213

Załóżmy, że niektóre usługi systemu Windows używają kodu, który chce zmapowanych dysków sieciowych i żadnych ścieżek UNC. Jak mogę udostępnić mapowanie dysku dla sesji usługi po uruchomieniu usługi? Logowanie się jako użytkownik usługi i utworzenie trwałego mapowania nie ustanowi mapowania w kontekście faktycznej usługi.

VoidPointer
źródło
6
Zobacz odpowiedź ForcePush, jego obejście działa.
Ubikuity,

Odpowiedzi:

44

Musisz albo zmodyfikować usługę, albo owinąć ją w proces pomocnika: oprócz problemów z dostępem do sesji / dysku trwałe odwzorowania dysków są przywracane tylko przy logowaniu interaktywnym, którego usługi zwykle nie wykonują.

Podejście do procesu pomocnika może być dość proste: po prostu stwórz nową usługę, która mapuje dysk i uruchamia „prawdziwą” usługę. Jedyne rzeczy, które nie są do końca trywialne, to:

  • Usługa pomocnika będzie musiała przekazać wszystkie odpowiednie polecenia SCM (start / stop itp.) Do prawdziwej usługi. Jeśli prawdziwa usługa akceptuje niestandardowe polecenia SCM, pamiętaj, aby je również przekazać (nie oczekuję, że usługa, która uważa ścieżki UNC za egzotyczne, używa takich poleceń, ale ...)

  • Sprawy mogą być nieco trudne pod względem uwierzytelniającym. Jeśli prawdziwa usługa działa na zwykłym koncie użytkownika, możesz również uruchomić usługę pomocniczą na tym koncie i wszystko powinno być OK, o ile konto ma odpowiedni dostęp do udziału sieciowego. Jeśli prawdziwa usługa będzie działać tylko wtedy, gdy będzie działać jako LOCALSYSTEM lub coś w tym stylu, sprawy stają się bardziej interesujące, ponieważ albo nie będzie w stanie „zobaczyć” dysku sieciowego, albo będzie wymagać żonglowania danymi uwierzytelniającymi, aby wszystko działało.

mdb
źródło
2
Bardzo pouczające ... Czy mam rację zakładając, że skrypty logowania są uruchamiane tylko dla interaktywnych sesji logowania, a nie sesji serwisowych?
VoidPointer
220

Użyj tego na własne ryzyko. (Przetestowałem to na XP i Server 2008 x64 R2)

Do tego włamania potrzebujesz SysinternalsSuite autorstwa Marka Russinovicha :

Krok pierwszy: Otwórz wiersz polecenia cmd.exe z podwyższonym poziomem uprawnień (Uruchom jako administrator)

Krok drugi: Podnieś poziom ponownie, aby zrootować za pomocą PSExec.exe: Przejdź do folderu zawierającego SysinternalsSuite i wykonaj następujące polecenie, psexec -i -s cmd.exe które znajduje się w wierszu polecenia, nt authority\systemi możesz to udowodnić, pisząc whoami. Jest -ito konieczne, ponieważ mapowania dysków muszą wchodzić w interakcje z użytkownikiem

Krok trzeci: Utwórz trwały dysk zamapowany jako konto SYSTEM za pomocą następującego polecenia net use z: \\servername\sharedfolder /persistent:yes

To jest takie proste!

OSTRZEŻENIE : Mapowanie można usunąć tylko w taki sam sposób, w jaki zostało utworzone, z konta SYSTEM. Jeśli chcesz go usunąć, wykonaj kroki 1 i 2, ale zmień polecenie w kroku 3 na net use z: /delete.

UWAGA : Nowo utworzony zamapowany dysk będzie teraz wyświetlany dla WSZYSTKICH użytkowników tego systemu, ale zobaczy go jako „Odłączony dysk sieciowy (Z :)”. Nie daj się zwieść nazwie. Może twierdzić, że jest odłączony, ale będzie działać dla wszystkich. W ten sposób możesz stwierdzić, że ten hack nie jest obsługiwany przez M $.

ForcePush
źródło
3
Próbowałem użyć tego rozwiązania i napotkałem ten problem: zamapowany dysk jest wyświetlany jako odłączony dla użytkowników (nawet administratorów). Jakieś sugestie?
Constantin Baciu
7
Po ponownym uruchomieniu zmapowany dysk zniknął. Wszelkie pomysły? Mapowanie jest zachowywane, ale status to „Niedostępny”, więc się nie wyświetla
Tommy,
4
Widzę też, że mapowanie jest niedostępne po ponownym uruchomieniu.
Dave Patterson
33
Aby uruchomić go po ponownym uruchomieniu, utwórz skrypt zawierający go net use z: \\servername\sharedfolderi skonfiguruj tak, aby był uruchamiany przy uruchamianiu komputera, zgodnie z technet.microsoft.com/en-us/library/cc770556.aspx To będzie działać jako konto SYSTEM, więc nie ma potrzeby psexec.
TRS-80
2
Chcę dodać, że ważne jest, aby wszyscy używali tej klauzuli /USER:[remotecomp]\[remoteusername] [password](polecenie czasami nie działa poprawnie, gdy nazwa użytkownika zdalnego nie jest poprzedzona nazwą komputera zdalnego i odwrotnym ukośnikiem. Ponadto, jeśli udział jest chroniony hasłem i dla innych jest wyświetlany jako rozłączony dysk, NIE jest dostępny dla wszystkich. Każdy użytkownik w tym systemie, w którym SYSTEM montuje udział, musi znać hasło do tego udziału. (testowane na XPx64)
Kitet
65

Znalazłem rozwiązanie podobne do tego z psexec, ale działa bez dodatkowych narzędzi i przetrwa restart .

Wystarczy dodać zaplanowane zadanie, wstawić „system” w polu „Uruchom jako” i skierować zadanie do pliku wsadowego za pomocą prostej komendy

net use z: \servername\sharedfolder /persistent:yes

Następnie wybierz „uruchom przy starcie systemu” (lub podobny, nie mam wersji angielskiej) i gotowe.

Larry
źródło
co zaczyna się najpierw? usługa Windows czy to zaplanowane zadanie? nasza usługa umiera na początku, jeśli ścieżka jest niedostępna. Musielibyśmy to przebudować, jeśli usługa zacznie się ostatnio.
Thomas,
1
Próbowałem tego na 2008 R2, tworzy odłączony dysk zamapowany, a kiedy próbuję otworzyć to samo, mówi „z: \ nie jest dostępny. Błąd logowania: nieznana nazwa użytkownika lub złe hasło”. Ale udało mi się pomyślnie utworzyć zamapowany dysk, uruchamiając ręcznie ten sam plik nietoperza. Nie masz wglądu?
Gopi,
1
@ Thomas nie ma znaczenia, który zaczyna się pierwszy, pod warunkiem, że zadanie zostało uruchomione co najmniej raz z powodu/persistent:yes
Edd
4
Dlaczego musi to być zaplanowane zadanie? Jest / trwały: tak, czy to nie wystarczy, aby go utrzymać?
Scott Stafford,
2
@ScottStafford Nie / trwały: tak nie wystarczy na Win7 i późniejszych. Mapowanie jest usuwane po ponownym uruchomieniu, niezależnie od tego przełącznika.
Eternal21,
44

Lepszym sposobem byłoby użycie dowiązania symbolicznego za pomocą mklink.exe. Możesz po prostu utworzyć w systemie plików łącze, z którego będzie mogła korzystać każda aplikacja. Zobacz http://en.wikipedia.org/wiki/NTFS_symbolic_link .

Hal
źródło
Tak prosty i działa dobrze. Ponieważ jest to część systemu plików, łącze jest dostępne dla wszystkich kont. Upewnij się tylko, że usługa działa jako konto z dostępem do zasobu sieciowego (co może nie mieć miejsca w przypadku Systemu itp.).
Jeremy Frank
1
Jest to zdecydowanie NAJLEPSZA odpowiedź na pytanie, dziękuję bardzo!
Sten Petrov,
3
Niestety, jeśli łącze sym uzyskuje dostęp do udziału sieciowego, to wracasz do
punktu wyjścia
23

Dobra odpowiedź tutaj: https://superuser.com/a/651015/299678

Tj. Możesz użyć dowiązania symbolicznego, np

mklink /D C:\myLink \\127.0.0.1\c$
philu
źródło
1
Co się stanie, jeśli po próbie utworzenia katalogu z usługi wystąpi błąd uprawnień?
tyoc213,
Powinieneś zabrać to offline do pokoju rozmów, a następnie podać szczegóły komunikatu o błędzie. Prawdopodobnie musisz uruchomić polecenia z podwyższonymi uprawnieniami.
philu
@ tyoc213 Czy otrzymałeś odpowiedź?
Lsakurifaisu
9

Możesz nam użyć polecenia „net use”:

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

Jeśli to nie działa w usłudze, spróbuj Winapi i PInvoke WNetAddConnection2

Edycja: Oczywiście źle cię zrozumiałem - nie możesz zmienić kodu źródłowego usługi, prawda? W takim przypadku zastosowałbym się do sugestii mdb , ale z pewnym zwrotem: stwórz własną usługę (nazwijmy ją usługą mapowania), która mapuje dysk i dodaj tę usługę mapowania do zależności dla pierwszej (faktycznie działającej) usługi. W ten sposób działająca usługa nie uruchomi się przed uruchomieniem usługi mapowania (i zamapowania dysku).

Treb
źródło
przy tej konfiguracji usługi mapowania myślę, że mapowanie dysku ustanowione przez usługę mapowania nie byłoby dostępne w kontekście oryginalnej usługi, prawda?
VoidPointer,
Myślę, że <zrzeczenie się> powinno </disclaim> - istnieje tylko jedno środowisko dla każdej sesji winlogon.
Treb
Twój kod działa w usłudze. Przybyłem tutaj z tym samym problemem co OP, ale jestem autorem usługi. Twoja odpowiedź rozwiązała mój problem.
Joe Gayetty
5

ForcePush,

UWAGA : Nowo utworzony zamapowany dysk będzie teraz wyświetlany dla WSZYSTKICH użytkowników tego systemu, ale zobaczy go jako „Odłączony dysk sieciowy (Z :)”. Nie daj się zwieść nazwie. Może twierdzić, że jest odłączony, ale będzie działać dla wszystkich. W ten sposób możesz stwierdzić, że ten hack nie jest obsługiwany przez M $ ...

Wszystko zależy od uprawnień do udostępniania. Jeśli masz uprawnienia Wszyscy do udostępniania, ten zmapowany dysk będzie dostępny dla innych użytkowników. Ale jeśli masz tylko określonego użytkownika, którego poświadczenia użyłeś w skrypcie wsadowym, a ten skrypt wsadowy został dodany do skryptów uruchamiania, tylko konto systemowe będzie miało dostęp do tego udziału, nawet Administrator. Jeśli więc używasz na przykład zaplanowanego zadania ntbackuo, konto systemowe musi być używane w opcji „Uruchom jako”. Jeśli usługa „Zaloguj się jako: lokalne konto systemowe”, powinna działać.

Co zrobiłem , nie zamapowałem żadnej litery dysku w skrypcie startowym, po prostu użyłem net use \\\server\share ...ścieżki UNC w moich zaplanowanych zadaniach. Dodano skrypt logowania (lub po prostu dodaj plik wsadowy do folderu startowego) z mapowaniem do tego samego udziału z pewną literą dysku: net use Z: \\\...z tymi samymi poświadczeniami. Teraz zalogowany użytkownik może zobaczyć i uzyskać dostęp do zamapowanego dysku. Istnieją 2 połączenia z tym samym udziałem. W tym przypadku użytkownik nie widzi denerwującego „Odłączonego dysku sieciowego ...”. Ale jeśli naprawdę potrzebujesz dostępu do tego udziału za pomocą litery dysku, a nie tylko UNC, odwzoruj tę zawartość na różne litery dysku, np. Y dla systemu i Z dla użytkowników.

lk7777
źródło
4

Znaleziono sposób udzielenia usługi Windows dostępu do dysku sieciowego.

Weź Windows Server 2012 z dyskiem NFS na przykład:

Krok 1: Napisz plik wsadowy do zamontowania.

Napisz plik wsadowy, np .: 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

Krok 2: Zainstaluj dysk jako NT AUTHORITY / SYSTEM.

Otwórz „Harmonogram zadań”, utwórz nowe zadanie:

  1. Uruchom jako „SYSTEM” przy „Uruchamianiu systemu”.
  2. Utwórz akcję: Uruchom „C: \ mount_nfs.bat”.

Po tych dwóch prostych krokach moja usługa Windows ActiveMQ uruchomiona z uprawnieniami „System lokalny” działa doskonale bez logowania.

Val
źródło
3

Powodem, dla którego możesz uzyskać dostęp do dysku, gdy normalnie uruchamiasz plik wykonywalny z wiersza polecenia, jest to, że wykonując go jak zwykły plik exe, uruchamiasz tę aplikację na koncie użytkownika, z którego się zalogowałeś. I ten użytkownik ma uprawnienia dostępu do sieci. Ale po zainstalowaniu pliku wykonywalnego jako usługi domyślnie, jeśli widzisz w zarządzaniu zadaniami, działa on na koncie „SYSTEM”. Być może wiesz, że „SYSTEM” nie ma praw dostępu do zasobów sieciowych.

Istnieją dwa rozwiązania tego problemu.

  1. Aby zmapować dysk tak trwały, jak wskazano powyżej.

  2. Jest jeszcze jedno podejście, które można zastosować. Jeśli otworzysz menedżera usług, wpisując „services.msc”, możesz przejść do swojej usługi, a we właściwościach usługi znajduje się karta logowania, w której możesz określić konto jako dowolne konto inne niż „System”. uruchomić usługę z własnego konta użytkownika lub poprzez „usługę sieciową”. Po wykonaniu tej czynności usługa może uzyskać dostęp do dowolnego komponentu sieciowego i dysku, nawet jeśli nie są one również trwałe. Aby to osiągnąć programowo, możesz zajrzeć do funkcji „CreateService” na stronie adresem http://msdn.microsoft.com/en-us/library/ms682450(v=vs.85).aspx i ustawić parametr „lpServiceStartName” na „NT AUTHORITY \ NetworkService ”. Spowoduje to uruchomienie usługi w sekcji „Usługa sieciowa”

  3. Możesz także spróbować uczynić usługę interaktywną, określając SERVICE_INTERACTIVE_PROCESS w znaczniku parametru typu serwisowego funkcji CreateService (), ale będzie to ograniczone tylko do XP, ponieważ Vista i 7 nie obsługują tej funkcji.

Mam nadzieję, że rozwiązania Ci pomogą. Daj mi znać, czy to zadziałało.

Kushagra
źródło
1

Nie chcesz ani zmieniać użytkownika, pod którym działa Usługa z „Systemu”, ani znaleźć sprytnego sposobu uruchamiania mapowania jako Systemu.

Zabawne jest to, że jest to możliwe przy użyciu polecenia „at” , wystarczy zaplanować mapowanie dysku na minutę w przyszłości, a będzie ono uruchamiane na koncie systemowym, dzięki czemu dysk będzie widoczny dla Twojej usługi.

Torbjörn Gyllebring
źródło
usługa nie działa jako „System”. Jest skonfigurowany do działania na określonym koncie lokalnym. Nawet gdy zaloguję się przy użyciu tego konta, utworzę trwałe mapowanie sieciowe, wyloguję się i ponownie uruchomię usługę, mapowanie nie będzie dostępne dla usługi.
VoidPointer,
1

Zamiast polegać na trwałym dysku, możesz ustawić skrypt do mapowania / odmapowania dysku za każdym razem, gdy go używasz:

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

To działa dla mnie.

Jeff
źródło
0

Nie mogę jeszcze komentować (pracuję nad reputacją), ale utworzyłem konto, aby odpowiedzieć na @Tech Jerk @ spankmaster79 (ładne imię lol) i problemy @NMC, które zgłosili w odpowiedzi na „Znalazłem rozwiązanie podobne do tego z psexec, ale działa bez dodatkowych narzędzi i przetrwa restart. ” post @Larry dokonał.

Rozwiązaniem tego jest po prostu przejście do tego folderu z poziomu zalogowanego konta, tj .:

    \\servername\share  

i pozwól mu zalogować się i wprowadź te same poświadczenia, których użyłeś dla UNC w psexec. Potem zaczyna działać. W moim przypadku myślę, że dzieje się tak, ponieważ serwer z usługą nie należy do tej samej domeny, co serwer, na który mapuję. Myślę, że zarówno UNC, jak i zaplanowane zadanie odnoszą się do adresu IP zamiast nazwy hosta

    \\123.456.789.012\share 

może całkowicie uniknąć problemu.

Jeśli kiedykolwiek zdobędę wystarczającą liczbę punktów powtórzeń, dodam to jako odpowiedź.

CanadaDave
źródło