• 締切済み

VC++でのLogonUserについて教えてください。

環境 XP Pro .Net 2003 お世話になります。 普段VB.Netを利用しているのですが、 やってみたいことでのAPIの多さにVC++を勉強中です。 最終的にはにここの「Starting an Interactive Client Process in C++」 http://msdn.microsoft.com/en-us/library/aa379608(VS.85).aspx を行いたいのですが、 まず最初のLogonUserの引数hTokenの結果を見ると、VB.Netでは404という値を取得していますが、 VC++.Netではvoidという値になってしまいます。 (戻り値はどちらも成功しています) hTokenを得るにはどうすればよろしいでしょうか。 下の記述でおかしい所がありましたら、ご指摘頂けないでしょうか。 よろしくお願いいたします。 -------------------------------------- #include "stdafx.h" #include <windows.h> #include <stdio.h> #using <mscorlib.dll> using namespace System; /*コンソールアプリ*/ int _tmain() { HANDLE hToken; LPTSTR usr = "user"; LPTSTR dmn = "NETWORK"; LPTSTR pas = "user"; if (!LogonUser( usr, dmn, pas, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken) ) {} return 0; } -------------------------------------- VB.Netで成功する記述は、 Dim hToken As IntPtr = IntPtr.Zero bReturn = LogonUser( _ usr, _ dmn, _ pas, _ 2,_ 0, _ hToken) です。

みんなの回答

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

> hTokenの値をクイックウォッチ等で見ると、{void}、型はvoid* > となっております。 型の隣に値が入っているはずなのですが。。。 >戻り値は、VB、VC++共に、どちらも成功しています。 関数が成功しているというのはif文の結果がそうという ことでよいでしょうか? 成功しているのであれば、LogonUser自体はトークンハンドルを 返しているはずです。 >GetLogonSIDという自作関数、 これは中身が不明なのでなんともいえません。 >ImpersonateLoggedOnUser、 これはLogonUserで取得した偽装トークンをそのまま 使用することができます。 >CreateProcessAsUser この関数はちょっと特殊で、 DuplicateTokenExなどで偽装トークンから プライマリトークに変換しないと関数wが失敗します。 とりあえず、現状で問題になっているのは、 どのような現象なのかもう少し具体的にならないでしょうか?

noname#76834
質問者

補足

>型の隣に値が入っているはずなのですが。。。 仰る意味が分かりません。 私の環境では 名前 | 値 | 型 hToken|{void} | void* とローカルウィンドウ、クイックウォッチ共になっているので、 そう申し上げただけです。 関数のご説明ありがとうございます。 これらは、リンク先にも説明があるので、存じているつもりです。 また、MSDNのコードを変えて使用するつもりはありません。 全てのコードを貼っていないのはこの為ですが、もしお試し頂ける場合のために、質問用としてLogonUserだけ貼っております。 >とりあえず、現状で問題になっているのは、 >どのような現象なのかもう少し具体的にならないでしょうか? 「MSDNのコードをそのまま貼り付けてデバッグ実行すると、 関数LogonUserでhTokenが{void}で返ってくる。 この値が正しいのかVBでもテストしたが、値が明らかに異なる。 設定などで治るものなのでしょうか? ご存知でしたら教えてください。」 というつもりです。 ご存知でしたら、よろしくお願いいたします。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

>まず最初のLogonUserの引数hTokenの結果を見ると、 >VB.Netでは404という値を取得していますが、 >VC++.Netではvoidという値になってしまいます。 >(戻り値はどちらも成功しています) すみません、日本語がよく分からないです。 VOIDというのは値ではなく型名です。 hTokenはHANDLE型なのでNULLかINVALID_HANDLEが 不正な値のはずですが、そもそも、関数の戻り値は 成功しているのですか?失敗しているのですか? >hTokenを得るにはどうすればよろしいでしょうか。 hTokekをどのように使っているかも補足できれば お願いします。

noname#76834
質問者

補足

すばやいご回答ありがとうございます。 >VOIDというのは値ではなく型名です。 >hTokenはHANDLE型なのでNULLかINVALID_HANDLEが hTokenの値をクイックウォッチ等で見ると、{void}、型はvoid* となっております。 すみませんが、それ以上の事がわかりません。 調査のヒントやご指示をいただけたら幸いです。 >不正な値のはずですが、そもそも、関数の戻り値は >成功しているのですか?失敗しているのですか? 戻り値は、VB、VC++共に、どちらも成功しています。 >hTokekをどのように使っているかも補足できれば >お願いします。 リンク先のコードを見ると、 GetLogonSIDという自作関数、 ImpersonateLoggedOnUser、 CreateProcessAsUser で使われております。 全体的には偽装を行いたいです。

関連するQ&A