2015-01-22 19 views
5

Ví dụ: Tôi đã đăng nhập với tư cách người dùng TestUser. Từ người dùng này, tôi sẽ chạy một dòng lệnh với tư cách quản trị viên có tên AdminUser.Nhận người dùng hiện đang đăng nhập trên Windows

Có thể từ dòng lệnh này để xác định tên của người kiểm tra hiện đang đăng nhập không?

Tôi đã có tác vụ được lên lịch luôn chạy dưới dạng AdminUser, nhưng trong tác vụ (tệp hàng loạt), tôi cần phải đặt tên cho người dùng hiện đã đăng nhập.

Bất kỳ ý tưởng nào?

+0

Bạn có thể làm rõ ý nghĩa của "người dùng hiện đã đăng nhập" không? Bạn có hạn chế điều này với giao diện điều khiển không? Các kết nối Remote Desktop có được tính không? Nếu đây là một hệ điều hành máy chủ, làm thế nào bạn sẽ chọn giữa RDP cilents? – mojo

+0

không chắc chắn, bởi vì không thể thử tại thời điểm này, nhưng 'tasklist/v | find" explorer.exe "' giúp đỡ? – Stephan

+1

Có thể trùng lặp * [Làm thế nào để bạn tìm thấy người dùng hiện tại trong môi trường Windows?] (Http://stackoverflow.com/questions/1607271/how-do-you-find-the-current-user-in-a- windows-environment) *. –

Trả lời

5

Theo tôi biết điều này là không thực sự có thể. Tùy thuộc vào bao nhiêu bạn biết về môi trường của người sử dụng, sau đây có thể là một cách giải quyết tuy nhiên:

Lệnh

qwinsta 

sẽ cung cấp cho bạn một danh sách các phiên cho máy tính. Trong các phiên này, một trong số đó sẽ là phiên hoạt động, vì vậy nếu chương trình này được sử dụng trong một phiên tương tác, điều này về cơ bản sẽ chứa "người dùng đã đăng nhập" như bạn đã mô tả (nó phức tạp hơn nhiều, có thể có nhiều người dùng đăng nhập nhưng chỉ có một người có thể hoạt động và tôi chỉ hy vọng bạn biết đủ về kịch bản sử dụng của chương trình của bạn để sử dụng điều đó). Bạn có thể phân tích đầu ra và làm việc với tên người dùng đó.

Tất nhiên đây là một hack bẩn và nó giả định rằng trong thời gian chạy của nhiệm vụ của bạn không có cơ hội mà người dùng thay đổi. Ngoài ra, mặc dù tôi đã chọn qwinsta.exe vì nó là một cách tiếp cận rất cơ bản mà không cần các cuộc gọi API hoặc một cái gì đó tôi vẫn không chắc chắn nếu CMD có khả năng phân tích đủ để có được những thông tin cần thiết cho bạn.

+0

Cảm ơn. Giải pháp này thường sẽ hoạt động. Nhưng trong trường hợp không. tôi sẽ nói cho bạn tại sao. Về cơ bản tôi cần phải chạy tập tin thực thi chỉ trên quản trị đăng xuất. Vì vậy, nhiệm vụ của tôi được kích hoạt trên sự kiện bảo mật 4647 (sự kiện đăng xuất). Vì vậy, tôi kiểm tra đề xuất của bạn và không có phiên hoạt động nào khác. Tôi đã cố gắng để thực hiện điều này thông qua chính sách nhóm đăng nhập tắt kịch bản thông qua đăng ký, nhưng nó là rất không ổn định và không làm việc cho tôi. – dEVIANT

+1

Vì vậy, bạn không cần người dùng đang hoạt động, nhưng người dùng đang hoạt động cuối cùng? Trong trường hợp đó tôi sẽ đề xuất một cách giải quyết khác. Nếu bạn có thể đảm bảo không có phiên từ xa, bạn có thể thử khóa HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ Authentication \ LogonUI \ LastLoggedOnUser đây là cơ bản các cửa sổ chính sử dụng để hiển thị cho bạn người dùng cuối cùng trên màn hình đăng nhập. Các phiên từ xa không được lưu ở đó ... Nếu bạn có chúng tôi sẽ nói viết chương trình ghi đè khóa reg hoặc tệp với userinfo trên mỗi lần đăng nhập và truy vấn thông tin của riêng bạn sau – Syberdoor

+0

Tuyệt vời! Điều này hoạt động rất tốt! – dEVIANT

4

%username% biến chứa .. tốt, tên người dùng.

echo/%username%

EDIT

Như bạn nói, bởi vì bạn đang ở trong một nhiệm vụ theo lịch trình, bạn có thể lấy tên người dùng từ Windows Registry

@echo off 
for /f "tokens=3" %%a in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SessionData\1 /v LoggedOnUserName') do (
set "user=%%a") 
set "user=%user:.\=%" 
echo/%user% 

Bây giờ %user% biến chứa các đăng nhập tên người dùng.

+1

Có, nhưng điều này sẽ trả về AdminUser, vì anh ta là người thực hiện các tác vụ theo lịch trình. Ngay cả khi trong cửa sổ bạn đăng nhập như TestUser.Tôi thử điều này, cũng có lệnh whoami :) – dEVIANT

+0

Lỗi của tôi, hãy kiểm tra câu trả lời sửa! – Rafael

+1

Điều này sẽ không hoạt động nếu có người dùng có phiên bị ngắt kết nối. Tuy nhiên, nếu không chắc chắn có thể loại trừ kịch bản đó thì nó ít điên rồ hơn ý tưởng của tôi. – Syberdoor

0

Đây là một cách nhanh chóng để thực hiện điều này bằng cách sử dụng tập tin thực thi sẽ là lệnh này:.

for /F "tokens=1,2" %%i in ('qwinsta /server:%COMPUTERNAME% ^| findstr "console"') do set tempVar=%%j 

echo %tempVar% sẽ hiển thị bất cứ điều gì người dùng đang thực sự đăng nhập Không phải là người dùng đưa ra các tập tin thực thi.

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