1

UAC がオンであると仮定します。オフにしても問題ありません。

バックアップ/復元機能を備え、SQL Server 2005 Express を使用する ac# アプリがあります。

backupPath を取得するコードは、バックアップと復元の両方に使用され、すべての目的の名前は backup.dat になります。

バックアップパスを生成する

string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
 path = Path.Combine(path, "CompName");
 if(!Directory.Exists(path))
        Directory.CreateDirectory(path);
 path = Path.Combine(path, "AppName");
 if(!Directory.Exists(path))
        Directory.CreateDirectory(path);
 return path;

バックアップ時に、db は **C:\ProgramData\CompName\AppName** に backup.dat を生成し、その場所からユーザーが選択したターゲット ディレクトリに簡単に圧縮できます。

復元時には、アーカイブされたディレクトリまたはファイルを問題なく取得できますが、解凍すると **C:\Users\UserName\AppData\Local\VirtualStore\ProgramData\CompName\AppName** に移動します

vista sqlサーバーのプログラミングについて理解していることから、その仮想ストアパスにアクセスできない/アクセスできないため、解凍したファイルが仮想ストアに移動する理由を知る必要があります。

編集:解凍の提供に失敗しました-これは問題ではないと思いますが、ここにあります。

private void DecompressArchiveFile(string compressedFile, string backupPath)
{
    GZipStream gzip = new GZipStream(new FileStream(compressedFile, FileMode.Open, FileAccess.Read, FileShare.None), CompressionMode.Decompress, false);
    FileStream fs = new FileStream(backupPath, FileMode.Create, FileAccess.Write, FileShare.None);

    byte[] buffer = new byte[10000];
    int count = -1;
    while (count != 0)
    {
        count = gzip.Read(buffer, 0, 10000);
        fs.Write(buffer, 0, count);
    }
    gzip.Close();
    fs.Close();
}

助けてくれてありがとう -TK

4

2 に答える 2

2

Vistaの仮想化機能を利用していると思います。これは、動作の悪い古いアプリが、%ProgramData%への書き込みが許可されていないVistaで動作しないようにするためのものです。

アプリは%ProgramData%から読み取ることはできますが、書き込むことはできません。本当に%ProgramData%の下に書き込みたい場合は、昇格して実行する必要があります(または、サブパスのDACLを変更して書き込みを許可します)。

詳細については、 http://technet.microsoft.com/en-us/magazine/cc160980.aspx(データリダイレクト)を参照してください。

于 2009-02-24T15:54:45.563 に答える
1

特にこの回答のリンクから、この関連するスタック オーバーフローの質問を参照してください。

FOLDERID_ProgramData / System.Environment.SpecialFolder.CommonApplicationData

ユーザーはここでエクスプローラーを参照することを決して望んでおらず、ここで変更された設定はマシン上のすべてのユーザーに影響するはずです。デフォルトの場所は %systemdrive%\ProgramData で、Windows Vista のインストールでは隠しフォルダーです。ディレクトリを作成し、インストール時に必要な ACL を設定する必要があります。

したがって、ユーザーがこのフォルダーに書き込みできるようにする場合は、インストーラーの実行時に適切なアクセス権を付与する必要があります。

彼らがフォルダーへの書き込みアクセス権を持っている場合、仮想化で問題が発生することはないと思います。ただし、マニフェスト ( details )に次のようなものを追加して、必要な特権レベルでアプリケーションをマークする必要があります。

<security>
  <requestedPrivileges>
    <requestedExecutionLevel level="asInvoker" />
  </requestedPrivileges>
</security>

これにより、プロセスの仮想化が無効になります。タスク マネージャーの [表示] - [列の選択] の下に [仮想化] 列を追加することで、プロセスが仮想化されているかどうかを確認できます。

ちなみに Directory.CreateDirectory() は自動的に親ディレクトリを作成します。

于 2009-02-27T02:58:44.470 に答える