0

.configに存在するファイルを返そうとしています%WINDIR%\System32\inetsrv\config

このために私は次のコードを使用しています:

DirectoryInfo configFolder = new DirectoryInfo(Environment.ExpandEnvironmentVariables("%WINDIR%") + @"\System32\inetsrv\");
FileInfo[] configFiles = configFolder.GetFiles("*.config");

これにより、ゼロオブジェクトがに返されますconfigFiles。別のフォルダ(たとえばD:\ DropBox)を使用する場合は、正常に機能します。

このコードは以前は機能していましたが、何か変更がありましたか?

また、FileInfo fi = new FileInfo(Path.Combine(configPath, "applicationHost.config"));okを返しますが、fi.LengthはをスローしFileNotFoundExceptionます。

権限である必要があるようですが、コードの実行時に権限があるかどうかを確認する方法がわかりません。

4

3 に答える 3

2

システムフォルダにアクセスしようとしているため、昇格された特権でコードを実行する必要があります。

Windowsエクスプローラー->プロパティ->セキュリティで調べると、そのフォルダーがSYSTEM、Administrators、TrustedInstallerへのアクセスを制限していることがわかります(最後がどこから来たのかわからないので、私のマシンだけにあるかもしれません)。 。)。

App.configファイル内で次のように実行レベルを構成できます。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>

ここに記事があります:WindowsでC#アプリケーションを管理者としてのみ実行するように強制する方法

于 2012-02-28T16:25:13.127 に答える
2

私は開発者ではなく、コード(主に自分用の管理ツールを作成する)に手を出すだけなので、誰かが私に答えの正しい場所を説明したり指摘したりできるかどうか疑問に思います。

基本的に、私は他の誰かのプロジェクトから機能するコードをいくつか持っていて、それを自分のプロジェクトにコピーしました。以前はうまくいったと確信していますが、100%確実ではありません。当時、私はx86 Windowsを実行していましたが、現在はx64を使用しています。

古いコードはまだ機能していたので、設定をコピーして、最終的に解決策を見つけました。

Project'sの"PlatformTarget"Build propertiesAny CPU(x86から​​)に設定すると、機能しました。x64に設定することもできましたが、セキュリティ上の問題だと思います。

とにかく、問題は解決しました!すべての提案をありがとう!

于 2012-02-29T09:23:46.397 に答える
0

これは権限の問題ではありませんが、実際には舞台裏で行われているSysWow64の方向に関連しています。C:\ windows \ system32は暗黙的にC:\ windows\syswow64にリダイレクトされています。これが、ビルドアーキテクチャを変更すると問題が解決する理由です。任意のビルドアーキテクチャで機能する別の方法は、リダイレクトを無効にすることです。

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);

IntPtr ptr = new IntPtr();
Wow64DisableWow64FsRedirection(ref ptr);

これはスレッドごとの設定であるため、GetFiles()を使用する前に正しいスレッドで実行する必要があることに注意してください。

于 2014-05-27T19:49:22.067 に答える