1

昇格しているかどうかに関係なく、ステーションにログインしたユーザーのTokenStatisticsクラスを使用してGetTokenInformationによって返されるAuthenticationIDを取得する必要があります。

Lemmeはあなたにもう少し情報を与えます。私がすることを仮定します:

var Result = GetTokenInformation(WindowsIdentity.GetCurrent().Token, TOKEN_INFORMATION_CLASS.TokenStatistics, TokenInformation, TokenInfLength, out TokenInfLength);

これにより、TokenInformation構造からAuthenticationIDを問題なく取得できるようになります。結果のauthenticationIDが「00000000-00001234」であるとしましょう

ここで、Visual Studioを右クリックして[管理者として実行]をクリックし、コードをもう一度起動すると、結果は「00000000-00001289」などの別の結果になります。しかし、私は「00000000-00001234」が必要です

現在のプロセスが昇格されているかどうかに関係なく、「00000000-00001234」を取得するにはどうすればよいですか?

GetTokenInformationに与える適切なトークンを見つけるだけの問題だと思いますが、私はここで輪になって走っています...

注:コードは、C#でログオンSIDを取得してGetTokenInformationを実装する方法に基づいており、TokenStatisticsを取得できるように調整しました。

4

1 に答える 1

3

OK、ようやく動作するようになりました。これらはステップです(完全なコードを投稿するのではなく、かなり長いです):

  1. win32_processクラス+マネージドProcessクラスでWMI(ManagementObject)を再帰的に使用して、現在のプロセスの祖先を作成します
  2. 私の特定のケースでは、「エクスプローラー」プロセスを見つけたとき、または例外が発生したときにアルゴリズムを停止します。これは、エクスプローラーが昇格されていない可能性が非常に高いためです。
  3. P /ステップ2で返されたProcessIdのadvapi32.dllからOpenProcessToken関数を呼び出します。これにより、ステップ4で使用できる新しいWindowsIdentityを構築するために使用できるuserTokenが取得されます。
  4. 次に、そのWindowsIdentity TokenプロパティをGetTokenInformationにフィードして、AuthenticationIDを取得できます。

これはテストされ、機能しています。

参照 :

この手順で問題が発生した場合は、遠慮なくコメントするか、独自の回答を投稿してください。


注:親プロセスの1つが強制終了された場合、問題が発生します:WMIは、もう存在しないプロセスのIDを提供します。私が作業している製品の性質上、エクスプローラーを時々再起動します(開発中のみ)。これが問題の発生方法です。それは私にとって実際には問題ではありませんが、知っておくとよいでしょう。

ありがとう

于 2012-04-02T09:05:07.967 に答える