Nhận tên máy tính từ người dùng đã đăng nhập từ xa.

lập trình

[ad_1]

Xin chào, tôi đang làm việc trong một công ty có rất nhiều người kết nối từ xa cùng một máy tính với cùng một người dùng.

Tôi muốn lấy tên của máy tính mà người dùng đã thực hiện điều khiển từ xa.

Tôi muốn tạo một chương trình nhỏ để kiểm tra máy tính mà người dùng đã đăng nhập được điều khiển từ xa với máy tính đó và việc c# hay java script hay vbscript đều không thành vấn đề.

Ngoài ra, nếu có thể, hãy kiểm tra tên máy tính của người dùng đã đăng nhập và cài đặt một số chương trình.
Ý tôi là nếu tôi kiểm tra chương trình B đã cài đặt, tôi sẽ nhận được tên máy tính của người dùng đã đăng nhập và cài đặt nó.

Cảm ơn, Imbaro.

Giải pháp 1

Không có bất kỳ thông tin nào về ứng dụng của bạn, tôi chỉ có thể giả định rằng bạn muốn chạy một chương trình bên ngoài và tìm tên DNS của bất kỳ máy tính nào được kết nối. Tôi sẽ thực hiện các bước tôi sẽ thực hiện:

Đầu tiên, tôi bắt đầu quá trình “netstat” với các đối số dòng lệnh “-a”. Chuyển hướng đầu ra để bạn có thể đọc nó:

C#
Process netStat = new Process();
netStat.StartInfo.UseShellExecute = true;
netStat.StartInfo.CreateNoWindow = true;
netStat.StartInfo.FileName = "netstat";
netStat.StartInfo.Arguments ="-a";
netStat.StartInfo.RedirectStandardOutput = true;

netStat.Start();   //Can take several seconds to execute, good use for BackgroundWorker

string output = netStat.StandardOutput.ReadToEnd();

Bây giờ bạn có dữ liệu cho mọi thứ được kết nối với máy tính (vào và ra). Bạn có thể chạy lệnh netstat trong cửa sổ bảng điều khiển để xem kết quả. Sau đó, bạn sẽ chia phần này theo dòng để lấy từng mục, sau đó chia lại theo tab để lấy từng cột. Bạn quan tâm đến cột thứ ba, có tên máy tính:port hoặc ipaddress:port nếu không thể xác định được tên.

Giải pháp 3

CHÀO 🙂

Không phải mã của tôi, chỉ được điều chỉnh cho các phiên bản x64 (có thể giúp ích cho ai đó rất nhiều năm sau). Chỉ để lấy tên máy chủ máy khách RDP (Remote Desktop) hiện tại.

Private Declare PtrSafe Sub WTSFreeMemory Lib "wtsapi32.dll" (ByVal pMemory As Any)
Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongLong)
Private Declare PtrSafe Function WTSQuerySessionInformationA Lib "wtsapi32.dll" (ByVal hServer As LongLong, ByVal sessionId As LongLong, ByVal wtsInfoClass As LongLong, ByRef pBuffer As LongLong, ByRef dwSize As LongLong) As LongLong

 Public Function GetMachinenameofCurrentSession() As String
        Dim RetVal As LongLong      'Return Value of API Call
        Dim lpBuffer As LongLong    'Buffer to Hold Info Returned
        Dim Count As LongLong       'Length of Buffer info
        Dim MachineName As String
        'If the function succeeds, the return value is a nonzero value.
        'If the function fails, the return value is zero.
        'To get extended error information, call GetLastError API.
        RetVal = WTSQuerySessionInformationA(WTS_CURRENT_SERVER_HANDLE, _
        WTS_CURRENT_SESSION, _
        WTSClientName, _
        lpBuffer, _
        Count)
        
        MachineName = GetStringFromLP(lpBuffer)
        WTSFreeMemory lpBuffer 'Free the memory used by the buffer.
        GetMachinenameofCurrentSession = MachineName
End Function

Private Function GetStringFromLP(ByVal StrPtr As LongLong) As String
    
    Dim b As Byte
    Dim tempStr As String
    Dim bufferStr As String
    Dim Done As Boolean
    Done = False
    Do
        ' Get the byte/character that StrPtr is pointing to.
        CopyMemory b, ByVal StrPtr, 1
        If b = 0 Then ' If you've found a null character,
            Done = True
        Else
            tempStr = Chr$(b)
            bufferStr = bufferStr & tempStr 'Add it to the string
            StrPtr = StrPtr + 1 ' Increment the pointer to next
        End If
    Loop Until Done
    
    GetStringFromLP = bufferStr

End Function

[ad_2]

コメント

タイトルとURLをコピーしました