環境:MFC、Win7
制限ユーザーから管理者権限に昇格して起動されたアプリ内で、
別のアプリを起動するものを作成しています。
その状態で、別のアプリを元の制限ユーザーで起動する事は可能でしょうか?
CreateProcessAsUser()を使えば出来そうなのですが、
昇格されているアプリなので、OpenProcessToken()を使うと
管理者のTokenが取得されてしまいます。
ここで、起動元の制限ユーザーのTokenを取れれば可能なのですが
取り方がわかりません。
もしくは、ほかに良い方法があれば教えてください。
GoogleでOpenProcessToken restrictでググったら出てきました
http://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng.cgi?print+201105/11050013.txt
回答頂いたのに返事が大変遅くなってしまい申し訳ありません。
リンク先のさらに先は飛べなかったので、自分で調べてみたら
たぶん以下の場所が該当すると思います。
http://mxr.mozilla.org/firefox/source/toolkit/xre/nsWindowsRestart.cpp
CreateProcessWithTokenW()を使う手法が記載されていますが、
残念ながらこのAPIはVista以降でしか使えないようです。
開発環境はWin7としましたが、XPも動作対象として入れたいと思っています。
Vista以降はこのAPIを使えば動作できましたが、
XPはCreateProcessAsUser()を使わなければならないようです。
そのため、同じ方法で取得できたTokenをCreateProcessAsUser()に渡したのですが
正常動作せずにGetLastError()で1314が返ってきます。
内容は「クライアントに必要な権限がありません」とのことなので、
何かやり方が間違っているのでしょうか?
まず前提として、UACの有無や権限周りの動きがXPとVista以降では全く異なるので、同じ
ロジックは使えないものと考えた方が賢明だと思います。
ですからOS判定して別処理にするべきだと思いますが、XPで権限降格の方法は私も調べた
ことが無いので知りません。
MS社のサポート切れだし・・・で押し切りましたので(^^;
つか、XPって権限昇格とかあったっけ?
ログインユーザのみで決まって、ログイン後は変えられないんじゃ無かったっけ。
単に起動するだけでいいならコマンドプロンプト経由でrunas使って起動するって手があ
るんですけどね。
http://www.k-tanaka.net/cmd/runas.php
連投失礼します。
CreateProcessWithLogonWではいかがでしょうか。
うーーん、
特例で権限昇格したのを元に戻すのは無理では?
これを許しちゃうと誰でも気楽に通常⇔特権ユーザの切替えが出来ることに
なってしまいます。
セキュリティー的に問題があると思います。
>つか、XPって権限昇格とかあったっけ?
ないねぇ、ログイン後に全体が特権ユーザーになるのはあったかもしれない。
特権ユーザで起動はないと思った。
XPでも、権限昇格はあるようです。
Vistaや7のUACによる昇格とは違うようで、「特権昇格」画面が出ます。
※特定のインストーラーなどに付いてるようです
XPに関してですが、実装が難しそうな事と
サポートが切れる事もあり、対象外とすることにしました。
ということで、リンク先のCreateProcessWithTokenW()を使う事で解決できそうです。
CreateProcessWithLogonW()はユーザー名とパスワードを
入力させねばならないようなので、使う事は出来ないようです。
(ユーザー名とパスワードって自動で取ってこれないですよね?)
runasを使う方法については良く分かってないので、一応調べてみます。
みなさんアドバイスありがとうございました。
解決とする前に、ついでにもう少しだけ教えてください。
リンク先のコードで実装中なのですが、170行目~の部分です。
デスクトップウィンドウハンドルを取得してTokenを取得して
それを使ってCreateProcessWithTokenW()で起動しているのですが、
この方法だと、必ずユーザー権限で起動されてしまいます。
該当の部分は、てっきりログイン中の
アカウントの権限を取得してきているものだと思っていました。
何が言いたいかというと、
・管理者で実行 > 管理者権限で起動
・ユーザー権限で実行 > ユーザー権限で起動
と、処理が自動で分かれるものと思っていましたが、違うようですね。
上記のようにしたい場合は、どのように改変すると良いのでしょうか?