Windowsセッションの変更を監視し、特定のユーザーがログオンした場合にアプリケーションを自動的に起動する必要があるサービスアプリケーションに取り組んでいます。
仕組みは次のとおりです。ユーザープリンシパル名の形式(user@domain.LOCAL)で保存されたWindowsユーザー名のリストを含むファイルがあります。私のサービスはセッションの変更を監視し、それらのユーザーの1人がログオンすると特定のアクションを実行します。
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
ドメインのフルネームが返されないため、比較が失敗することです。たとえば、(username@DOMAIN.LOCAL)というユーザー名がユーザーのリストに存在し、ログオンすると、セッションのドメイン名。.LOCAL付録なしで(DOMAIN)のみを返します。リスト内のドメイン名と一致する完全なドメイン名を取得する方法を見つける必要があります。
誰か助けてもらえますか