2009-07-16 39 views
2

我需要知道應用程序設置(連接字符串)在何處以及如何存儲,以便可以在運行時更改並保存它們。關於在.NET中存儲應用程序設置的位置的困惑Win apps

我知道在VS中,你可以在Project> Properties下配置設置,這些設置存儲在appname.exe.config文件中的apps安裝目錄下。但是「application scope」在運行時不會被讀/寫,在用戶範圍內更改配置文件的副本將在用戶目錄下創建,並且不會被應用程序的其他用戶訪問。

我需要一種方式,以便用戶可以配置連接字符串,存儲在通用配置文件中,根據他們的需求從應用程序中,然後讓所有其他用戶(在該機器上)也可以使用它。我怎麼能做到這一點?

+0

你的問題的答案似乎是你應該使用用戶設置。但是,既然你已經提到過這些,我不確定你的問題是什麼。你想讓所有用戶共享相同的連接字符串,但是能夠自定義它嗎? – 2009-07-16 13:50:31

+0

是的。我希望所有用戶使用相同的連接字符串並對其進行自定義。 – superartsy 2009-07-16 14:03:40

+0

從你的其他評論之一,你似乎希望能夠管理你的應用程序。如果您處於活動目錄中,則可以使用組策略進行應用程序管理。如果數據庫已移動,則更新您的策略,並自動更新所有用戶。但是,所需的努力可能比您想投資的要多。 – 2009-07-16 14:32:10

回答

9

最簡單,最快的解決方案是在普通用戶有權讀/寫的共享位置創建配置文件。

爲您的配置數據創建一個具有公共屬性的類,然後將其序列化到此共享位置中的xml。

public class Configuration 
{ 
    // config filename 
    private static _name = Path.Combine(
     System.Environment.GetFolderPath(
     Environment.SpecialFolder.CommonApplicationData), 
     @"MyApp\MyConfig.xml"); 

    // the connection string 
    public string ConnectionString {get;set;} 

    // load the configuration from disk 
    public static Configuration Load() 
    { 
    using (var f = File.OpenRead(name)) 
    { 
     var x = new System.Xml.Serialization.XmlSerializer(typeof(Configuration)); 
     return x.Deserialize(f) as Configuration; 
    } 
    } 

    // save the configuration to disk 
    public static Save(Configuration config) 
    { 
    using (var f = File.OpenWrite(name)) 
    { 
     var x = new System.Xml.Serialization.XmlSerializer(typeof(Configuration)); 
     x.Serialize(f, config); 
    } 
    } 
} 
0

讀取和寫入註冊表過去一直是推薦的存儲用戶設置的方式,您仍然可以輕鬆地執行此操作(使用Microsoft.Win32.Registry),但這種方法存在問題(主要是由於權限不同您的用戶之間的級別 - 某些用戶不允許寫入註冊表的某些部分或創建新的密鑰)。

+0

我會避免這種情況,因爲您在觸摸註冊表時將面臨用戶權利問題。 – Will 2009-07-16 13:56:09

+0

註冊表被分區到HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER,就像應用程序設置被分區到應用程序範圍和用戶範圍一樣。從應用程序設置切換到註冊表無助於解決與權限有關的問題。 – 2009-07-16 13:59:07

+0

如果他們寫入用戶的註冊表部分,它實際上可以正常工作,但我認爲提問者實際上想要一個全局設置,任何用戶都可以修改。 – MusiGenesis 2009-07-16 13:59:47

5

應用程序範圍連接字符串是可寫的,但您必須對它進行不同的處理,而不是僅僅獲取字符串以供使用。例如:

Configuration c = ConfigurationManager 
    .OpenExeConfiguration(ConfigurationUserLevel.None); 

c.ConnectionStrings.ConnectionStrings["myConnectionString"] 
    .ConnectionString = "theConnectionString"; 
c.Save(); 

您還應該刷新該部分,以便正確檢索更改。緊接着:

