権限昇格されたアプリ内で権限を落として起動したい

[戻る]
ぽん 2014/03/15(土) 04:49:25
環境:MFC、Win7

制限ユーザーから管理者権限に昇格して起動されたアプリ内で、
別のアプリを起動するものを作成しています。
その状態で、別のアプリを元の制限ユーザーで起動する事は可能でしょうか?

CreateProcessAsUser()を使えば出来そうなのですが、
昇格されているアプリなので、OpenProcessToken()を使うと
管理者のTokenが取得されてしまいます。
ここで、起動元の制限ユーザーのTokenを取れれば可能なのですが
取り方がわかりません。

もしくは、ほかに良い方法があれば教えてください。

tamachan 2014/03/15(土) 23:38:08
Googleで"OpenProcessToken restrict"でググったら出てきました
http://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng.cgi?print+201105/11050013.txt

ぽん 2014/03/26(水) 21:09:09
回答頂いたのに返事が大変遅くなってしまい申し訳ありません。

リンク先のさらに先は飛べなかったので、自分で調べてみたら
たぶん以下の場所が該当すると思います。
http://mxr.mozilla.org/firefox/source/toolkit/xre/nsWindowsRestart.cpp


CreateProcessWithTokenW()を使う手法が記載されていますが、
残念ながらこのAPIはVista以降でしか使えないようです。

開発環境はWin7としましたが、XPも動作対象として入れたいと思っています。
Vista以降はこのAPIを使えば動作できましたが、
XPはCreateProcessAsUser()を使わなければならないようです。

そのため、同じ方法で取得できたTokenをCreateProcessAsUser()に渡したのですが
正常動作せずにGetLastError()で1314が返ってきます。
内容は「クライアントに必要な権限がありません」とのことなので、
何かやり方が間違っているのでしょうか?

AR 2014/03/27(木) 10:45:30
まず前提として、UACの有無や権限周りの動きがXPとVista以降では全く異なるので、同じ
ロジックは使えないものと考えた方が賢明だと思います。
ですからOS判定して別処理にするべきだと思いますが、XPで権限降格の方法は私も調べた
ことが無いので知りません。
MS社のサポート切れだし・・・で押し切りましたので(^^;

bun 2014/03/27(木) 12:22:03
つか、XPって権限昇格とかあったっけ?
ログインユーザのみで決まって、ログイン後は変えられないんじゃ無かったっけ。

みい 2014/03/27(木) 14:31:27
単に起動するだけでいいならコマンドプロンプト経由でrunas使って起動するって手があ
るんですけどね。
http://www.k-tanaka.net/cmd/runas.php

みい 2014/03/27(木) 14:39:21
連投失礼します。
CreateProcessWithLogonWではいかがでしょうか。

ITO 2014/03/27(木) 16:14:13
うーーん、
特例で権限昇格したのを元に戻すのは無理では?
これを許しちゃうと誰でも気楽に通常⇔特権ユーザの切替えが出来ることに
なってしまいます。
セキュリティー的に問題があると思います。


>つか、XPって権限昇格とかあったっけ?
ないねぇ、ログイン後に全体が特権ユーザーになるのはあったかもしれない。
特権ユーザで起動はないと思った。

ぽん 2014/03/28(金) 00:13:31
XPでも、権限昇格はあるようです。
Vistaや7のUACによる昇格とは違うようで、「特権昇格」画面が出ます。
※特定のインストーラーなどに付いてるようです

XPに関してですが、実装が難しそうな事と
サポートが切れる事もあり、対象外とすることにしました。

ということで、リンク先のCreateProcessWithTokenW()を使う事で解決できそうです。
CreateProcessWithLogonW()はユーザー名とパスワードを
入力させねばならないようなので、使う事は出来ないようです。
(ユーザー名とパスワードって自動で取ってこれないですよね?)

runasを使う方法については良く分かってないので、一応調べてみます。
みなさんアドバイスありがとうございました。

ぽん 2014/03/28(金) 00:20:59
解決とする前に、ついでにもう少しだけ教えてください。
リンク先のコードで実装中なのですが、170行目〜の部分です。

デスクトップウィンドウハンドルを取得してTokenを取得して
それを使ってCreateProcessWithTokenW()で起動しているのですが、
この方法だと、必ずユーザー権限で起動されてしまいます。

該当の部分は、てっきりログイン中の
アカウントの権限を取得してきているものだと思っていました。

何が言いたいかというと、
・管理者で実行 > 管理者権限で起動
・ユーザー権限で実行 > ユーザー権限で起動
と、処理が自動で分かれるものと思っていましたが、違うようですね。

上記のようにしたい場合は、どのように改変すると良いのでしょうか?

古いスレッドには追加発言できません。