2009-03-10 20 views
6

Czy istnieje obsługiwane API w .NET 2.0 dla pisanie do userSettings odcinek głównych exe .config pliku?Jak pisać do głównej sekcji .config userSettings exe?

Scenariusz:

Aplikacja WinForm 2.0.

Mam ustawienie (ciąg połączenia z bazą danych, jeśli musisz wiedzieć), który ma zasięg na poziomie użytkownika. Oznacza to, że każdy użytkownik ma plik użytkownika utworzony przez .net, gdy użytkownik zapisuje wartość ustawienia.

Dla nowych użytkowników, którzy uruchamiają aplikację po raz pierwszy, główny plik .config exe aplikacji zawiera domyślną wartość w sekcji ustawień użytkownika. Ta sekcja jest tworzona przez studio graficzne, gdy ustawienie jest tworzone na karcie Ustawienia we właściwościach projektu.

Teraz chcę zezwolić każdemu użytkownikowi Administratorowi na komputerze na zmianę domyślnej wartości dla nowych użytkowników. Tylko Administratorzy będą mieli tę opcję, ponieważ zwykli użytkownicy i tak nie mają uprawnień do zapisu w pliku .config głównego exe.

Znalazłem, jak pisać ustawienia użytkownika do pliku .config użytkownika i jak pisać do sekcji appSettings głównego pliku .config. Ale moje logowanie się nie powiodło, gdy próbuję dowiedzieć się jak napisać do sekcji userSettings głównego .config

Czy moja jedyna szansa powraca do System.Xml i zrobić to ręcznie ładując .config w XmlDocument?

Odpowiedz

10

Po przeprowadzeniu badań wymyśliłem to rozwiązanie. Jest to nieco niski poziom, ale nadal przechodzi przez API konfiguracji .NET bez konieczności ręcznego analizowania pliku .config.

static void SaveUserSettingDefault(string clientSectionName, string settingName, object settingValue) 
{ 
    System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

    // find section group 
    ConfigurationSectionGroup group = config.SectionGroups[@"userSettings"]; 
    if (group == null) return; 

    // find client section 
    ClientSettingsSection clientSection = group.Sections[clientSectionName] as ClientSettingsSection; 
    if (clientSection == null) return; 

    // find setting element 
    SettingElement settingElement = null; 
    foreach (SettingElement s in clientSection.Settings) 
    { 
     if (s.Name == settingName) 
     { 
      settingElement = s; 
      break; 
     } 
    } 
    if (settingElement == null) return; 

    // remove the current value 
    clientSection.Settings.Remove(settingElement); 

    // change the value 
    settingElement.Value.ValueXml.InnerText = settingValue.ToString(); 

    // add the setting 
    clientSection.Settings.Add(settingElement); 

    // save changes 
    config.Save(ConfigurationSaveMode.Full); 
} 

Biorąc pod uwagę .config o następującej treści:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
      <section name="MyAssembly.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> 
     </sectionGroup> 
    </configSections> 
    <userSettings> 
     <MyAssembly.Properties.Settings> 
      <setting name="SqlConnectionString" serializeAs="String"> 
       <value>Server=(local);Database=myDatabase;Integrated Security=true;</value> 
      </setting> 
     </MyAssembly.Properties.Settings> 
    </userSettings> 
</configuration> 

będzie go używać tak:

if (RunningAsAdmin) // save value in main exe's config file 
{ 
    SaveUserSettingDefault(@"MyAssembly.Properties.Settings", @"SQLConnectionString", theNewConnectionString); 
} 
else // save setting in user's config file 
{ 
    Settings.Default. SQLConnectionString = theNewConnectionString; 
    Settings.Default.Save(); 
} 
+0

Niestety, to podejście nie działa dla odziedziczonych ustawień w 'userSettings'. – Tarik

1

Myślę, że tak - ręczne zapisywanie do pliku .config jest jedynym sposobem. Możesz też pozwolić administratorowi samodzielnie edytować plik .config.

+0

W takim przypadku administrator nie jest komputerem osoby zrozumiały. To tylko użytkownik, który działa jako administrator w swoim komputerze (na przykład prawie każdy domowy użytkownik XP). Ale Twoja sugestia może być przydatna w innym scenariuszu. dzięki. –