2015-05-15 84 views
0

我需要製作一個程序,用於從文本文件中讀取數據,並根據文本文件中的特定數據更改程序狀態,其中我的程序需要讀取,寫入和讀取權限創建一個文本文件。防止用戶刪除,修改,分機

我希望防止用戶或其他軟件刪除,修改或複製文件。我將如何開始實施這個?

+6

嘗試詳細說明,顯示一些樣本等。現在你完全不清楚你在問什麼,你的問題是什麼。 –

+0

讓我改述一下,以確保我明白:您的軟件從配置文件中讀取數據,並且要確保沒有人篡改該文件。那是對的嗎? –

+0

我想他是在找那個安德烈。你到現在爲止嘗試過什麼? – Gino

回答

0

您可以通過三種方式實現這一目標:

1)一旦應用程序開始讓你的文件句柄,並鎖定該文件。如果應用程序始終運行(例如作爲服務),這當然只能工作

2)調整文件安全性選項卡中的權限並將其設置爲只讀。爲寫入權限創建技術用戶(在域中最佳)。在使用impersionation(WindowsImpersonationContext)時,用技術用戶在程序中打開文件。使用將是簡單:

using (new Impersonation(domain, username, password)) 
{ 
    // do whatever you want 
} 

樣品類,將讓你一個WindowsImpersonationContext(應該像一個魅力):

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")] 
public class Impersonation : IDisposable 
{ 
    private readonly SafeTokenHandle _handle; 
    private readonly WindowsImpersonationContext _context; 

    const int LOGON32_LOGON_NEW_CREDENTIALS = 9; 

    public Impersonation(string domain, string username, string password) 
    { 
     var ok = LogonUser(username, domain, password, 
         LOGON32_LOGON_NEW_CREDENTIALS, 0, out this._handle); 
     if (!ok) 
     { 
      var errorCode = Marshal.GetLastWin32Error(); 
      throw new ApplicationException(string.Format("Could not impersonate the elevated user. LogonUser returned error code {0}.", errorCode)); 
     } 

     this._context = WindowsIdentity.Impersonate(this._handle.DangerousGetHandle()); 
    } 

    public void Dispose() 
    { 
     this._context.Dispose(); 
     this._handle.Dispose(); 
    } 

    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
    private static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, out SafeTokenHandle phToken); 

    public sealed class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid 
    { 
     private SafeTokenHandle() 
      : base(true) { } 

     [DllImport("kernel32.dll")] 
     [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
     [SuppressUnmanagedCodeSecurity] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     private static extern bool CloseHandle(IntPtr handle); 

     protected override bool ReleaseHandle() 
     { 
      return CloseHandle(handle); 
     } 
    } 
} 

的另一種嘗試(包括使用)如下所示:Open a shared file under another user and domain?

3)顯然作爲擁有訪問權限的其他用戶運行該程序 - 所有其他用戶擁有隻讀權限(在註冊爲服務或使用runas/user命令時使用技術用戶)

+0

好的會嘗試謝謝 – naheiwProg

0

您可以使用特定訪問條件(https://msdn.microsoft.com/de-de/library/s67691sb(v=vs.110).aspx)打開文件。 如果您在此拒絕特權,應用程序將無法修改數據。 爲了清楚說明,您的應用程序訪問權限是隻讀的,您無法對其進行修改。

防止其他應用程序或用戶刪除/修改/無論您的文本文件在C#中是不可能的。您可以限制文件系統中的權限,但僅此而已。

如果這很重要,那麼你應該重新考慮你的實現。 C#在您的應用程序配置中提供了實例或應用程序特定參數的資源文件。