2012-07-20 47 views
13

Tôi đang cố gắng tạo chương trình truy xuất tên người dùng hiện tại trên Windows bằng C++.Nhận tên người dùng hiện tại bằng C++ trên Windows

Tôi cố gắng này:

char *userName = getenv("LOGNAME"); 
stringstream ss; 
string userNameString; 
ss << userName; 
ss >> userNameString; 
cout << "Username: " << userNameString << endl; 

Không có gì là outputted trừ "Tên đăng nhập:".

Cách đơn giản nhất, tốt nhất để lấy tên người dùng hiện tại là gì?

+2

Bạn không nên sử dụng biến môi trường để truy xuất tên người dùng. Nó không được bảo đảm để tồn tại. Nói chung, bên ngoài một tệp BAT bạn không nên sử dụng các biến môi trường. – user7116

+0

Nếu bạn phải sử dụng biến môi trường để truy xuất tên người dùng, tên đúng là 'USERNAME' không phải là' LOGNAME'. Bạn cũng có thể muốn 'USERDOMAIN'. – Ferruccio

+1

Ngoài ra, điều này có thể giúp bạn: http://www.cplusplus.com/forum/beginner/12076/ – Chefire

Trả lời

33

Sử dụng hàm Win32API GetUserName. Ví dụ:

#include <windows.h> 
#include <Lmcons.h> 

char username[UNLEN+1]; 
DWORD username_len = UNLEN+1; 
GetUserName(username, &username_len); 
+0

+1, bạn có thể sử dụng [GetUserNameEx nếu bạn muốn kiểm soát định dạng của tên người dùng] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724268(v=vs.85).aspx) thay vì nội dung do người dùng nhập. Bạn nên sử dụng 'UNLEN + 1' từ' Lmcons.h' – user7116

+0

@sixlettervariables: cảm ơn, tôi đã chỉnh sửa. Bạn có biết cơ hội nào hay không '' bao gồm ''? – orlp

+0

Tôi đang ở trên máy Mac, nhưng nếu bộ nhớ phục vụ câu trả lời là Không. [Tiêu đề LANMAN cần được đưa vào riêng biệt, và tôi nghĩ rằng ví dụ này đồng ý] (http://msdn.microsoft.com/en-us/ thư viện/windows/desktop/ms676907% 28v = vs.85% 29.aspx). – user7116

5

Trên cửa sổ sử dụng USERNAME biến môi trường hoặc GetUserName chức năng

+3

Loại thứ hai thích hợp hơn. – chris

1

Bạn nên sử dụng biến env USERNAME.

+1

Biến% username% env không an toàn. Nếu bạn sử dụng người dùng có thể mở một dòng cmd và làm 'set username = SomeOneElse launchYourApp' và anh ấy sẽ chạy ứng dụng của bạn một cách hiệu quả như SomeOneElse. Đây có thể là lỗ hổng bảo mật. – CodeKid

5

Corrected mã 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), có thể nó hoạt động theo cách tương tự với Dev-Cpp

2

Nó hoạt động:

#include <iostream> 
using namespace std; 

#include <windows.h> 
#include <Lmcons.h> 

int main() 
{ 
TCHAR name [ UNLEN + 1 ]; 
DWORD size = UNLEN + 1; 

if (GetUserName((TCHAR*)name, &size)) 
wcout << L"Hello, " << name << L"!\n"; 
else 
cout << "Hello, unnamed person!\n"; 
} 
Các vấn đề liên quan