我正在處理需要監視Windows會話更改的服務應用程序,並在特定用戶登錄時自動啓動應用程序。從會話ID獲取完整的Windows域名
下面是它是如何工作的,我有一個文件,其中包含以用戶主體名稱格式([email protected])存儲的Windows用戶名列表。我的服務將監視任何會話更改,並在用戶登錄後採取特定操作。
List<string> _UsersList;
object _sessionCheckLock = new object();
void OnCheckSession(int nSessionId, bool bIsLoggIn)
{
lock(_sessionCheckLock)
{
try
{
string sUserName = string.Empty;
string sDomain = string.Empty;
IntPtr pUserName = IntPtr.Zero;
uint nBytesReturned = 0;
if (WTSQuerySessionInformation(IntPtr.Zero, (uint)nSessionId, WTS_INFO_CLASS.WTSUserName, out pUserName, out nBytesReturned) && (pUserName != IntPtr.Zero))
{
sUserName = Marshal.PtrToStringAnsi(pUserName);
WTSFreeMemory(pUserName);
IntPtr pDomain = IntPtr.Zero;
if(WTSQuerySessionInformation(IntPtr.Zero, (uint)nSessionId, WTS_INFO_CLASS.WTSDomainName, out pDomain, out nBytesReturned) && (pDomain != IntPtr.Zero))
{
sDomain = Marshal.PtrToStringAnsi(pDomain);
WTSFreeMemory(pDomain);
}
else
{
}
if (!string.IsNullOrEmpty(sUserName))
{
if(!string.IsNullOrEmpty(sDomain)
{
sUserName += "@" + sDomain;
}
foreach(string username in _UsersList)
{
if(string.Compare(sUsername, username, true)==0)
{
//Do a couple of things
return;
}
}
}
}
else
{
return;
}
}
catch (System.Exception ex)
{
}
}
}
上面的代碼是我每次引發新登錄事件時調用的函數。 _UsersList是包含服務允許使用的所有用戶名的字符串列表。 這裏的問題是WTSQuerySessionInformation
與WTS_INFO_CLASS.WTSDomainName
一起使用時不會返回域的全名,因此比較失敗。例如,如果在用戶列表中存在名爲([email protected])的用戶名並且登錄,則查詢會話的域名,它只返回沒有.LOCAL附錄的(DOMAIN)。我需要找到一種方法來獲取完整的域名以匹配我的列表中的域名。
有人可以幫助請
謝謝,這有很大的幫助。 –