Ánh xạ ổ đĩa mạng được sử dụng bởi một dịch vụ


213

Giả sử một số dịch vụ Windows sử dụng mã muốn các ổ đĩa mạng được ánh xạ và không có đường dẫn UNC. Làm cách nào tôi có thể làm cho ánh xạ ổ đĩa có sẵn cho phiên của dịch vụ khi dịch vụ được bắt đầu? Đăng nhập với tư cách là người sử dụng dịch vụ và tạo ánh xạ liên tục sẽ không thiết lập ánh xạ trong ngữ cảnh của dịch vụ thực tế.


6
Xem câu trả lời của ForcePush, cách giải quyết của anh ấy.
Ubikuity

Câu trả lời:


44

Bạn sẽ cần phải sửa đổi dịch vụ hoặc bọc nó trong một quy trình trợ giúp: ngoài các vấn đề truy cập phiên / ổ đĩa, ánh xạ ổ đĩa liên tục chỉ được khôi phục trên một đăng nhập tương tác, mà các dịch vụ thường không thực hiện.

Cách tiếp cận quá trình trợ giúp có thể khá đơn giản: chỉ cần tạo một dịch vụ mới ánh xạ ổ đĩa và bắt đầu dịch vụ 'thực'. Những điều duy nhất không hoàn toàn tầm thường về điều này là:

  • Dịch vụ trợ giúp sẽ cần chuyển tất cả các lệnh SCM thích hợp (bắt đầu / dừng, v.v.) cho dịch vụ thực. Nếu dịch vụ thực sự chấp nhận các lệnh SCM tùy chỉnh, hãy nhớ chuyển cả các lệnh trên (tôi không mong đợi một dịch vụ xem xét các đường dẫn UNC kỳ lạ để sử dụng các lệnh như vậy, mặc dù ...)

  • Mọi thứ có thể nhận được một chút thông tin khó khăn. Nếu dịch vụ thực chạy dưới tài khoản người dùng thông thường, bạn cũng có thể chạy dịch vụ trợ giúp trong tài khoản đó và tất cả sẽ ổn miễn là tài khoản có quyền truy cập vào chia sẻ mạng phù hợp. Nếu dịch vụ thực sự sẽ chỉ hoạt động khi chạy dưới dạng LOCALSYSTEM hoặc somesuch, mọi thứ sẽ trở nên thú vị hơn, vì nó sẽ không thể 'nhìn thấy' ổ đĩa mạng, hoặc yêu cầu một số thông tin xác thực để làm cho mọi thứ hoạt động.


2
Rất nhiều thông tin ... Tôi có đúng không khi cho rằng các kịch bản đăng nhập cũng chỉ được chạy cho các phiên đăng nhập tương tác chứ không phải cho các phiên dịch vụ?
VoidPulum

220

Sử dụng điều này có nguy cơ của riêng bạn. (Tôi đã thử nghiệm nó trên XP và Server 2008 x64 R2)

Đối với bản hack này, bạn sẽ cần SysiternalsSuite của Mark Russinovich :

Bước một: Mở dấu nhắc cmd.exe nâng cao (Chạy với tư cách quản trị viên)

Bước hai: Nâng cao một lần nữa để root bằng PSExec.exe: Điều hướng đến thư mục chứa SysiternalsSuite và thực hiện lệnh sau psexec -i -s cmd.exe mà bạn đang ở trong dấu nhắc nt authority\systemvà bạn có thể chứng minh điều này bằng cách nhập whoami. Điều -inày là cần thiết bởi vì ánh xạ ổ đĩa cần phải tương tác với người dùng

Bước ba: Tạo ổ đĩa được ánh xạ liên tục làm tài khoản HỆ THỐNG bằng lệnh sau net use z: \\servername\sharedfolder /persistent:yes

Nó là dễ dàng!

CẢNH BÁO : Bạn chỉ có thể xóa ánh xạ này giống như cách bạn đã tạo, từ tài khoản HỆ THỐNG. Nếu bạn cần loại bỏ nó, hãy làm theo các bước 1 và 2 nhưng thay đổi lệnh ở bước 3 thành net use z: /delete.

