Memetakan drive jaringan untuk digunakan oleh layanan


213

Misalkan beberapa layanan Windows menggunakan kode yang ingin memetakan drive jaringan dan tidak ada jalur UNC. Bagaimana saya bisa membuat pemetaan drive tersedia untuk sesi layanan ketika layanan dimulai? Masuk sebagai pengguna layanan dan membuat pemetaan persisten tidak akan membuat pemetaan dalam konteks layanan aktual.


6
Lihat jawaban ForcePush, solusinya berhasil.
Ubikuity

Jawaban:


44

Anda harus memodifikasi layanan, atau membungkusnya dalam proses bantuan: selain dari masalah akses sesi / drive, pemetaan drive yang persisten hanya dipulihkan pada login interaktif, yang biasanya tidak dilakukan oleh layanan.

Pendekatan proses pembantu bisa sangat sederhana: cukup buat layanan baru yang memetakan drive dan memulai layanan 'nyata'. Satu-satunya hal yang tidak sepenuhnya sepele tentang ini adalah:

  • Layanan pembantu harus meneruskan semua perintah SCM yang sesuai (mulai / hentikan, dll.) Ke layanan nyata. Jika layanan nyata menerima perintah SCM khusus, ingat untuk meneruskannya juga (saya tidak mengharapkan layanan yang menganggap jalur UNC eksotis untuk menggunakan perintah tersebut, meskipun ...)

  • Hal-hal yang mungkin sedikit rumit berdasarkan kepercayaan. Jika layanan nyata berjalan di bawah akun pengguna normal, Anda juga dapat menjalankan layanan pembantu di bawah akun itu, dan semua akan baik-baik saja selama akun tersebut memiliki akses yang tepat ke jaringan berbagi. Jika layanan nyata hanya akan berfungsi ketika dijalankan sebagai LOCALSYSTEM atau semacamnya, segalanya menjadi lebih menarik, karena ia tidak akan dapat 'melihat' drive jaringan sama sekali, atau memerlukan beberapa juggling kredensial untuk membuat sesuatu berfungsi.


2
Sangat informatif ... Apakah saya benar dengan menganggap bahwa skrip masuk juga hanya dijalankan untuk sesi masuk interaktif dan bukan untuk sesi layanan?
VoidPointer

220

Gunakan ini dengan risiko Anda sendiri. (Saya telah mengujinya di XP dan Server 2008 x64 R2)

Untuk peretasan ini, Anda memerlukan SysinternalsSuite oleh Mark Russinovich :

Langkah satu: Buka prompt cmd.exe tinggi (Jalankan sebagai administrator)

Langkah dua: Tinggikan kembali untuk melakukan root menggunakan PSExec.exe: Arahkan ke folder yang berisi SysinternalsSuite dan jalankan perintah berikut psexec -i -s cmd.exe Anda sekarang berada di dalam prompt yang ada nt authority\systemdan Anda dapat membuktikan ini dengan mengetik whoami. Itu-i diperlukan karena pemetaan drive perlu berinteraksi dengan pengguna

Langkah Tiga: Buat drive yang dipetakan terus-menerus sebagai akun SYSTEM dengan perintah berikut net use z: \\servername\sharedfolder /persistent:yes

Sangat mudah!

PERINGATAN : Anda hanya dapat menghapus pemetaan ini dengan cara yang sama seperti Anda membuatnya, dari akun SYSTEM. Jika Anda perlu menghapusnya, ikuti langkah 1 dan 2 tetapi ubah perintah pada langkah 3 menjadi net use z: /delete.

CATATAN : Drive yang dipetakan yang baru dibuat sekarang akan muncul untuk SEMUA pengguna sistem ini tetapi mereka akan melihatnya ditampilkan sebagai "Drive Jaringan Terputus (Z :)". Jangan biarkan nama itu membodohi Anda. Mungkin mengklaim terputus tetapi akan bekerja untuk semua orang. Begitulah cara Anda mengetahui bahwa peretasan ini tidak didukung oleh M $.


3
Saya mencoba menggunakan solusi ini dan mengalami masalah ini: drive yang dipetakan muncul sebagai terputus ke pengguna (bahkan admin). Ada saran?
Constantin Baciu

