2011-10-06 3 views
5

私はDelphiプログラムからWindows 7のマップされたネットワークドライブ(P :)に書き込む際にいくつか問題があります。例えば、ForceDirectories('P:\test\folder')を試してみると、エラー(パスが見つかりません)が表示されます。私のプログラムがマップされたUNCパスを認識しないのはなぜですか?

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

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

さらに調査すると、Windowsで何らかの初期設定が行われていないようです。私はTcxShellComboBox(DevExpressコンポーネント)を使用する別のアプリケーション(app2)を持っています。そのコンボボックスでP:にナビゲートした後、app2でExpandUNCFileNameの呼び出しが最初のアプリケーションで正しく機能します。 P:の下にあるファイルのFileExistsと同じですが、app2のP:にナビゲートする前にFalseを返し、コンピュータの再起動後までtrueを返します。

+0

これは万一のサービスですか?あなたが記述する振る舞いは、Delphiとは何の関係もなく、ドライブマッピングがプロセス用に設定されていないために発生します。 –

+0

ドライブ文字が共有にマップされていることを確認します。ドライブ文字がマップされていない場合にのみ問題を再現できました(Delphi 7、2007 XE)。 – crefird

+0

サービスではなく、VCLフォームアプリケーションです。 – MGH

答えて

10

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

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

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

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

ソリューション:あなたがする必要がない場合は

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

  2. は上昇ネットワークプロンプトからネットワークドライブを割り当てるので、マップされたネットワークドライブは、上昇したユーザに利用可能であろう。

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

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

+2

2番目のソリューションを選択した場合は、通常は2番目のソリューションを(通常は仰角なしで)通常のユーザーからマップする必要があります。 – Whiler

関連する問題