2009-03-10 6 views
6

Có API hỗ trợ trong .NET 2.0 cho viết đến userSettings phần của chính của exe .config tập tin?Làm thế nào để ghi vào phần exe's .config userSettings?

Kịch bản là:

Ứng dụng Winforms 2.0.

Tôi có một cài đặt (chuỗi kết nối cơ sở dữ liệu, nếu bạn cần biết) có phạm vi cấp người dùng. Điều này có nghĩa là mỗi người dùng có một tệp người dùng .config được tạo bởi .net khi người dùng lưu giá trị của cài đặt.

Đối với người dùng mới chạy ứng dụng lần đầu tiên, tệp .config của exe chính của ứng dụng có chứa giá trị mặc định trong phần cài đặt người dùng. Phần này được tạo bởi studio trực quan khi cài đặt được tạo trong tab Cài đặt của thuộc tính dự án.

Bây giờ, tôi muốn cho phép bất kỳ người dùng Quản trị viên nào trên máy tính có thể thay đổi giá trị mặc định cho người dùng mới. Chỉ quản trị viên mới có tùy chọn này, bởi vì người dùng thông thường không được phép ghi vào tệp .config của exe chính.

Tôi đã tìm cách ghi cài đặt người dùng vào tệp .config của người dùng và cách viết vào phần appSettings của tệp .config chính. Nhưng googling của tôi đã thất bại khi cố gắng tìm hiểu cách viết vào phần userSettings của chính .config

Cơ hội duy nhất của tôi không quay lại System.Xml và tải thủ công .config trong XmlDocument?

Trả lời

10

Sau một số nghiên cứu, tôi đã đưa ra giải pháp này. Đó là một mức độ thấp, nhưng vẫn đi qua API cấu hình .NET mà không cần phải phân tích cú pháp tệp .config theo cách thủ công.

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); 
} 

Cho một .config với nội dung sau:

<?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ạn sẽ sử dụng nó như thế này:

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

Thật không may, cách tiếp cận này không hoạt động đối với các cài đặt kế thừa trong 'userSettings'. – Tarik

1

Tôi nghĩ có - viết thủ công vào tệp .config là cách duy nhất. Hoặc bạn có thể cho phép quản trị viên tự chỉnh sửa tệp .config.

+0

Trong trường hợp này, người quản trị không phải là một máy tính hiểu biết người. Nó chỉ là một người sử dụng mà sẽ xảy ra để chạy như Admin trong máy tính của mình (ví dụ, hầu như bất kỳ người dùng XP nhà). Nhưng đề xuất của bạn có thể hữu ích trong một kịch bản khác. cảm ơn. –