7
Setelah reboot, drive yang dipetakan hilang. Ada gagasan? Pemetaan ini tetap ada, tetapi statusnya "Tidak tersedia" sehingga tidak muncul
Tommy

4
Saya juga melihat pemetaan tidak tersedia setelah reboot.
Dave Patterson

33
Untuk membuatnya berfungsi setelah reboot, buat skrip yang hanya berisi net use z: \\servername\sharedfolderdan setel agar dijalankan pada startup komputer, per technet.microsoft.com/en-us/library/cc770556.aspx Ini akan berjalan sebagai akun SYSTEM, jadi tidak perlu untuk psexec.
TRS-80

2
Saya ingin menambahkan bahwa penting bahwa semua orang menggunakan klausa /USER:[remotecomp]\[remoteusername] [password](perintah tidak berfungsi dengan baik kadang-kadang ketika nama pengguna jarak jauh tidak didahului dengan nama komputer jarak jauh dan backslash. Juga, jika berbagi dilindungi kata sandi, dan muncul untuk orang lain sebagai terputus drive, itu TIDAK dapat diakses untuk semua orang. Setiap pengguna pada sistem itu, di mana SISTEM me-mount berbagi harus tahu kata sandi untuk berbagi itu (diuji pada XPx64)
Kitet

65

Saya menemukan solusi yang mirip dengan psexec tetapi berfungsi tanpa alat tambahan dan selamat dari reboot .

Cukup tambahkan tugas terjadwal, masukkan "sistem" di bidang "jalankan sebagai" dan arahkan tugas ke file batch dengan perintah sederhana

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

Kemudian pilih "jalankan saat startup sistem" (atau serupa, saya tidak memiliki versi bahasa Inggris) dan Anda selesai.


apa yang dimulai lebih dulu? layanan windows atau tugas terjadwal ini? layanan kami mati di awal jika jalur tidak tersedia. Kami harus membangun kembali ini jika layanan dimulai terakhir.
Thomas

1
Saya mencoba ini pada 2008 R2, itu menciptakan Drive terpetakan terputus dan ketika saya mencoba untuk membuka yang sama ia mengatakan "z: \ tidak dapat diakses. Kegagalan Masuk: nama pengguna tidak dikenal atau kata sandi buruk." Tapi saya berhasil membuat drive yang dipetakan dengan menjalankan file bat yang sama secara manual. Ny wawasan?
Gopi

1
@Thomas tidak masalah yang dimulai pertama memberikan tugas telah dijalankan setidaknya sekali karena/persistent:yes
Edd

4
Mengapa harus menjadi tugas yang dijadwalkan? Itu / terus-menerus: ya, bukankah itu cukup untuk membuatnya tetap ada?
Scott Stafford

2
@ScottStafford Tidak / persisten: ya tidak cukup pada Win7 dan yang lebih baru. Pemetaan akan dihapus setelah reboot terlepas dari saklar itu.
Eternal21

44

Cara yang lebih baik adalah dengan menggunakan tautan simbolik menggunakan mklink.exe. Anda bisa membuat tautan di sistem file yang dapat digunakan aplikasi apa pun. Lihat http://en.wikipedia.org/wiki/NTFS_symbolic_link .


Sangat sederhana dan bekerja dengan baik. Karena ini adalah bagian dari sistem file, tautan tersedia untuk semua akun. Pastikan saja layanan berjalan sebagai akun yang memiliki akses ke sumber daya jaringan (yang mungkin tidak berlaku untuk Sistem dll.).
Jeremy Frank

1
Ini PASTI jawaban yang lebih baik untuk pertanyaan, terima kasih banyak!
Sten Petrov

3
Sayangnya jika tautan sym mengakses berbagi jaringan maka Anda kembali ke titik awal
davidfrancis

23

Ada jawaban yang bagus di sini: https://superuser.com/a/651015/299678

Yaitu Anda dapat menggunakan tautan simbolis, mis

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

1
Bagaimana jika Anda mendapatkan setelah mencoba membuat direktori dari dalam layanan kesalahan izin?
tyoc213

Anda harus membawa ini secara offline ke ruang obrolan, dan kemudian memberikan rincian pesan kesalahan. Anda mungkin perlu menjalankan perintah dengan izin tinggi.
philu

@ tyoc213 Apakah Anda mendapat jawaban?
Lsakurifaisu

9

Anda bisa memberi kami perintah 'net use':

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

Jika itu tidak berhasil dalam layanan, coba Winapi dan PInvoke WNetAddConnection2

Sunting: Jelas saya salah paham dengan Anda - Anda tidak dapat mengubah kode sumber layanan, bukan? Dalam hal ini saya akan mengikuti saran oleh mdb , tetapi dengan sedikit twist: Buat layanan Anda sendiri (sebut saja layanan pemetaan) yang memetakan drive dan menambahkan layanan pemetaan ini ke dependensi untuk layanan pertama (pekerjaan aktual). Dengan begitu layanan yang bekerja tidak akan dimulai sebelum layanan pemetaan telah dimulai (dan memetakan drive).


dengan pengaturan layanan pemetaan ini, saya pikir pemetaan drive yang dibuat oleh layanan pemetaan tidak akan tersedia dalam konteks layanan asli, bukan?
VoidPointer

Saya pikir itu <disclaim> harus </disclaim> - hanya ada satu lingkungan untuk setiap sesi winlogon.
Treb

Kode Anda TIDAK berfungsi dalam suatu layanan. Saya datang ke sini dengan masalah yang sama dengan OP tetapi saya adalah penulis Layanan. Jawaban Anda memecahkan masalah saya.
Joe Gayetty

5

ForcePush,

CATATAN : Drive yang dipetakan yang baru dibuat sekarang akan muncul untuk SEMUA pengguna sistem ini tetapi mereka akan melihatnya ditampilkan sebagai "Drive Jaringan Terputus (Z :)". Jangan biarkan nama itu membodohi Anda. Mungkin mengklaim terputus tetapi akan bekerja untuk semua orang. Itulah cara Anda mengetahui bahwa peretasan ini tidak didukung oleh M $ ...

Itu semua tergantung pada izin berbagi. Jika Anda memiliki Semua Orang di izin berbagi, drive ini dipetakan akan dapat diakses oleh pengguna lain. Tetapi jika Anda hanya memiliki beberapa pengguna tertentu yang kredensial yang Anda gunakan dalam skrip batch Anda dan skrip batch ini ditambahkan ke skrip Startup, hanya akun Sistem yang akan memiliki akses ke share tersebut bahkan bukan Administrator. Jadi, jika Anda menggunakan, misalnya, pekerjaan ntbackuo terjadwal, Akun sistem harus digunakan di 'Jalankan sebagai'. Jika layanan Anda 'Masuk sebagai: Akun Sistem Lokal', layanan itu akan berfungsi.

Apa yang saya lakukan , saya tidak memetakan huruf drive apa pun dalam skrip startup saya, hanya menggunakan net use \\\server\share ...dan menggunakan jalur UNC dalam pekerjaan yang dijadwalkan. Menambahkan skrip logon (atau hanya menambahkan file batch ke folder startup) dengan pemetaan untuk berbagi yang sama dengan beberapa huruf drive: net use Z: \\\...dengan kredensial yang sama. Sekarang pengguna yang login dapat melihat dan mengakses drive yang dipetakan. Ada 2 koneksi ke share yang sama. Dalam hal ini pengguna tidak melihat "Drive jaringan terputus ..." yang mengganggu. Tetapi jika Anda benar-benar membutuhkan akses ke bagan tersebut dengan huruf drive bukan hanya UNC, peta yang bagikan dengan huruf-huruf drive yang berbeda, misalnya Y untuk Sistem dan Z untuk pengguna.


4

Menemukan cara untuk memberikan akses Layanan Windows ke Drive Jaringan.

Ambil Windows Server 2012 dengan NFS Disk misalnya:

Langkah 1: Tulis File Batch ke Mount.

Tulis file batch, mis: 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

Langkah 2: Pasang Disk sebagai AUTHORITY / SYSTEM NT.

Buka "Penjadwal Tugas", buat tugas baru:

  1. Jalankan sebagai "SYSTEM", di "System Startup".
  2. Buat tindakan: Jalankan "C: \ mount_nfs.bat".

Setelah dua langkah sederhana ini, Layanan Windows ActiveMQ saya berjalan di bawah hak istimewa "Sistem Lokal", berkinerja sempurna tanpa login.


3

Alasan mengapa Anda dapat mengakses drive ketika Anda biasanya menjalankan executable dari command prompt adalah bahwa ketika Anda mengeksekusi sebagai exe normal Anda menjalankan aplikasi itu di akun Pengguna dari mana Anda telah logon. Dan pengguna itu memiliki hak istimewa untuk mengakses jaringan. Tetapi, ketika Anda menginstal executable sebagai layanan, secara default jika Anda melihat dalam tugas mengelola dijalankan di akun 'SYSTEM'. Dan Anda mungkin tahu bahwa 'SISTEM' tidak memiliki hak untuk mengakses sumber daya jaringan.

Mungkin ada dua solusi untuk masalah ini.

  1. Untuk memetakan drive sekeras yang sudah ditunjukkan di atas.

  2. Ada satu lagi pendekatan yang bisa diikuti. Jika Anda membuka manajer layanan dengan mengetikkan 'services.msc'you dapat pergi ke layanan Anda dan di properti layanan Anda ada tab logOn di mana Anda dapat menentukan akun sebagai akun lain selain' Sistem 'Anda dapat mulai layanan dari akun pengguna Anda sendiri yang masuk atau melalui 'Layanan Jaringan'. Ketika Anda melakukan ini .. layanan ini dapat mengakses komponen jaringan dan drive apa pun meskipun mereka tidak persisten juga. Untuk mencapai ini secara pemrograman Anda dapat melihat fungsi 'CreateService' di http://msdn.microsoft.com/en-us/library/ms682450(v=vs.85).aspx dan dapat mengatur parameter 'lpServiceStartName' ke 'NT AUTHORITY \ NetworkService '. Ini akan memulai layanan Anda di bawah 'Layanan Jaringan'

  3. Anda juga dapat mencoba dengan menjadikan layanan ini interaktif dengan menentukan SERVICE_INTERACTIVE_PROCESS dalam flag parameter tipe layanan dari fungsi CreateService () Anda, tetapi ini akan dibatasi hanya sampai XP karena Vista dan 7 tidak mendukung fitur ini.

Semoga solusinya membantu Anda .. Beritahu saya jika ini berhasil untuk Anda.


1

Anda tidak dapat mengubah pengguna yang berjalan di bawah Layanan dari "Sistem" atau menemukan cara licik untuk menjalankan pemetaan Anda sebagai Sistem.

Yang lucu adalah bahwa ini dimungkinkan dengan menggunakan perintah "at" , cukup jadwalkan pemetaan drive Anda satu menit ke masa depan dan itu akan dijalankan di bawah akun Sistem yang membuat drive dapat dilihat oleh layanan Anda.


layanan tidak berjalan sebagai "Sistem". Sudah diatur untuk berjalan di bawah akun lokal tertentu. Bahkan saya masuk dengan akun itu, membuat pemetaan jaringan yang persisten, keluar dan memulai kembali layanan, pemetaan tidak akan tersedia untuk layanan.
VoidPointer

1

Alih-alih mengandalkan drive persisten, Anda dapat mengatur skrip untuk memetakan / membatalkan pemetaan drive setiap kali Anda menggunakannya:

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

Ini bekerja untuk saya.


0

Saya belum dapat berkomentar (mengerjakan reputasi) tetapi membuat akun hanya untuk menjawab @Tek Jerk @ spankmaster79 (nama bagus lol) dan masalah @NMC yang mereka laporkan sebagai balasan untuk "Saya menemukan solusi yang mirip dengan yang ada di psexec tetapi bekerja tanpa alat tambahan dan selamat dari reboot. " posting @Larry telah dibuat.

Solusi untuk ini adalah dengan hanya menjelajah ke folder itu dari dalam akun login, yaitu:

    \\servername\share  

dan biarkan ia meminta untuk masuk, dan masukkan kredensial yang sama yang Anda gunakan untuk UNC di psexec. Setelah itu mulai bekerja. Dalam kasus saya, saya pikir ini karena server dengan layanan ini bukan anggota dari domain yang sama dengan server yang saya pemetaan. Saya berpikir jika UNC dan tugas yang dijadwalkan keduanya merujuk ke IP bukan nama host

    \\123.456.789.012\share 

itu bisa menghindari masalah sama sekali.

Jika saya pernah mendapatkan poin rep yang cukup di sini saya akan menambahkan ini sebagai balasan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.