質問: お世話になります。 LogonUser()というAPI使いたいんです。でもこのAPIを使おうとすると、「ERROR:0x522 クライアントは要求された特権を保有していません。」というエラーが発生してしまいます。 この原因は下記のWebページにも書いてありますが、 「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特権を取得する必要が あります。