2011-10-06 50 views
5

Tôi có một số vấn đề bằng văn bản cho một ổ đĩa mạng được ánh xạ (P :) trong Windows 7 từ chương trình Delphi của tôi. Khi tôi thử, ví dụ: ForceDirectories('P:\test\folder'), tôi gặp lỗi (không tìm thấy đường dẫn).Tại sao chương trình của tôi không nhận ra đường dẫn UNC được ánh xạ?

Tôi đã thử nhập đường dẫn UNC vào mã (ForceDirectories('\\computername\share\test\folder')) và hoạt động. Tuy nhiên, ExpandUNCFileName('P:\') dường như không hoạt động; nó trả về 'P: \'. Trên Windows XP, ExpandUNCFileName('P:\') trả về đường dẫn UNC.

Làm cách nào để có được đường dẫn UNC trong Delphi trên Windows 7 hoặc viết thư cho ổ đĩa mạng được ánh xạ?

Khi điều tra thêm, dường như tôi thiếu một số loại khởi tạo trong Windows. Tôi có một ứng dụng khác (app2) sử dụng một TcxShellComboBox (một thành phần DevExpress). Sau khi đã điều hướng đến P: trong combobox đó, trong app2, các cuộc gọi đến ExpandUNCFileName hoạt động chính xác trong ứng dụng đầu tiên. Tương tự với FileExists trên các tệp trong P :, trả về False trước khi điều hướng đến P: trong app2, trả về true sau và cho đến khi máy tính khởi động lại.

+0

Đây có phải là cơ hội dịch vụ không? Hành vi bạn mô tả không liên quan gì đến Delphi và xảy ra vì ánh xạ ổ đĩa không được thiết lập cho quá trình. –

+0

Xác minh rằng bạn có ký tự ổ đĩa được ánh xạ tới phần chia sẻ.Tôi đã có thể tái tạo vấn đề của bạn chỉ khi ký tự ổ đĩa không được ánh xạ (Delphi 7, 2007 XE). – crefird

+0

Đây không phải là dịch vụ, đó là ứng dụng Biểu mẫu VCL. – MGH

Trả lời

10

Theo Microsoft KB Article, nếu Điều khiển tài khoản người dùng được bật và nếu bạn ánh xạ ổ đĩa mạng từ Windows Explorer (không nâng cao) thì chương trình nâng cao sẽ không có quyền truy cập vào ổ đĩa đó. Trích dẫn:

Nếu người dùng đăng nhập vào Windows Vista hoặc Windows 7 và nếu điều khiển tài khoản người dùng được bật, chương trình sử dụng mã thông báo truy cập được lọc của người dùng và chương trình sử dụng mã thông báo truy cập quản trị viên đầy đủ của người dùng có thể chạy cùng một lúc. Vì LSA đã tạo các mã thông báo truy cập trong hai phiên đăng nhập riêng biệt, các mã thông báo truy cập chứa các ID đăng nhập riêng biệt.

Khi chia sẻ mạng được ánh xạ, chúng được liên kết với phiên đăng nhập hiện tại cho mã thông báo truy cập quy trình hiện tại. Điều này có nghĩa rằng, nếu người dùng sử dụng dấu nhắc lệnh (Cmd.exe) cùng với mã thông báo truy cập được lọc để ánh xạ một mạng chia sẻ, thì chia sẻ mạng không được ánh xạ cho các quy trình chạy với mã thông báo truy cập quản trị viên đầy đủ.

Vì bạn đã đề cập trong nhận xét rằng bạn chạy Delphi "Là quản trị viên" (cao), đây là vấn đề của bạn.

Giải pháp:

  1. Đừng chạy Delphi nâng lên nếu bạn không cần. Nếu bạn cần nâng cao phần mềm của mình, hãy tách nó thành hai phần (cao và không nâng lên) và truy cập ổ đĩa mạng được ánh xạ từ phần đầu tiên. Sau đó truy cập vào phần khác bằng cách sử dụng đối tượng COM được nâng cao hoặc đơn giản bằng cách thực thi một tệp thực thi riêng biệt.

  2. xạ một ổ đĩa mạng từ một dấu nhắc mạng cao, vì vậy các ổ đĩa mạng được ánh xạ sẽ có sẵn cho người dùng cao:

    a. Mở dấu kiểm nhắc lệnh nâng cao (chạy "cmd.exe" làm Quản trị viên)

    b. Loại net use p: \\computername\share\test\folder

+2

nếu bạn chọn giải pháp thứ hai, bạn sẽ cần ánh xạ nó lần thứ hai từ người dùng thông thường của bạn (không có độ cao) nếu bạn thường cần nó ... – Whiler

Các vấn đề liên quan