質問: api logonuser() について お世話になります。 logonuser()というapi使いたいんです。でもこのapiを使おうとすると、「error:0x522 クライアントは要求された特権を保有していません。」というエラーが発生してしまいます。 この原因は下記のwebページにも書いてありますが、 http://www.microsoft.com/japan/developer/library/jpsecupf/_win32_logonuser.htm 「logonuser 関数を呼び出すプロセスは、se_tcb_name 特権を備えていなければなりません。ただし、この特権を有効にしておく必要はありません。logonuser 関数は、必要に応じてこの特権を有効にします。呼び出し側のプロセスがこの特権を備えていない場合、logonuser 関数は失敗し、getlasterror 関数は error_privilege_not_held を返します。」ということらしいです。 しかし、プロセスに特権を持たせるというのがわからないんです。 具体的に何をどうすれば良いのでしょう。 これ一つで、丸二日間頭を抱えています。 誰かおわかりになりませんでしょうか・・・
回答: win nt/2000を使っている物としてお話しします。 そもそも、nt/2000は「セキュリティ」という概念が存在します。 つまり、nt/2000上で動作しているすべてのプログラムは あるユーザの権限で動作しています。 たとえば、あなたが起動したメモ帳アプリケーションは あなたの権限で動作しているため、他人(管理者をのぞく)は あなたが起動したメモ帳アプリケーションに対する干渉は できません。 要は logonuser apiは、あるユーザ(他人)の権限でログオンし、 そのユーザの権限でプログラムを実行する為のモノです。 つまり「他人になりすます」ため誰でも実行出来て しまうと困るわけです。「セキュリティ」という概念 と矛盾することになります。 通常あなたが実行するプログラムはあなたの権限で動作し、 他人の権限で動作させることは出来ません。 そのため「他人になりすます」ために「se_tcb_name特権」が 必要になるため、事前にse_tcb_name特権を取得する必要が あります。