string sectionName = c.ConnectionStrings.SectionInformation.SectionName; 
ConfigurationManager.RefreshSection(sectionName); 
0

您的問題,一些相互矛盾的元素:

應用程序設置(連接字符串)可以存儲,使他們能夠在運行時修改和保存。

應用範圍」的人都不會在運行時讀/寫,如果你改變下的用戶範圍的那些被用戶目錄下創建配置文件的副本,並不會由應用程序的其他用戶訪問。

最佳實踐要求要設置(如連接字符串)適用於用戶的系統應該通過系統的任何隨機用戶可改變的。那種設定應由具有管理員資格的人員更換系統。

因此,您描述的行爲正是預期的行爲。如果你真的想允許用戶改變這一點,那麼把它設置爲用戶設置,這樣如果用戶將其擰緊,他們只能將其用於自己的帳戶。

1

我這樣做的方式是我保存了一個XML文件,該文件是從具有SQL連接信息的POCO對象序列化到獨立存儲中的。由於對可從中讀取和寫入的用戶帳戶沒有真正的限制,因此您不必擔心用戶權限。

然後我修改了設置事件,以便當從應用程序設置文件中讀取連接字符串屬性時,我反序列化了隔離存儲器中的XML文件,構建了連接字符串,然後將其放入應用程序設置連接字符串中屬性。由於我是在設置類本身內部進行的,所以我能夠寫入它(但不保存到文件中)。

當我的應用程序運行時,如果它無法連接到服務器,我只是彈出一個窗口,詢問sql服務器信息,然後將它們鍵入,並將其保存到隔離存儲,永遠不要問它們再次(甚至通過升級)。

如果你有一個客戶端應用程序(WPF或WinForms),其他機器上的用戶將無法使用它,坦率地說,你可能找不到解決方案,除非你看.Net Remoting或那種性質。但是,如果在WinForms應用程序的同一臺計算機上有多個用戶,則可以使用IsolatedStorage,並且它適用於所有用戶。

在設置類,添加此事件處理程序:

VB:

Private Sub MySettings_SettingsLoaded(ByVal sender As Object, ByVal e As System.Configuration.SettingsLoadedEventArgs) Handles Me.SettingsLoaded 
    Me.Item("MyAppConnectionString") = MyLibrary.BuildConnectionString() 
End Sub 

C#:

protected override void OnSettingsLoaded(object sender, System.Configuration.SettingsLoadedEventArgs e) 
{ 
    base.OnSettingsLoaded(sender, e); 
    this["MyAppConnectionString"] = MyLibrary.BuildConnectionString(); 
} 
2

正如其他人指出,你需要創建的共享位置計算機可由您的應用程序的所有用戶寫入。此位置可以是文件夾,文件或註冊表。但是,Windows實際上有一個位置。你可以在MSDN上閱讀更多關於此的內容。你需要的文件夾是通用應用程序數據:

CSIDL_COMMON_APPDATA

此文件夾應該用於這不是用戶特定應用程序數據。例如,應用程序可以在CSIDL_COMMON_APPDATA文件夾中存儲拼寫檢查字典,剪貼畫數據庫或日誌文件。此信息不會漫遊,並可供任何使用計算機的人使用。默認情況下,該位置對於普通(非管理員,非電力)用戶是隻讀的。如果應用程序要求普通用戶具有對CSIDL_COMMON_APPDATA的特定於應用程序的子目錄的寫入權限,則應用程序必須在應用程序安裝期間顯式修改該子目錄上的安全性。修改後的安全性必須記錄在供應商問卷中。

您可以在您的.NET應用程序中調用

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

得到這個文件夾的位置。在Vista上這個文件夾通常是C:\ProgramData

您必須在共享文件夾內創建自己的供應商和應用程序專用文件夾,並且這應該通過以提升特權運行的安裝程序來完成。此安裝程序還應確保用戶具有獲取寫訪問權限的必要權限,如上面的引用中所示。