6

Delphi プログラムから Windows 7 のマップされたネットワーク ドライブ (P:) への書き込みに問題があります。たとえば、 を試してみると、ForceDirectories('P:\test\folder')エラーが発生します (パスが見つかりません)。

コード ( ) に UNC パスを入力してみましたが、ForceDirectories('\\computername\share\test\folder')うまくいきました。ただし、ExpandUNCFileName('P:\')動作しないようです。'P:\' を返します。Windows XP ではExpandUNCFileName('P:\')、UNC パスを返します。

Windows 7 の Delphi で UNC パスを取得する方法、またはマップされたネットワーク ドライブに書き込む方法を教えてください。

さらに調査すると、Windows である種の初期化が欠落しているようです。(DevExpress コンポーネント) を使用する別のアプリケーション (app2) がありますTcxShellComboBox。そのコンボボックスの P: に移動した後、app2ExpandUNCFileNameで、最初のアプリケーションで正しく動作するように呼び出します。P: の下のファイルと同じでFileExists、app2 の P: に移動する前に False を返し、コンピューターの再起動後および再起動するまで true を返します。

4

1 に答える 1

12

Microsoft KB Articleによると、ユーザー アカウント制御が有効になっており、Windows エクスプローラー (昇格されていない) からネットワーク ドライブをマップすると、昇格されたプログラムはそのドライブにアクセスできなくなります。見積もり:

ユーザーが Windows Vista または Windows 7 にログオンし、ユーザー アカウント制御が有効になっている場合、ユーザーのフィルター処理されたアクセス トークンを使用するプログラムと、ユーザーの完全な管理者アクセス トークンを使用するプログラムを同時に実行できます。LSA は 2 つの別個のログオン セッション中にアクセス トークンを作成したため、アクセス トークンには別個のログオン ID が含まれています。

ネットワーク共有がマップされると、現在のプロセス アクセス トークンの現在のログオン セッションにリンクされます。つまり、ユーザーがフィルター処理されたアクセス トークンと共にコマンド プロンプト (Cmd.exe) を使用してネットワーク共有をマップする場合、そのネットワーク共有は、完全な管理者アクセス トークンで実行されるプロセスにはマップされません。

Delphiを「管理者として」(昇格)実行するとコメントで述べたので、これが問題です。

ソリューション:

  1. 必要がない場合は、昇格した Delphi を実行しないでください。ソフトウェアで昇格が必要な場合は、それを 2 つの部分 (昇格された部分と昇格されていない部分) に分割し、最初の部分からマップされたネットワーク ドライブにアクセスします。次に、昇格した COM オブジェクトを使用するか、別の実行可能ファイルを実行するだけで、他の部分にアクセスします。

  2. 昇格されたネットワーク プロンプトからネットワーク ドライブをマップして、マップされたネットワーク ドライブを昇格されたユーザーが使用できるようにします。

    a. 昇格したコマンド プロンプトを開きます (「cmd.exe」を管理者として実行します)。

    b. タイプnet use p: \\computername\share\test\folder

于 2011-10-06T15:32:51.080 に答える