创建本地用户和设置NTFS文件夹权限

初写随笔,如有不对请高手多指点

主要用于和IIS7结合实现域名注册,代替手工注册,可以google“helm4”,国外做的比较好的项目!

方法一

调用命令行实现创建本地用户和指定权限

1.创建本地用户 

语法:

net user [UserName [Password | *] [options] [/domain]
net user [UserName {Password | *} /add [options] [/domain]
net user [UserName [/delete] [/domain]

开始->运行->输入cmd->net user accounttry CHENj1234* /add

完成创建本地用户
2.给文件夹指定用户

2.1使用Caclsexe命令

Windows 2000/XP/Server 2003操作系统下都可以使用的命令,作用是显示或者修改文件的访问控制表,在命令中可以使用通配符指定多个文件,也可以在命令中指定多个用户。命令语法如下:
Cacls filename [/T] [/E] [/C] [/G usererm] [/R user [...]] [/P usererm [...]] [/D user [...]]
Filename:显示访问控制列表(以下简称ACL)
T:更改当前目录及其所有子目录中指定文件的ACL
/E:编辑ACL而不替换
/C:在出现拒绝访问错误时继续   
/G Userer:perm:赋予指定用户访问权限,Perm代表不同级别的访问权限,其值可以是R(读取)W(写入)C(更改,写入)F(完全控制)等。
/R user:撤销指定用户的访问权限,注意该参数仅在与“/E”一起使用时有效。
/P userperm:替换指定用户的访问权限,perm的含义同前,但增加了“N()”的选项。
/D user:拒绝指定用户的访问。
实例一:查看文件夹的访问控制权限 
例如,这里我们希望查看h:"temp文件夹的访问控制权限,那么只需要在“开始→运行”对话框或切换到命令提示符模式下,键入如下命令:
Cacls h:"temp
此时,我们会看到所有用户组和用户对h:"temp文件夹的访问控制权限项目,这里的CI表示ACE会由目录继承,OI表示ACE会由文件继承,IO表示ACI不适用于当前文件或目录,每行末尾的字母表示控制权限,例如F表示完全控制,C表示更改,W表示写入。

实例二:修改文件夹的访问控制权限
假如你希望给予本地用户wzj9999完全控制h:"temp文件夹及子文件夹中所有文件的访问权限,只需要键入如下命令:   
Cacls h:"temp /t /e /c /g wzj9999:f

Cacls C:"domains"domain.com"www /t /e /c /g chentry:f

Cacls C:"domains"domain.com"www /t /e /c /g chentry:r

 这里的“/t”表示修改文件夹及子文件夹中所有文件的ACL,“/e”表示仅做编辑工作而不替换,“/c”表示在出现拒绝访问错误时继续,而“/g wzj9999:f”表示给予本地用户wzj9999以完全控制的权限,这里的“f”代表完全控制,如果只是希望给予读取权限,那么应当是“r”。
实例三:撤销用户的访问控制权限 
如果你希望撤销wzj9999用户对h:"temp文件夹及其子文件夹的访问控制权限,可以键入如下命令:
cacls h:"temp /t /e /c /r wzj9999
如果只是拒绝用户的访问,那么可以键入如下命令:
cacls h:"temp /t /e /c /d wzj9999

2.2使用增强工具xcalsexe(这个我没去用过,有兴趣的朋友可以去试试)
windows 2000资源工具包中,微软还提供了一个名为xcacls.exe的文件控制权限修改工具,其功能较cacls.exe更为强大,可以通过命令行设置所有可以在windows资源管理器中访问到的文件系统安全选项,我们可以从http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/xcacls-o.asp下载,安装后即可使用。

xcacls.exe
命令的语法和参数与cacls.exe基本相同,但不同的是它通过显示和修改文件的访问控制列表(acl)执行此操作。在“/g”参数后除保持原有的perm权限外,还增加了spec(特殊访问权限)的选项,另外还增加了“/y”的参数,表示禁止在替换用户访问权限时出现确认提示,而默认情况下,cacls.exe是要求确认的,这样在批处理中调用cacls.exe命令时,程序将停止响应并等待输入正确的答案,引入“/y”参数后将可以取消此确认,这样我们就可以在批处理中使用xcacls.exe命令了。

实例一:查看文件或文件夹的权限
在“开始→运行”对话框或切换到命令提示符模式下,注意请事先将“c:"program files"resource kit”添加到“系统属性→高级→环境变量→系统变量”中,或者通过cd命令将其设置为当前路径,否则会提示找不到文件,然后键入如下命令:
xcacls h:"temp
此时,我们会看到图2所示的窗口,这里可以查看到所有用户组或用户对h:"temp文件夹的访问控制权限,io表示此ace不应用于当前对象,ci表示从属窗口将继承此aceoi表示从属文件将继承该acenp表示从属对象不继续传播继承的ace,而每行末尾的字母表示不同级别的权限,例如f表示完全控制,c表示更改,w表示写入。 

实例二:替换文件夹中的acl而不确认
xcacls h:"temp /g administrator:rw/y
以上命令将替换h:"temp文件夹中所有文件和文件夹的acl,而不扫描子文件夹,也不会要求用户确认。 实例三:赋予某用户对文件夹的控制权限
xcacls h:"temp /g wzj9999:rwed;rw /e
以上命令将赋予用户wzj9999h:"temp文件夹中所有新建文件的读取、写入、运行和删除权限,但需要说明的是,这条命令只是赋予了用户对文件夹本身的读写权限,而不包括子文件夹下的文件。
对普通用户来说,cals.exexcacls.exe的作用可能不是那么明显,这在windows 2000/xp/server 2003的无人值守安装中特别有用,管理员可以为操作系统所在的文件夹设置初始访问权限;在将软件分发到服务器或工作站时,还可以借助xcacls.exe提供单步保护,以防止用户误删除文件夹或文件。

 以上转载的出处我也忘记了没办法写上了,在此先注明。

 

方法2

使用ADSI实现,先下载安装ADSI2.5 SDK(windows server 2008系统上有些区别,我是在08上做的,XP上也实现)

创建用户

          //创建新目录项
            DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");

            //向目录树添加目录项
            DirectoryEntry NewUser = AD.Children.Add("chenjiangtry", "user");
            NewUser.Properties["FullName"].Add("chenjiangtryadd");
            //设置新用户帐户的密码和说明
            //Invoke  对本机 Active Directory 对象调用方法。 
            NewUser.Invoke("SetPassword", new object[] { "#12345Abc" });
            NewUser.InvokeSet("Description", new object[] { "chenjiang add description" });
            NewUser.CommitChanges();
            //将帐户添加到组
            DirectoryEntry grp;
            grp = AD.Children.Find("Guests", "group");
            if (grp != null)
            {
                grp.Invoke("Add", new object[]
                    {
                        NewUser.Path.ToString()
                    }
                );
            }

            MessageBox.Show("帐户创建成功");

 

设置文件夹权限

(若遇到问题请看解决:对COM 组件的调用返回了错误 HRESULT E_FAIL

要生成示例应用程序, 请按照下列步骤操作: 1. 启动 MicrosoftVisualStudio.NET 或 Microsoft Visual Studio 2008。

2. 在 文件 菜单上, 单击 新建 , 并单击 项目 。

3. 在 VisualC # 项目 , 单击 Windows 应用程序 模板 下。

注意 除了 Visual Studio 2008、 VisualC # 项目 更改为 VisualC # 。

4. 在 名称 框中, 键入 NTFSPermissions , 然后单击 确定 。

5. 将 Button 控件添加到窗体 Form 1。

6. 在 项目 菜单, 单击 添加引用 。

7. 单击 COM 选项卡, 单击以选中下列项目, 并单击 确定 : • 活动 DS 类型库

• ADsSecurity 2.5 类型库

8. 右击 Form 1 窗体, 然后单击 查看代码 。

9. 将下列 使用 语句添加到窗体 Form 1 中源代码顶部。using ADSSECURITYLib;

using ActiveDs;

10. 将以下方法添加到 Form 1 类。public void SetPermissions(String vPath, String UserName )

{

ADsSecurity objADsSec;

SecurityDescriptor objSecDes;

AccessControlList objDAcl;

AccessControlEntry objAce1;

AccessControlEntry objAce2;

Object objSIdHex;

ADsSID objSId;

objADsSec = new ADsSecurityClass();

objSecDes = (SecurityDescriptor) (objADsSec.GetSecurityDescriptor("FILE://" + vPath));

objDAcl = (AccessControlList)objSecDes.DiscretionaryAcl;

objSId = new ADsSIDClass();

objSId.SetAs((int)ADSSECURITYLib.ADS_SID_FORMAT.ADS_SID_SAM, UserName.ToString());

objSIdHex = objSId.GetAs((int)ADSSECURITYLib.ADS_SID_FORMAT.ADS_SID_SDDL);

// Add a new access control entry (ACE) object (objAce) so that the user has Full Control permissions on NTFS file system files.

objAce1 = new AccessControlEntryClass();

objAce1.Trustee = (objSIdHex).ToString();

objAce1.AccessMask = (int)ActiveDs.ADS_RIGHTS_ENUM.ADS_RIGHT_GENERIC_ALL;

objAce1.AceType = (int)ActiveDs.ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_ALLOWED;

objAce1.AceFlags = (int)ActiveDs.ADS_ACEFLAG_ENUM.ADS_ACEFLAG_INHERIT_ACE | (int)ActiveDs.ADS_ACEFLAG_ENUM.ADS_ACEFLAG_INHERIT_ONLY_ACE | 1;

objDAcl.AddAce(objAce1);

// Add a new access control entry object (objAce) so that the user has Full Control permissions on NTFS file system folders.

objAce2 = new AccessControlEntryClass();

objAce2.Trustee = (objSIdHex).ToString();

objAce2.AccessMask = (int)ActiveDs.ADS_RIGHTS_ENUM.ADS_RIGHT_GENERIC_ALL;

objAce2.AceType = (int)ActiveDs.ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_ALLOWED;

objAce2.AceFlags = (int)ActiveDs.ADS_ACEFLAG_ENUM.ADS_ACEFLAG_INHERIT_ACE | 1;

objDAcl.AddAce(objAce2);

objSecDes.DiscretionaryAcl = objDAcl;

// Set permissions on the NTFS file system folder.

objADsSec.SetSecurityDescriptor(objSecDes,"FILE://" + vPath);

}

11. 单击要切换回设计模式 1 .cs [ Design ] 选项卡。

12. 双击 button1 。 用以下代码替换 button 1 _ Click 事件代码。 private void button1_Click(object sender, System.EventArgs e)

{

try

{

// Set <Domain> to your domain name.

// Set <UserName> to the user account.

SetPermissions("C:""Test", "<Domain>""<UserName>");

MessageBox.Show("Full Access control granted.");

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

}

注意 替换 < 域 > 以域名。 将 < UserName > 替换为要向其授予权限用户名称。

13. 在 生成 菜单上, 单击 BuildSolution@@@ 。

回到顶端

测试示例应用程序

1. 驱动器 C 根文件夹中创建一个文件夹。 命名 Test 文件夹。

2. 在 WindowsExplorer, 右击 Test 文件夹, 并单击 属性 。

3. 测试属性 对话框中, 单击 安全 选项卡。

4. 选择用于运行此测试域帐户。 如果未列出帐户, 单击 添加 , 然后域帐户添加到列表。

5. 在 权限 , 单击以清除 完全控制 复选框来限制对 Test 文件夹为此用户权限。 然后, 单击 确定 。

6. 运行 NTFSPermission.exe 应用程序。 默认情况下, 将显示 Form 1 。

7. 单击 button 1 。 您收到以下消息:

授予完全访问控制。

8. 单击 确定 以关闭消息框。

9. 关闭窗体以退出应用程序。

10. 在 WindowsExplorer, 打开 C:" 文件夹。

11. 右击 Test 文件夹, 然后单击 属性 。

12. 测试属性 对话框中, 单击 安全 选项卡。

13. 选择用于您正在运行此测试, 并验证对 Test 文件夹权限域帐户。

指定用户现在对 Test 文件夹具有完全控制权限。

回到顶端

参考

有关详细信息, 请单击下列文章编号, 查看 Microsoft 知识库文章中文章:

279682 (http://support.microsoft.com/kb/279682/) 如何使用 ADsSecurity.dll 来将访问控制项添加到 NTFS 文件夹

266461 (http://support.microsoft.com/kb/266461/) 如何使用 ADSI 来设置自动继承的文件 / 文件夹权限

posted @ 2008-12-27 12:28  jisuanji110  阅读(5113)  评论(0编辑  收藏  举报