2016-10-21 93 views
8

我在Windows 10 PC上有一個c#應用程序。在我要讀取的安裝文件夾(C:\ Program Files(x86)\ xxx)中有設置文件,但除非用戶具有管理員訪問權限才能進行編輯。問題在於windows正在將這些設置文件複製到VirtualStore並將所有讀取重定向到那裏 - 而與管理員運行相同的應用程序會在Program Files文件夾中看到原始設置文件。如何跳過VirtualStore並讀取Program Files文件夾中的文件?

我的問題:有沒有辦法讓應用程序看到程序文件中的原始文件,即使沒有以管理員身份運行?我只想閱讀它們,而不是編輯它們。

+0

如果您只是閱讀它們,閱讀該文件的複製版本時出現什麼問題? – ChrisBint

+0

因爲當以管理員身份運行時,您可以編輯它們 - 但在這種情況下,它會編輯程序文件文件夾中的版本,而不是虛擬商店版本。所以從非管理員實例的角度來看,這些文件是不會改變的。 – Sugrue

+0

它在什麼時候複製文件? – ChrisBint

回答

7

您不需要提升權限即可從Program Files (x86)文件夾讀取文件。檢查如何打開文件以供閱讀。您應該在普通用戶模式和提升模式下指定不同的FileAccess標誌。對於普通用戶模式下,它應該以「FileAccess.Read`打開:

using (FileStream settingsFile = new FileStream(@"C:\Program Files (x86)\xxx", FileMode.Open, FileAccess.Read)) 
{ 
    // Do the job 
} 

要檢測的應用程序運行以提升的權限使用IsProcessElevated方法。根據結果​​,您可以選擇適當的FileAccess模式。

+0

謝謝 - 我會仔細檢查我是否正確打開文件。 – Sugrue

+1

@Sugrue爲了更好地理解您的應用程序的文件流量,您可以使用Sysinternals套件中的['Process Monitor'](https://technet.microsoft.com/en-us/sysinternals/processmonitor.aspx)。它將顯示應用程序請求的每個文件的所需訪問權限。 – Nikita

+1

Hi Nikita - 我們再次檢查 - 我們在代碼的另一部分中很愚蠢,在那裏它錯誤地打開文件。現在全部修好了。謝謝, – Sugrue

1

在Program Files中查看原始文件的方法是不要寫在那裏(並且爲此Nikita指出,只讀的打開文件爲只讀)。 VirtualStore不在使用中,而是爲了解決應用程序問題。此類問題是由當前Windows(自NT)以來可能同時具有來自不同用戶的多個會話的舊單用戶Windows編寫的破壞應用程序引起的。

如果應用程序想要修改所有用戶之間共享的數據文件,它應該將文件保存到所有用戶配置文件。如果是用戶數據,它可以將數據存儲在用戶配置文件的Application Data文件夾中。在應用程序數據中,如果您希望數據爲漫遊或本地,您仍然可以使用該選項。

這些文件夾的路徑在不同的Windows版本上有所不同。 Windows Installer具有設置爲路徑的屬性。應用程序有很多可以使用的接口。一個接口見Working with Known Folders in ApplicationsSHGetKnownFolderPath

除此之外,對程序文件的訪問在UAC之後。您應該閱讀以獲取所有詳細信息。

相關問題