2010-01-07 41 views
7

Tôi muốn liệt kê tất cả các máy tính để bàn trong một hệ thống và nhận tên người dùng đã đăng nhập cho máy tính đó. Cho đến nay tôi có đoạn mã sau đây như là một ví dụ về việc có được xử lý HDESK và cố gắng xác định tên người dùng liên kết với nó (nếu có), nhưng cuộc gọi đến LookupAccountSid không thành công với ERROR_NONE_MAPPED ("Không có ánh xạ giữa tên tài khoản và ID bảo mật làm xong").Nhận tên người dùng Windows đã đăng nhập được kết hợp với máy tính để bàn

HDESK desk = OpenDesktop("Default", 0, FALSE, READ_CONTROL | DESKTOP_READOBJECTS); 

DWORD size = 4096; 

SID * sid = (SID *)malloc(size); 

GetUserObjectInformation(desk , UOI_USER_SID, sid, size, &size); 

char name[512], domain[512]; 
int namesz = 512, domainsz = 512; 

LookupAccountSid(NULL, sid, &name, &namesz, &domain, &domainsz, &s); 

Có thể là do tôi đang lấy SID đăng nhập thông qua GetUserObjectInformation chứ không phải SID người dùng. Nếu vậy tôi có thể chuyển đổi nó thành SID người dùng đã đăng nhập?

Có ai có thể chỉ cho tôi đúng hướng để nhận tên người dùng đã đăng nhập cho máy tính để bàn tùy ý hay không (thông qua bộ xử lý HDESK hoặc HNWD tương ứng hoặc ngay cả trạm của máy tính để bàn HWINSTA)? cảm ơn trước.

Trả lời

2

Nếu những gì bạn muốn là thông tin người dùng thì thao tác này sẽ hoạt động.

gọi WTSEnumerateSessions để lấy mảng cấu trúc WTS_SESSION_INFO. cho mỗi cấu trúc, chuyển thành viên SessionId tới WTSQuerySessionInformation với thành viên WTSInfoClass được đặt thành WTSUserName. Điều này sẽ cung cấp cho bạn tên của người dùng (nếu có) kết hợp với phiên.

Hoặc bạn có thể đặt WTSInfoClass thành WTSSessionInfo và nhận lại cấu trúc WTSINFO. Điều này chứa rất nhiều thông tin bao gồm tên người dùng và tên miền. Nhìn vào định nghĩa tập tin tiêu đề của WTSINFO mặc dù trang MSDN là sai.

Bạn phải gọi WTSEnumerateSessions hai lần, một lần để nhận được kích thước bộ đệm cần thiết và sau đó một lần để nhận thông tin của bạn.

Mối quan hệ: Một hoặc nhiều đối tượng Màn hình trong Windows Station. Một trạm Windows được kết hợp với một phiên.

+0

Cảm ơn, gợi ý tốt nhưng sau khi thử nó. trong khi tôi có thể liệt kê các phiên và tên người dùng liên quan của họ (nếu có) tên trạm của phiên là tên phiên RDP không phải là tên trạm cửa sổ (xem định nghĩa WTSWinStationName trong http://msdn.microsoft.com/en-us/library/ aa383861% 28VS.85% 29.aspx). Nếu tôi có thể liên kết một ID phiên tới một trạm cửa sổ, mặc dù kỹ thuật này sẽ là hoàn hảo, nhưng tôi không thể tìm thấy làm thế nào để làm như vậy. – QAZ

+0

@QAZ không hoạt động mỗi phiên có một cửa sổ winsta0 là trạm cửa sổ có tất cả các widnows hiển thị (cửa sổ duy nhất khác quan tâm là deaktop an toàn cho phiên đó). – Joshua

2

Vấn đề là máy tính để bàn không được liên kết với người dùng. Hãy thử sử dụng psexec để chạy Notepad trong tài khoản SYSTEM. Nó đang chạy trên trạm cửa sổ của bạn, trên màn hình của bạn. Nếu không, bạn sẽ không thể nhìn thấy nó.

Nhưng nếu bạn muốn kết hợp phiên với trạm cửa sổ, thì có thể thực hiện được. Bạn cần gọi NtQueryObject với ObjectNameInformation để lấy tên của đối tượng. Ví dụ, đây là những gì tôi nhận được: \Sessions\1\Windows\WindowStations\WinSta0. Có ID phiên của bạn.

+0

cảm ơn, điểm tốt. Tôi muốn có thể để có được người dùng đăng nhập vào máy tính để bàn nếu một trong những tồn tại vì vậy điều này có thể hữu ích trong sự kết hợp với câu trả lời của janglin. Tôi sẽ kiểm tra vào ngày mai và báo cáo lại. – QAZ

0

Đây không phải là giải pháp nhưng là mô tả tốt về trạm/máy tính để bàn. Từ http://www.microsoft.com/technet/security/bulletin/fq00-020.mspx

Trạm cửa sổ là gì? Trạm cửa sổ là một vùng chứa an toàn có chứa một clipboard, một số thông tin toàn cầu và một bộ một hoặc nhiều máy tính để bàn. Một phiên Windows 2000 sẽ có một số cửa sổ trạm, một phiên được gán cho phiên đăng nhập của người dùng tương tác và một số khác được gán cho quy trình Winlogon, quy trình bảo vệ màn hình an toàn và mọi dịch vụ chạy trong ngữ cảnh bảo mật khác với tương tác người dùng. Trạm cửa sổ tương tác được gán cho phiên đăng nhập của người dùng tương tác cũng chứa bàn phím, chuột và thiết bị hiển thị. Trạm cửa sổ tương tác hiển thị với người dùng và có thể nhận dữ liệu nhập từ người dùng. Tất cả các cửa sổ khác không tương tác, có nghĩa là chúng không thể hiển thị cho người dùng và không thể nhận được dữ liệu nhập của người dùng.

Máy tính để bàn là gì? Máy tính để bàn là đối tượng chứa an toàn được chứa trong một cửa sổ. Có thể có nhiều máy tính để bàn chứa trong một trạm cửa sổ. Máy tính để bàn có bề mặt hiển thị hợp lý và chứa cửa sổ, menu và móc. Chỉ các máy tính để bàn của trạm cửa sổ tương tác mới có thể hiển thị và nhận đầu vào của người dùng. Trên trạm cửa sổ tương tác, chỉ một máy tính để bàn tại một thời điểm được kích hoạt. Máy tính để bàn hoạt động này, còn được gọi là máy tính để bàn đầu vào, là máy tính để bàn hiện đang được người dùng nhìn thấy và nhận được dữ liệu nhập của người dùng.

+0

Có nghĩa là để giúp làm rõ những gì có chứa những gì và mối quan hệ với nhau – fupsduck

0

Bạn có thể trích xuất nó ra khỏi đầu của %USERPROFILE% biến môi trường

0

nbtstat sử dụng để có thể làm điều này từ dòng lệnh, với một trong hai tên máy hoặc địa chỉ IP. Đã lâu rồi tôi mới nhìn vào nó.

0

mã đúng mà làm việc cho tôi:

TCHAR username[UNLEN + 1]; 
DWORD size = UNLEN + 1; 
GetUserName((TCHAR*)username, &size); 

Tôi đang sử dụng Visual Studio Express 2012 trên Windows 7 x86

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