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.
windows
windows-services
unc
system-administration
mapped-drive
VoidPointer
źródło
źródło
Odpowiedzi:
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.
źródło
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\system
i możesz to udowodnić, piszącwhoami
. Jest-i
to konieczne, ponieważ mapowania dysków muszą wchodzić w interakcje z użytkownikiemKrok 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 $.
źródło
net use z: \\servername\sharedfolder
i 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./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)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
Następnie wybierz „uruchom przy starcie systemu” (lub podobny, nie mam wersji angielskiej) i gotowe.
źródło
/persistent:yes
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 .
źródło
Dobra odpowiedź tutaj: https://superuser.com/a/651015/299678
Tj. Możesz użyć dowiązania symbolicznego, np
źródło
Możesz nam użyć polecenia „net use”:
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).
źródło
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.źródło
Znaleziono sposób udzielenia usługi Windows dostępu do dysku sieciowego.
Weź Windows Server 2012 z dyskiem NFS na przykład:
Napisz plik wsadowy, np .: C: \ mount_nfs.bat
Otwórz „Harmonogram zadań”, utwórz nowe zadanie:
Po tych dwóch prostych krokach moja usługa Windows ActiveMQ uruchomiona z uprawnieniami „System lokalny” działa doskonale bez logowania.
źródło
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.
Aby zmapować dysk tak trwały, jak wskazano powyżej.
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”
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.
źródło
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.
źródło
Zamiast polegać na trwałym dysku, możesz ustawić skrypt do mapowania / odmapowania dysku za każdym razem, gdy go używasz:
To działa dla mnie.
źródło
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 .:
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
może całkowicie uniknąć problemu.
Jeśli kiedykolwiek zdobędę wystarczającą liczbę punktów powtórzeń, dodam to jako odpowiedź.
źródło