LƯU Ý : Ổ đĩa được ánh xạ mới tạo sẽ xuất hiện cho TẤT CẢ người dùng hệ thống này nhưng họ sẽ thấy nó được hiển thị là "Ổ đĩa mạng bị ngắt kết nối (Z :)". Đừng để cái tên lừa bạn. Nó có thể tuyên bố bị ngắt kết nối nhưng nó sẽ hoạt động cho tất cả mọi người. Đó là cách bạn có thể nói rằng bản hack này không được M $ hỗ trợ.


3
Tôi đã cố gắng sử dụng giải pháp này và gặp phải vấn đề này: ổ đĩa được ánh xạ xuất hiện dưới dạng ngắt kết nối với người dùng (ngay cả quản trị viên). Bất kỳ đề xuất?
Constantin Baciu

7
Sau khi khởi động lại, ổ đĩa được ánh xạ không còn nữa. Bất kỳ ý tưởng nào? Bản đồ vẫn tồn tại, nhưng trạng thái là "Không khả dụng" nên nó không hiển thị
Tommy

4
Tôi cũng thấy ánh xạ là không có sẵn sau khi khởi động lại.
Dave Patterson

33
Để làm cho nó hoạt động sau khi khởi động lại, hãy tạo một tập lệnh chỉ chứa net use z: \\servername\sharedfoldervà thiết lập nó để chạy khi khởi động máy tính, theo technet.microsoft.com/en-us/l Library / cc770556.aspx Điều này sẽ chạy như tài khoản HỆ THỐNG, vì vậy không cần psexec.
TRS-80

