0

.net File.Delete を使用して Windows\System32 からファイルを削除するコンソール アプリケーションを作成しようとしています。アプリケーションは Windows 7 で実行されますが、ファイルが見つからないと言われているため失敗します。

調査したところ、フレームワークのセキュリティ制限であることがわかりましたが、マニフェスト ファイルをソリューションに追加し、それが含まれるように編集すると、こちらの同様の質問への回答も見つかりました。

<requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

その後、アプリケーションを起動するたびに、自分が管理者であることを「証明」するためにユーザー名とパスワードの入力を求められ、アプリケーションは System32 でファイルを見つけて、期待どおりに削除します。

これは起こりません。u\p のプロンプトが表示されず、プログラムが失敗します。debug\release\32-bit\64-bit を試してみました。

何かアドバイス?

完全なマニフェスト:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="EclCleaner.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
</asmv1:assembly>
4

3 に答える 3

1

恥ずかしい。64 ビット OS で実行し、X86 でコードをコンパイルすると、.net フレームワークは、Windows\System32 に関連するすべての要求を WoW64 フォルダーにリダイレクトします。デバッグではパスの値は system32 でしたが、実際には別のフォルダーを参照していました。

于 2014-06-05T23:18:51.793 に答える
0

ご自身の回答で述べたように、Windows は自動的かつ透過的に要求をフォルダーWindows\System32にリダイレクトしWindows\WoW64ます。これは、ハードコードされた文字列を使用するプログラムが、system32 フォルダーにある 64 ビット DLL をロードしてプログラムがクラッシュするのを防ぐためです。

32 ビット アプリケーションから 64 ビット システム フォルダーに移動する場合は、隠しフォルダーを使用する必要がありますWindows\sysnative。これは、64 ビット system32 フォルダーを指します。重要な注意点として、フォルダーは 32 ビット プログラムからのみ表示できます。64 ビット プログラム (Windows エクスプローラーなど) からフォルダーに接続しようとすると、フォルダーは存在しません。

class Program
{
    static void Main(string[] args)
    {
        //True in 32 bit, false in 64 bit.
        var tmp = Directory.Exists(@"C:\Windows\sysnative");
        Debugger.Break();
    }
}
于 2014-06-06T00:03:18.387 に答える