附加資料庫 (.mdf/.ldf) 後,資料庫狀態顯示「唯讀」或附加失敗。**核心原因**:NTFS 檔案系統權限不足。SQL Server 服務啟動帳號對資料庫檔案資料夾缺乏「修改/寫入」權限,導致無法建立鎖定檔、寫入記錄檔。
僅發生於 NTFS 格式磁碟 (FAT32/exFAT 無此限制)。
Users/Authenticated Users) → 勾選 完全控制 → 確定套用。

安裝程式不可要求使用者手動設權限,需在 Install 或 Commit 階段自動完成。
using Microsoft.Win32;
public void DisableSimpleFileSharing()
{
// 強制關閉簡單共享 (forceguest = 0)
using (var key = Registry.LocalMachine.OpenSubKey(
@"SYSTEM\CurrentControlSet\Control\Lsa", writable: true))
{
if (key != null)
{
key.SetValue("forceguest", 0, RegistryValueKind.DWord);
}
}
// 亦可用批次指令: reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v forceguest /t REG_DWORD /d 0 /f
}
using System.IO;
using System.Security.AccessControl;
using System.Security.Principal;
public void GrantFolderWriteAccess(string folderPath, string accountName = null)
{
if (string.IsNullOrEmpty(accountName))
accountName = Environment.UserName; // 或 "Users", "Authenticated Users", "NETWORK SERVICE"
var dirInfo = new DirectoryInfo(folderPath);
var dirSecurity = dirInfo.GetAccessControl();
// 建立允許「建立檔案/寫入資料」規則
var rule = new FileSystemAccessRule(
accountName,
FileSystemRights.CreateFiles | FileSystemRights.Write | FileSystemRights.DeleteSubdirectoriesAndFiles,
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
PropagationFlags.None,
AccessControlType.Allow);
dirSecurity.AddAccessRule(rule);
dirInfo.SetAccessControl(dirSecurity);
}
[RunInstaller(true)]
public partial class DbDeployInstaller : System.Configuration.Install.Installer
{
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
string targetDir = Context.Parameters["targetdir"]; // 取得安裝目錄
string dataFolder = Path.Combine(targetDir, "App_Data"); // 資料庫檔案資料夾
DisableSimpleFileSharing();
GrantFolderWriteAccess(dataFolder, "NETWORK SERVICE"); // IIS/SQL 常用帳號
// 後續附加資料庫邏輯...
}
// ... 上述兩個輔助方法 ...
}
| 帳號類型 | 適用場景 | 最小權限原則 |
|---|---|---|
| 專用網域服務帳號 | 企業網域環境、多伺服器叢集 | 僅授予資料/記錄/備份資料夾 Modify;無互動登入權限 |
| 虛擬帳號 (NT SERVICE\MSSQL$INST) | SQL Server 2012+ 獨立實例 | 自動管理、無密碼輪換、僅本機有效 |
| NETWORK SERVICE | 簡易部署、單機 IIS + SQL | 網路存取受限,資料夾授予 Modify 即可 |
| LOCAL SYSTEM | 測試/開發環境 | 權限過高,**生產禁用** |
:Z (SELinux) 或確保 UID/GID 映射正確 (Linux 容器)。附加後唯讀 = NTFS ACL 缺漏。手動修三步、自動化兩行 Code。生產環境請遵循最小權限、專用帳號、自動化部署三原則,徹底杜絕「裝完不能用」的尷尬。