2016-07-24 4 views
-1

私はWindowsサービスを作成しました。これはシステムレベルで実行されています。ログインしたユーザーのユーザー名を取得するために、次のコードを使用しました。しかし、私は、そのユーザーセッションの環境変数を取得したい。どうやってやるの?Windowsサービスから指定されたユーザーの環境変数を取得する方法は?

DWORD sessionId = WTSGetActiveConsoleSessionId(); 
qInfo() << "session id = " << sessionId; 

wchar_t* ppBuffer[100]; 
DWORD bufferSize; 
WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, sessionId, WTSUserName, ppBuffer, &bufferSize); 
qInfo() << "Windows User Name = " << QString::fromWCharArray(*ppBuffer); 
+1

ログインユーザーの良い点は、ユーザープロファイルが読み込まれていることです。これは、あなたがHKEY_USERSの下でそれらを見つけることができることを意味します(あなたのサービスはおそらくそのユーザー名で実行されないため、明らかにHKEY_CURRENT_USERではありません)。それ以外は、http://stackoverflow.com/questions/573817/where-are-environment-variables-stored-in-registryを参照してください。 – MSalters

+0

HKEY_USERSの下位のサブアイテムが指定されたユーザーを表しているかどうか判断できません。また、一部の環境変数には "%USERPROFILE%"が含まれていますが、HKEY_USERSの1つのサブ項目の%USERPROFILE%の値を把握するのは容易ではないようです。 – Finix

+0

これはロードされていないため、実行するように設定されたアカウントでサービスが実行されます。 HKEY_USERSの内部を突くことができるように、ユーザーのSIDを知る必要があります。これは、ユーザーのセッションが初期化される環境を提供するだけであり、ユーザーが適用した可能性のある環境の上書きについては何も教えてくれません。また、ログインしているユーザーや複数のユーザーがログインしている状況に対処する必要があります。サービスのユーザーセッションを扱うことは非常に悪い考えです。実行レジストリキーまたはスタートアップフォルダのショートカットを使用して開始するプレーンなプログラムを使用します。 –

答えて

1

使用WTSQueryUserToken()は、希望のセッションIDのユーザートークンログインを取得し、そのユーザーの環境変数を取得するためにCreateEnvironmentBlock()にそのトークンを渡すことができます。

これらの文字列を必要に応じて解析したり、トークンを CreateProcessAsUser()に渡して、ユーザーのセッションでユーザーとしてプログラムを起動することができます。

関連する問題