让我问你是否可以制作一个不能访问除了它安装的文件夹/子文件夹之外的任何本地文件系统的 C# 程序?如果答案是肯定的。有关详细信息,如果有必要和可能,用户应该接受在特殊用户帐户下运行的程序,该用户帐户将文件访问限制为仅对其安装的文件夹和子文件夹的访问。
非常感谢您提前。
编辑:让我添加上下文。我希望用户不要更改他们的帐户。作为一名程序员,由于某些原因,我无法完全控制程序。
让我问你是否可以制作一个不能访问除了它安装的文件夹/子文件夹之外的任何本地文件系统的 C# 程序?如果答案是肯定的。有关详细信息,如果有必要和可能,用户应该接受在特殊用户帐户下运行的程序,该用户帐户将文件访问限制为仅对其安装的文件夹和子文件夹的访问。
非常感谢您提前。
编辑:让我添加上下文。我希望用户不要更改他们的帐户。作为一名程序员,由于某些原因,我无法完全控制程序。
你可以制作一个 C# 程序,它不能访问本地文件系统的任何部分,除了它的安装目录吗?
不,因为每个 C# 程序至少都需要访问 Windows 安装目录中的 .NET 运行时库。
我给你的建议是你研究一下隔离存储。.NET 代码访问安全系统使您能够设置策略,该策略规定某些程序只能访问 .NET 运行时、代码的安装位置以及可用于应用程序的特殊“隔离存储”目录存储每个用户的数据。
答案是肯定的,但是如何做到这一点很复杂。
首先,您需要一个权限极其有限的用户帐户。它必须能够访问程序安装目录中的文件并运行程序,仅此而已。您可以使用 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 确保程序在该用户帐户的上下文中运行,如果程序由任何更多许可的帐户运行,则中止程序的执行。
如果您只想将程序限制为特定帐户,则可以查找用户的凭据,如果不正确则退出程序。
http://msdn.microsoft.com/en-us/library/csyx45b8.aspx
http://msdn.microsoft.com/en-us/library/sfs49sw0.aspx