トップ回答者
VISTAでプリンタドライバのサイレントインストール

質問
-
VISTAで
AddPrinterConnection関数を使用してプリンタドライバをインストールしたいのですが、
プリンタドライバのインストールダイアログや昇格ダイアログは出したくありません。
プリンタドライバのインストールダイアログは、
[HKEY_CURRENT_USER\Printers\LegacyPointAndPrint]
"DisableLegacyPointAndPrintAdminSecurityWarning"=dword:00000001にすれば表示されなくなることは判りました。
問題は昇格ダイアログを出したくない点です。
そこで自前のサービス(Local System)を作成し、アプリからの依頼をパイプで受け取って
AddPrinterConnection関数を呼び出したところ、rc=5(アクセスが拒否されました)
が帰って来てしまいました。
いくつかの特権が無効だからかと思い、
OpenProcessToken→LookupPrivilegeValue→AdjustTokenPrivileges
で特権を全て有効にしたのですが、同じ結果でした。
しかし、サービスにおいてセキュリティコンテキストを偽装して実行したところ問題なく
ドライバがサイレントインストールされました。
LogonUser→ImpersonateLoggedOnUser→AddPrinterConnection→RevertToSelf
しかし、問題はユーザ名はわかってもパスワードがわからないため、LogonUser関数が
使えない点です。
ユーザ名は、サービスに依頼したプロセスのIDから
OpenProcess→OpenProcessToken→GetTokenInformation→LookupAccountSid
で判るのですが、パスワードはわかりません。
サービスに依頼したプロセスのアクセストークンからセキュリティコンテキストを偽装
したのですが、結果的に降格してrc=5(アクセスが拒否されました)になってしまいました。
OpenProcess→OpenProcessToken→ImpersonateLoggedOnUser
こんなことを2日間もやって時間をつぶしています。
どうしたらよいでしょう?
救いの手を延べていただけないでしょうか。
回答
-
どのような運用のために、その仕組みを実現したいのかを明らかにして欲しいと思います。
それによってアドバイスの方向性も変わる可能性が出てくるかもしれません。
ちなみに導入環境は社内等の限られたものですか?
であれば、UAC自体を無効化するという手もなくはないような気がします。
なお、一般向けや顧客向けのソリューションであるなら、”自由に”特権を代行するサービスのインストールは辞めた方が良いです。
悪用されるリスクを考えると、昇格ダイアログくらい許容できそうです。
-----
私見ですが、UACの昇格ダイアログを(偽装・サービスの導入等で)スキップできたら、UACの意味がありません。
他にもサービスがアプリからの依頼を受けて”自由に”管理者特権を行使するのであれば、そのサービスは弱点を作り出していることとなるので、UACの効力を失わせる要因になります。
そうするぐらいなら、UACは切ってしまえば良いのではと思い、UAC無効化の提案をしています。
-
ろくさん さんからの引用 昔から、プリンタを増設した場合、プリンタ情報(マシン名と共有名)を登録するだけで、各クライアントでの印刷時に、自動的にドライバがインストールされ、印刷しておりました。
本来、このような用向きではグループポリシーとか(XP等は)ログオンスクリプトが向いているような気がします。
通常のセッションにおいて、UACの昇格ダイアログをスキップできる手があればそれは不具合です。
LogonUserで昇格ダイアログをパスできるというのであれば、インストール時に専用のユーザを作れば回避できるのかもしれませんが、結局(程度の差はあれど)脆弱になることは許容することになります。
-
UACにどのようなことを期待しているのでしょうか?
各種サービスをインストールして穴を広げる状態は、UACの存在意義が問われます。
また、これまでのOSは「あまりにも無防備すぎる」という言葉が示す状態だったと思います。その状態を看過できないと言うことになるのでしょうか?
VistaのUACはOSレベルでユーザに不便を強いる形でセキュリティ向上を図っているものですから、今までと同じ操作感を求めることと、UACの意図するところとの両立は矛盾を感じられます。
しかし、これらの主張をしたところで、上司が納得するかどうかは別の話だとも理解しています。
悩ましい世の中です。 -
こんにちわ。
役立つか不明ですが、標準ユーザが共有されたネットワークプリンタを利用する場合、GPOの「ポイントと印刷の制限」にプリンタを登録しているマシンを設定することで、UACをパスしてドライバのサイレントインストールを行うことが可能となります。
最大文字制限が1024バイトというのがなんともなんですが・・・
なお、ローカルプリンタを利用する場合、MS標準のプリンタドライバであれば、UACはパスしてインストールすることが可能ですので、対象をローカルプリンタドライバに変更する仕組みに変えることなんてどうでしょうか。
MS標準のユニバーサルドライバだけというのがなんともなんですが・・・
すべての返信
-
どのような運用のために、その仕組みを実現したいのかを明らかにして欲しいと思います。
それによってアドバイスの方向性も変わる可能性が出てくるかもしれません。
ちなみに導入環境は社内等の限られたものですか?
であれば、UAC自体を無効化するという手もなくはないような気がします。
なお、一般向けや顧客向けのソリューションであるなら、”自由に”特権を代行するサービスのインストールは辞めた方が良いです。
悪用されるリスクを考えると、昇格ダイアログくらい許容できそうです。
-----
私見ですが、UACの昇格ダイアログを(偽装・サービスの導入等で)スキップできたら、UACの意味がありません。
他にもサービスがアプリからの依頼を受けて”自由に”管理者特権を行使するのであれば、そのサービスは弱点を作り出していることとなるので、UACの効力を失わせる要因になります。
そうするぐらいなら、UACは切ってしまえば良いのではと思い、UAC無効化の提案をしています。
-
>どのような運用のために、その仕組みを実現したいのかを明らかにして欲しいと思います。
開発しているシステムは、特定業種の一般向けソリューションで、オフコン→Windows3.1→NT→XP→VISTAと移行してきました。
昔から、プリンタを増設した場合、プリンタ情報(マシン名と共有名)を登録するだけで、各クライアントでの印刷時に、自動的にドライバがインストールされ、印刷しておりました。
そのような文化のなかで、「これからは2~40台すべてのクライアントにプリンタドライバをインストールしてください」とは販社殿や顧客殿に言えないわけです。
>そうするぐらいなら、UACは切ってしまえば良いのではと思い、UAC無効化の提案をしています。
当初は、UACオフの案もありましたが、あまりにも無防備すぎるということで却下されました。
特定のJavaw.exeをACT互換修正プログラムでRunAsAdminする案もあったのですが、ログオンと同時にソフトが自動起動しない(許可が必要)などの問題もあり、これも却下されました。
-
ろくさん さんからの引用 昔から、プリンタを増設した場合、プリンタ情報(マシン名と共有名)を登録するだけで、各クライアントでの印刷時に、自動的にドライバがインストールされ、印刷しておりました。
本来、このような用向きではグループポリシーとか(XP等は)ログオンスクリプトが向いているような気がします。
通常のセッションにおいて、UACの昇格ダイアログをスキップできる手があればそれは不具合です。
LogonUserで昇格ダイアログをパスできるというのであれば、インストール時に専用のユーザを作れば回避できるのかもしれませんが、結局(程度の差はあれど)脆弱になることは許容することになります。
-
UACにどのようなことを期待しているのでしょうか?
各種サービスをインストールして穴を広げる状態は、UACの存在意義が問われます。
また、これまでのOSは「あまりにも無防備すぎる」という言葉が示す状態だったと思います。その状態を看過できないと言うことになるのでしょうか?
VistaのUACはOSレベルでユーザに不便を強いる形でセキュリティ向上を図っているものですから、今までと同じ操作感を求めることと、UACの意図するところとの両立は矛盾を感じられます。
しかし、これらの主張をしたところで、上司が納得するかどうかは別の話だとも理解しています。
悩ましい世の中です。 -
こんにちわ。
役立つか不明ですが、標準ユーザが共有されたネットワークプリンタを利用する場合、GPOの「ポイントと印刷の制限」にプリンタを登録しているマシンを設定することで、UACをパスしてドライバのサイレントインストールを行うことが可能となります。
最大文字制限が1024バイトというのがなんともなんですが・・・
なお、ローカルプリンタを利用する場合、MS標準のプリンタドライバであれば、UACはパスしてインストールすることが可能ですので、対象をローカルプリンタドライバに変更する仕組みに変えることなんてどうでしょうか。
MS標準のユニバーサルドライバだけというのがなんともなんですが・・・