2
Tôi muốn thêm rằng điều quan trọng là mọi người đều sử dụng mệnh đề /USER:[remotecomp]\[remoteusername] [password](đôi khi lệnh không hoạt động chính xác khi tên người dùng từ xa không được đặt trước với tên máy tính từ xa và dấu gạch chéo ngược. Ngoài ra, nếu chia sẻ được bảo vệ bằng mật khẩu và xuất hiện cho những người khác bị ngắt kết nối lái xe, nó là KHÔNG truy cập for everyone Bất kỳ người dùng trên hệ thống đó, nơi hỆ tHỐNG gắn kết một phần phải biết mật khẩu để chia sẻ mà (thử nghiệm trên XPx64)..
Kitet

65

Tôi đã tìm thấy một giải pháp tương tự như giải pháp với psexec nhưng hoạt động mà không cần các công cụ bổ sung và sống sót khi khởi động lại .

Chỉ cần thêm một tác vụ được sắp xếp, chèn "hệ thống" vào trường "chạy dưới dạng" và trỏ tác vụ vào một tệp bó bằng lệnh đơn giản

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

Sau đó chọn "chạy khi khởi động hệ thống" (hoặc tương tự, tôi không có phiên bản tiếng Anh) và bạn đã hoàn thành.


cái gì bắt đầu trước một dịch vụ windows hoặc nhiệm vụ theo lịch trình này? dịch vụ của chúng tôi chết khi bắt đầu nếu đường dẫn không có sẵn. Chúng tôi sẽ phải xây dựng lại điều này nếu dịch vụ bắt đầu sau cùng.
Thomas

1
Tôi đã thử điều này trên 2008 R2, nó tạo ra một ổ đĩa bị ngắt kết nối và khi tôi cố gắng mở cùng một thông báo thì "z: \ không thể truy cập được. Lỗi đăng nhập: tên người dùng không xác định hoặc mật khẩu xấu." Nhưng tôi đã có thể tạo ổ đĩa được ánh xạ thành công bằng cách chạy cùng một tệp dơi. Ny hiểu biết gì?
Gopi

1
@Thomas không thành vấn đề khi bắt đầu cung cấp tác vụ đầu tiên đã được chạy ít nhất một lần vì/persistent:yes
Edd

4
Tại sao nó cần phải là một nhiệm vụ theo lịch trình? Nó là / dai dẳng: có, không đủ để giữ nó xung quanh?
Scott Stafford

2
@ScottStafford Không / kiên trì: có là không đủ trên Win7 trở lên. Ánh xạ được loại bỏ sau khi khởi động lại bất kể chuyển đổi đó.
Eternal21

44

Cách tốt hơn là sử dụng một liên kết tượng trưng bằng mklink.exe. Bạn chỉ có thể tạo một liên kết trong hệ thống tệp mà bất kỳ ứng dụng nào cũng có thể sử dụng. Xem http://en.wikipedia.org/wiki/NTFS_symbolic_link .


Vì vậy, đơn giản và hoạt động tốt. Vì nó là một phần của hệ thống tập tin, liên kết có sẵn cho tất cả các tài khoản. Chỉ cần đảm bảo rằng dịch vụ đang chạy như một tài khoản có quyền truy cập vào tài nguyên mạng (có thể không phải là trường hợp của Hệ thống, v.v.).
Jeremy Frank

1
Đây là DEFINITELY câu trả lời tốt hơn cho câu hỏi, cảm ơn bạn nhiều!
Sten Petrov

3
Thật không may nếu liên kết sym truy cập vào một chia sẻ mạng thì bạn sẽ quay lại quảng trường một
davidfrancis

23

Có một câu trả lời hay ở đây: https://superuser.com/a/651015/299678

Tức là bạn có thể sử dụng một liên kết tượng trưng, ​​ví dụ

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

1
Điều gì sẽ xảy ra nếu bạn nhận được sau khi thử tạo một thư mục từ trong dịch vụ một lỗi cấp phép?
tyoc213

Bạn nên đưa dòng ngoại tuyến này vào phòng trò chuyện và sau đó cung cấp chi tiết về thông báo lỗi. Bạn có thể cần phải chạy các lệnh với quyền cao.
philu

@ tyoc213 Bạn đã có câu trả lời chưa?
Lsakurifaisu

9

Bạn có thể cho chúng tôi lệnh 'sử dụng mạng':

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

Nếu điều đó không hoạt động trong một dịch vụ, hãy thử Winapi và PInvoke WNetAddConnection2

Chỉnh sửa: Rõ ràng là tôi đã hiểu nhầm bạn - bạn không thể thay đổi mã nguồn của dịch vụ, phải không? Trong trường hợp đó, tôi sẽ làm theo đề xuất của mdb , nhưng với một chút thay đổi: Tạo dịch vụ của riêng bạn (hãy gọi nó là dịch vụ ánh xạ) ánh xạ ổ đĩa và thêm dịch vụ ánh xạ này vào các phụ thuộc cho dịch vụ đầu tiên (hoạt động thực tế). Bằng cách đó, dịch vụ làm việc sẽ không bắt đầu trước khi dịch vụ lập bản đồ bắt đầu (và ánh xạ ổ đĩa).


với thiết lập dịch vụ ánh xạ này, tôi nghĩ rằng ánh xạ ổ đĩa được thiết lập bởi dịch vụ ánh xạ sẽ không khả dụng trong ngữ cảnh của dịch vụ ban đầu, phải không?
VoidPulum

Tôi nghĩ rằng <từ chối> nên </ từ chối> - chỉ có một môi trường cho mỗi phiên winlogon.
Treb

Mã của bạn làm việc trong một dịch vụ. Tôi đến đây với cùng một vấn đề với OP nhưng tôi là tác giả của Dịch vụ. Câu trả lời của bạn đã giải quyết vấn đề của tôi.
Joe Gayetty

5

Lực đẩy,

LƯU Ý : Ổ đĩa được ánh xạ mới tạo sẽ xuất hiện cho TẤT CẢ người dùng hệ thống này nhưng họ sẽ thấy nó được hiển thị là "Ổ đĩa mạng bị ngắt kết nối (Z :)". Đừng để cái tên lừa bạn. Nó có thể tuyên bố bị ngắt kết nối nhưng nó sẽ hoạt động cho tất cả mọi người. Đó là cách bạn có thể nói rằng vụ hack này không được hỗ trợ bởi M $ ...

Tất cả phụ thuộc vào quyền chia sẻ. Nếu bạn có Mọi người trong quyền chia sẻ, người dùng khác có thể truy cập ổ đĩa được ánh xạ này. Nhưng nếu bạn chỉ có một số người dùng cụ thể có thông tin đăng nhập mà bạn đã sử dụng trong tập lệnh bó của mình và tập lệnh bó này đã được thêm vào tập lệnh Khởi động, chỉ có tài khoản Hệ thống mới có quyền truy cập vào chia sẻ đó, thậm chí không phải Quản trị viên. Vì vậy, nếu bạn sử dụng, ví dụ: công việc ntbackuo được lên lịch, tài khoản hệ thống phải được sử dụng trong 'Chạy dưới dạng'. Nếu dịch vụ của bạn 'Đăng nhập với tư cách: Tài khoản hệ thống cục bộ' thì nó sẽ hoạt động.

Những gì tôi đã làm , tôi đã không ánh xạ bất kỳ ký tự ổ đĩa nào trong tập lệnh khởi động của mình, chỉ sử dụng net use \\\server\share ...và sử dụng đường dẫn UNC trong các công việc được lên lịch của tôi. Đã thêm một tập lệnh đăng nhập (hoặc chỉ thêm một tệp bó vào thư mục khởi động) với ánh xạ tới cùng một chia sẻ với một số ký tự ổ đĩa: net use Z: \\\...với cùng thông tin đăng nhập. Bây giờ người dùng đã đăng nhập có thể xem và truy cập vào ổ đĩa được ánh xạ đó. Có 2 kết nối để chia sẻ cùng. Trong trường hợp này, người dùng không thấy "Ổ đĩa mạng bị ngắt kết nối ..." gây phiền nhiễu. Nhưng nếu bạn thực sự cần quyền truy cập vào chia sẻ đó bằng ký tự ổ đĩa chứ không chỉ UNC, hãy ánh xạ chia sẻ với các ký tự ổ đĩa khác nhau, ví dụ: Y cho System và Z cho người dùng.


4

Tìm thấy một cách để cấp quyền truy cập Windows Service cho Network Drive.

Lấy Windows Server 2012 với NFS Disk chẳng hạn:

Bước 1: Viết một tệp Batch lên Mount.

Viết một tệp bó, ví dụ: 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

Bước 2: Gắn đĩa dưới dạng NT AUTHORITY / HỆ THỐNG.

Mở "Trình lập lịch tác vụ", tạo một tác vụ mới:

  1. Chạy dưới dạng "HỆ THỐNG", tại "Khởi động hệ thống".
  2. Tạo hành động: Chạy "C: \ mount_nfs.bat".

Sau hai bước đơn giản này, Dịch vụ Windows ActiveMQ của tôi chạy dưới quyền riêng tư "Hệ thống cục bộ", hoạt động hoàn hảo mà không cần đăng nhập.


3

Lý do tại sao bạn có thể truy cập ổ đĩa khi bạn thường chạy tệp thực thi từ dấu nhắc lệnh là khi bạn đang thực thi nó như exe bình thường, bạn đang chạy ứng dụng đó trong tài khoản Người dùng mà bạn đã đăng nhập. Và người dùng đó có quyền truy cập mạng. Nhưng, khi bạn cài đặt tệp thực thi dưới dạng dịch vụ, theo mặc định nếu bạn thấy trong tác vụ quản lý, nó sẽ chạy trong tài khoản 'HỆ THỐNG'. Và bạn có thể biết rằng 'HỆ THỐNG' không có quyền truy cập tài nguyên mạng.

Có thể có hai giải pháp cho vấn đề này.

  1. Để ánh xạ ổ đĩa liên tục như đã chỉ ra ở trên.

  2. Có một cách tiếp cận khác có thể được theo sau. Nếu bạn mở trình quản lý dịch vụ bằng cách nhập vào 'services.msc'bạn có thể truy cập dịch vụ của mình và trong các thuộc tính của dịch vụ của bạn, có một tab logOn nơi bạn có thể chỉ định tài khoản là bất kỳ tài khoản nào khác ngoài' Hệ thống ', bạn có thể bắt đầu dịch vụ từ tài khoản người dùng đã đăng nhập của bạn hoặc thông qua 'Dịch vụ mạng'. Khi bạn làm điều này .. dịch vụ có thể truy cập bất kỳ thành phần mạng và ổ đĩa nào ngay cả khi chúng không liên tục. Để đạt được điều này theo chương trình, bạn có thể xem xét chức năng 'Tạo dịch vụ' tại http://msdn.microsoft.com/en-us/l Library / ms682450 (v = vs85) .aspx và có thể đặt tham số 'lpServiceStartName' thành 'NT AUTHORITY \ NetworkService '. Điều này sẽ bắt đầu dịch vụ của bạn trong 'Dịch vụ mạng'

  3. Bạn cũng có thể thử bằng cách làm cho dịch vụ trở nên tương tác bằng cách chỉ định SERVICE_INTERACTIVE_PROCESS trong cờ tham số dịch vụ của hàm CreatService () của bạn nhưng điều này sẽ chỉ bị giới hạn cho đến khi XP và 7 không hỗ trợ tính năng này.

Hy vọng các giải pháp giúp bạn .. Hãy cho tôi biết nếu điều này làm việc cho bạn.


1

Bạn sẽ không thay đổi người dùng mà Dịch vụ chạy trong "Hệ thống" hoặc tìm một cách lén lút để chạy ánh xạ của bạn dưới dạng Hệ thống.

Điều thú vị là điều này có thể thực hiện được bằng cách sử dụng lệnh "at" , chỉ cần lập lịch trình lập bản đồ ổ đĩa của bạn trong một phút trong tương lai và nó sẽ được chạy trong tài khoản Hệ thống để hiển thị ổ đĩa cho dịch vụ của bạn.


dịch vụ không chạy như "Hệ thống". Nó được thiết lập để chạy dưới một tài khoản địa phương cụ thể. Ngay cả khi tôi đăng nhập bằng tài khoản đó, tạo ánh xạ mạng liên tục, đăng xuất và khởi động lại dịch vụ, ánh xạ sẽ không khả dụng cho dịch vụ.
VoidPulum

1

Thay vì dựa vào một ổ đĩa liên tục, bạn có thể đặt tập lệnh thành ánh xạ / hủy ánh xạ ổ đĩa mỗi khi bạn sử dụng nó:

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

Điều này làm việc cho tôi.


0

Tôi chưa thể nhận xét (làm việc về danh tiếng) nhưng đã tạo một tài khoản chỉ để trả lời @Tech Jerk @ spankmaster79 (tên hay lol) và các vấn đề @NMC mà họ đã báo cáo khi trả lời "Tôi đã tìm thấy một giải pháp tương tự như với psexec nhưng hoạt động mà không cần các công cụ bổ sung và sống sót khi khởi động lại. " bài viết @Larry đã thực hiện.

Giải pháp cho vấn đề này là chỉ cần duyệt đến thư mục đó từ trong tài khoản đã đăng nhập, tức là:

    \\servername\share  

và để nó nhắc đăng nhập và nhập cùng thông tin đăng nhập bạn đã sử dụng cho UNC trong psexec. Sau đó nó bắt đầu làm việc. Trong trường hợp của tôi, tôi nghĩ điều này là do máy chủ có dịch vụ không phải là thành viên của cùng tên miền với máy chủ mà tôi đang ánh xạ tới. Tôi đang suy nghĩ nếu UNC và nhiệm vụ theo lịch trình đều đề cập đến IP thay vì tên máy chủ

    \\123.456.789.012\share 

nó có thể tránh được vấn đề hoàn toàn

Nếu tôi nhận được đủ điểm rep ở đây, tôi sẽ thêm nó dưới dạng trả lời.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.