作成したフォルダやファイルの書込み権限をプログラムから変更する方法も検索してみましたがUNIX系のコマンドばかりがひっかかってきて、Windowsのものは見つけられませんでした。
ACL の操作であれば、"ICACLS" コマンドとか、SetACL が参考になりませんか?
あと、2つのプログラムに分ける場合でも、最初に2番目のプログラムを呼び出しておいて、何かのきっかけを待たせるようにして、コピー終了後に、実際の処理を開始させると、見た目は普通になるかも ^^;。
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
C:直下またはシステムドライブ以外のD:直下などにフォルダを作成してインストールしたソフトが起動時にエラーになります。実行ファイルを右クリックし「管理者として実行」で実行すると問題なく実行できます。また、C:Progra Files の下にインストールした場合でも問題なく実行できます。Windows 7 以前および Windows 8 RP ではどこにインストールしようと問題なく実行できていました。
いろいろ調べた結果、Windows 7 / 8 RP ではインストールしたフォルダの プロパティ>セキュリティ>グループ名またはユーザー名 に SYSTEM、Administrators、Users、Authenticated Users があります。しかし Windows 8 製品版では SYSTEM、Administrators、Users だけで Authenticated Users がありません(このためか、メモ帳でフォルダ内のテキストファイルを編集して上書き保存しようとしてもアクセス拒否されます)。ここにログインユーザーを追加してフルコントロールを与えると正常に動作します。
対象としているのは私が自作して配布しているソフトです。利用者はフォルダーのセキュリティをいじってユーザーを追加するような操作はできない人がほとんどです。インストールしたユーザー自身がアクセスできないというのはバグではないかと思いますが、インストールソフト側でなんとかできる方法はないでしょうか。
ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。
質問作成者が受け入れた回答
作成したフォルダやファイルの書込み権限をプログラムから変更する方法も検索してみましたがUNIX系のコマンドばかりがひっかかってきて、Windowsのものは見つけられませんでした。
ACL の操作であれば、"ICACLS" コマンドとか、SetACL が参考になりませんか?
あと、2つのプログラムに分ける場合でも、最初に2番目のプログラムを呼び出しておいて、何かのきっかけを待たせるようにして、コピー終了後に、実際の処理を開始させると、見た目は普通になるかも ^^;。
その後重要なことが判明しましたので報告しておきます。
これらの現象は Windows XP を起動した画面から Windows 8 のアップグレードインストールを行った状態で発生していました。今回新たに Windows 7 をインストールし、Windows 8 を DVD 起動し上書きでクリーンインストールした場合は問題がおきません。つまりこの状態で私のインストールプログラムからc:\Aを作成した場合 Windows 7 と同様 Windows 8 でもフォルダーc:\AのプロパティのセキュリティタブにAuthenticated Usersが含まれており、書き込みが可能なので問題が起きません。
これ以外にどのようなアップグレードパスの場合に問題が起きるかは試していませんが Windows 8 のインストール方法に依存したバグであるのはほぼ間違いないと思います。
ACL の操作であれば、"ICACLS" コマンドとか、SetACL が参考になりませんか?
icacls というコマンドは知りませんでしたので、いろいろ試してみました。その結果インストーラーから次のコマンドを実行することにより解決できました。(XPはこのコマンドをサポートしていませんが、もともと問題がないのでOKです。)
icacls "<Target Folder>" /grant Everyone:(F) /T /Q
コマンドプロンプトの野暮な画面が2秒ほど表示されてしまいますが、インストール終了時に行えばさほど違和感はありません。
ありがとうございました。
素人考えですが、ファイルのコピー部分と、レジストリーやメニューに登録する部分を別のプログラムにし、まずはコピーした後、次のプログラムを起動、インストーラーとしてやらなければならない残り部分を行うのでは、NG ですか?
2つに分けたプログラムをユーザーが別々に起動すればOKでしょうが、それではまともなインストラーとはいえないので、ユーザーからみると1つのインストーラーがまずコピーをし、その後登録のための子プログラムを呼び出す方法を試してみました。CreateProcess関数で子プログラムを呼び出すとうまくいきません。調べたところ、CreateProcess関数では親のユーザーアカウント制御を昇格させることができないとのことです。
昇格させるためにはShellExecute関数を使えばよい、と調べがつきましたので簡単なプログラムでテストしたところうまくいくようです。ただし子プログラムを呼び出すところでインストール画面が消えてデスクトップの壁紙が暗転表示され、「ユーザーアカウント制御:次の不明な発行元からのプログラムにこのコンピューターへの変更を許可しますか?」が出ますので、インストールの流れとしては気に入らないですね(許容範囲ですが)。
逆に管理者としてインストーラーを実行させておいてコピー部分を権限を降格させた子プログラムとして実行する方法もあるようですが(CreateProcess類似関数を使う)、こちらは一筋縄ではいかなそうです。完全にMSDNフォーラム行きですね。
作成したフォルダやファイルの書込み権限をプログラムから変更する方法も検索してみましたがUNIX系のコマンドばかりがひっかかってきて、Windowsのものは見つけられませんでした。
Windows 8 のパッチが出ない限り、現状では Program Files の下にインストールするように強制するか、インストールプロセスを2つに分けるしかなさそうです。