2012-02-05 37 views
12

Tôi đang cố lấy tên quy trình từ pid của nó. Người dùng đang chạy với tư cách Quản trị viên, đã bật UAC, không được nâng lên.Cách lấy tên tệp quy trình từ pid, nếu OpenProcess() không thành công với ACCESS_DENIED?

Một số quy trình hệ thống, như services.exe, thiết lập bảo mật theo cách như vậy mà OpenProcess(PROCESS_QUERY_INFORMATION ... không thành công với ERROR_ACCESS_DENIED. Cùng một kết quả với quyền truy cập PROCESS_QUERY_LIMITED_INFORMATION. Tuy nhiên, tôi có thể thấy rằng Process Explorercó thể ít nhất là liệt kê tất cả các quy trình này, cùng với tên tệp và pid của chúng (khi chạy với tư cách là Quản trị viên không nâng cao).

Câu hỏi của tôi là, làm cách nào tôi có thể làm như vậy (lấy tên tệp từ pid), vì quản trị viên không nâng cao không thể theo dõi tuyến đường OpenProcess() + GetProcessImageFileName() thông thường?

Trả lời

9

Các bạn đã thử Process32First() và Process32Next() với một tay cầm lấy bằng CreateToolhelp32Snapshot()? Nó không cung cấp cho bạn đường dẫn đầy đủ nhưng ít nhất cũng nên cho phép bạn lấy tên tệp.

+0

Cảm ơn Jim - đó là gợi ý tuyệt vời. Nếu bất kỳ ai cần ví dụ, đây là [MSDN one] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686701%28v=vs.85%29.aspx) – baderman

3

Bạn đã thử thay vào đó là PROCESS_QUERY_LIMITED_INFORMATION? Nó yêu cầu cấp truy cập thấp hơn có thể cung cấp ít nhất tên của tệp thực thi. Nó cho phép bạn gọi QueryFullProcessImageName đó cung cấp thông tin mà bạn đang tìm kiếm

+1

Xin lỗi tôi đã chỉnh sửa ngay trước khi bạn trả lời. Có, tôi đã thử điều này, và nó không giúp đỡ. Lỗi truy cập bị từ chối tương tự. – haimg

+1

Xử lý một quy trình hệ thống được mở với PROCESS_QUERY_LIMITED_INFORMATION sẽ không cho phép bạn gọi QueryFullProcessImageName. Nó không thành công với lỗi 31 "Một thiết bị gắn vào hệ thống không hoạt động." ngay cả khi chương trình của tôi chạy với quyền quản trị viên đầy đủ (không có đặc quyền SE_DEBUG). –

5

Bạn không thể mở quy trình hệ thống (chính xác hơn, các quy trình đang chạy trong tài khoản khác - trong trường hợp này là SYSTEM người dùng) mà không cần bật đặc quyền SE_DEBUG cho quy trình của bạn. Nếu bạn đang chạy với tư cách quản trị viên, bạn có thể dễ dàng đặt đặc quyền: http://support.microsoft.com/kb/131065/en-us

+1

Bài viết đó là một chút lỗi thời. Thật không may, bạn không thể nhận được SeDebugPrivilege trừ khi nâng lên (UAC). – haimg

+0

@ haimg: Tôi googled một chút nhưng không thể tìm thấy bất cứ điều gì về điều đó, bạn có bất kỳ liên kết mà nó nói rằng? – pezcode

+1

Tôi đã thử rằng trong mã của tôi ... Tuy nhiên, nhìn ở đây: http://msdn.microsoft.com/en-us/library/bb530410.aspx. Nó nói rằng SeDebugPrivilege được loại bỏ khỏi một mã thông báo bị hạn chế (đối với Quản trị viên). – haimg

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