2012-04-10 45 views
1

讓我問你是否可以製作一個C#程序,該程序不能訪問除安裝文件夾/子文件夾以外的任何本地文件系統?如果答案是肯定的。 有關詳細信息,如果有必要並且可能,用戶應該接受程序在特殊用戶帳戶下運行,該用戶帳戶僅限於文件訪問權限,僅限安裝文件夾和子文件夾。您可以製作一個C#程序,該程序不能訪問除安裝文件夾以外的任何本地文件系統?

非常感謝您提前。

編輯:讓我添加上下文。我希望用戶不要更改他們的帳戶。作爲一名程序員,由於某些原因,我無法完全控制程序。

+2

是的,但那是操作系統和網絡權限的功能。它與你的程序無關。 – 2012-04-10 14:42:11

+1

作爲一名程序員,您是否應該能夠控制您的程序正在調用或訪問哪些文件?例如,如果它是文本編輯器,則可以檢查它是否只能打開或保存該文件路徑目錄中的文件。 – jzworkman 2012-04-10 14:45:07

+0

一般來說,如果您顯示文件/打開對話框,用戶可以導航到他們有權限的任何地方。當然,你可以拒絕任何不符合你的期望的路徑,甚至建立一個自定義文件/打開對話框,但到底是什麼? – 2012-04-10 14:47:05

回答

9

您可以製作一個C#程序,該程序不能訪問除安裝它的目錄以外的本地文件系統的任何部分?

不,因爲每個C#程序至少需要訪問Windows運行時庫,它們位於Windows安裝目錄中。

我給你的建議是你看看隔離存儲。 .NET代碼訪問安全系統使您能夠設置一個策略,其中規定某些程序只能訪問.NET運行時,代碼的安裝位置以及一個特殊的「隔離存儲」目錄,可用於應用程序來存儲每個用戶的數據。

1

答案是肯定的,但如何做到這一點很複雜。

首先,您需要一個權限極其有限的用戶帳戶。它必須能夠訪問文件並在程序的安裝目錄中運行程序,這就是它。您可以使用System.DirectoryServices命名空間中的工具,使用安裝程序創建這樣的用戶。以下是創建一個用戶的例子:

using System.DirectoryServices; 
using System.DirectoryServices.ActiveDirectory; 
private void CreateUser(string userName, string password) 
{ 
DirectorySearcher dseSearcher = new DirectorySearcher(); 
string rootDSE = dseSearcher.SearchRoot.Path; 
string userDSE = rootDSE.Insert(7, "OU=Users,"); 
DirectoryEntry userDE = new DirectoryEntry(userDSE); 
DirectoryEntry user = userDE.Children.Add("CN=" + userID, "user"); 
staff.Properties["samAccountName"].Value = userID; 
staff.Properties["UserPrincipalName"].Value = userName + 
@"@domain"; 
staff.CommitChanges(); 
staff.Properties["userAccountControl"].Value = 
ActiveDs.ADS_USER_FLAG.ADS_UF_NORMAL_ACCOUNT | 
ActiveDs.ADS_USER_FLAG.ADS_UF_DONT_EXPIRE_PASSWD; 
staff.CommitChanges(); 
staff.Invoke("SetPassword", new Object[] { password }); 
} 

現在,一旦發生的事情,你需要確保你的程序通常在該用戶帳戶的上下文中運行。您可以通過指定用戶帳戶在ProcessStartInfo對象中運行該程序來執行此操作,該對象由您爲其創建快捷方式的「引導程序」程序使用。然後,您還可以使用Environment.CurrentUser確保程序在該用戶帳戶的上下文中運行,並在該程序正在由更寬容的帳戶運行時中止該程序的執行。

相關問題