我正在开发需要监视 Windows 会话更改并在特定用户登录时自动启动应用程序的服务应用程序。
这是它的工作原理,我有一个文件,其中包含以用户主体名称格式 (user@domain.LOCAL) 存储的 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
使用 with 时WTS_INFO_CLASS.WTSDomainName
不会返回域的全名,因此比较失败。例如,如果用户列表中存在名为 (username@DOMAIN.LOCAL) 的用户名并登录,则在查询会话的域名,它只返回 (DOMAIN) 而没有 .LOCAL 附录。我需要找到一种方法来获取完整的域名以匹配我列表中的域名。
有人可以帮忙吗