2012-02-17 17 views
1

私はWindows 7マシンで完全な管理者権限を持っていますが、c:\ドライブにファイルを作成するアプリケーションを実行すると、エラーコード5(アクセスが拒否されます)が表示されます。私は窓7はCドライブやプログラムファイルのような保護された領域にファイルを作成することができないことを知っているファイルエクスプローラは、アクセス?Windows 7でC:ドライブにアクセス

私のアプリケーションでは、ユーザーはファイルを作成するフォルダを選択するので、c:\ drive sを選択した場合、このエラーは明らかに望ましくありません。私の知る限り、私が細かいですが、私のアプリケーションでも(同様に理解されている)、それを提示していないが、私のオプションが何であるかUACダイアログをバイパスすることができないようで研究しているよう

void CTestDlg::OnBnClickedButtonCreate() 
{ 
    CFile f; 
    CFileException e; 
    TCHAR* pszFileName = _T("c:\\test.txt"); // here i am hard coding path for simplicity. 
    if(!f.Open(pszFileName, CFile::modeCreate | CFile::modeWrite, &e)) 
    { 
     TRACE(_T("File could not be opened %d\n"), e.m_cause); 
    } 

} 

私の唯一の選択肢は、これがWindows 7 OSで、ファイルを作成する前にファイルのパスを確認し、より使いやすいメッセージを表示する場合、自分のアプリケーションでこれを検出することです。 'Windows 7では、別のフォルダを選択するか、xp 'に戻ります。このスキームはWindows 7に移行する方法ですか?他の方法はありますか?

+0

[Windows 7にはVistaと同じ問題がありますか?](http://stackoverflow.com/questions/5210575/does-windows-7-have-the-same-problem-as-vista) –

+0

いいえ、あなたの唯一のオプションは* Windows 7 *と* Windows XPの両方に適切なフォルダを使用することです。これは、ディスクのルートディレクトリではなく、ユーザーのフォルダの1つになります。ディスクのルートディレクトリに物を置かないでください。 –

+1

@CodyGrayこれらは同じではありませんが、どちらもUACと関係しています。 – zar

答えて

3

Kolink氏によれば、アプリケーションは管理者権限で実行する必要があります。自動的に行うには、hereのようにマニフェストを埋め込みます。

編集:VS2010の場合:プロジェクトのプロパティー>構成のプロパティー>リンカー>マニフェスト・ファイル 'UAC実行レベル'を希望の値に変更します。

+1

実際の答えは、記事の残りの部分がVS2005に関連しているため、Microsoftがこれを更新していないため、あなたが提供したリンクのコメントセクションに2行あります。 VS2010の場合: プロジェクトプロパティー>構成プロパティー>リンカー>マニフェストファイル 「UAC実行レベル」を希望の値に変更してください。 – zar

+0

@zadane:おっと、申し訳ありません。訂正してくれてありがとう。私は他の人の答えにそれを加えました。 –

1

保護された領域に書き込もうとしないでください。また、アプリケーションを権限(右クリック=>管理者として実行)で実行する必要もありません。

私は自分のルートにランダムなファイルがあるのが好きではないことを知っています。私は整理されたファイルが好きです。

+0

プログラムで管理者権限で実行できますか? – zar

+1

@ザダネ私は本当に最後の質問への答えができないことを願っています。そうでなければ安全ではないようだ。 – webdreamer

+0

rootに表示されるランダムなファイルが好きでない場合は、許可しないでください。 OPはこれをやりたがっているので、彼らは尋ねました。 – stu

0

パスを提供しているユーザーの場合は、ファイルをこの場所に保存して別の名前を入力するように通知する必要があります。

通常、シェルGetSaveFileName関数は、新しいファイルが選択されたディレクトリに作成されるかどうかを確認するために、返される前にのOPENFILENAME構造のフラグを参照してください。

このような状況を処理し、自分でUAC確認を表示することもできます。しかし、このソリューションは本当に価値があるよりもはるかに多くの労力を必要とします。現在のプロセスを昇格することはできないため、ファイルを保護領域に保存する操作は、別のプロセスで実装する必要があります。同時に、現在のプロセスに保存されるデータがあるので、2つのプロセス間の通信を実装する必要があります。詳細については、Designing UAC Applications for Windows Vistaをお読みください。

+0

新しいファイルを選択されたディレクトリに作成できるかどうかチェックしたいですが、CreateFile()はコード5の「アクセス拒否」を返します。権限の問題のために、このフォルダを区別できないのですか? 'GetSaveFileName'は、宛先フォルダが例えばc:\ – zar

+0

の場合、それを正確に行います。@zadane 'アクセスが拒否されました'は、あなたがそのフォルダに書き込む(または読み込む)権限がないことを意味します。完全な管理者権限で昇格されている場合は、フォルダに書き込む権限はありません。私はそれを確認する唯一の方法は、フォルダACLを分析することです、たとえば、Administratorsグループが書き込み権限を持っているかどうかをチェックすることです。しかし、それは弾丸ではない。 –

関連する問題