关于Win2K设置目录和文件所有者(SetFileSecurity)的问题! ( 积分: 300 )

  • 主题发起人 主题发起人 zheng
  • 开始时间 开始时间
Z

zheng

Unregistered / Unconfirmed
GUEST, unregistred user!
请看如下代码: 可以成功执行,但有缺陷<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br> &nbsp;SD: SECURITY_DESCRIPTOR;<br> &nbsp;pUserSID, pGroupSID: Pointer;<br> &nbsp;szDomain: PChar;<br> &nbsp;snuType: SID_NAME_USE;<br> &nbsp;cbSID: DWORD;<br> &nbsp;cbDomain: DWORD;<br>begin<br> &nbsp;if InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION) then<br> &nbsp; &nbsp;ShowMessage('Initialize ok')<br> &nbsp;else<br> &nbsp; &nbsp;ShowMessage('Initialize failed');<br><br> &nbsp;cbDomain := 80;<br> &nbsp;cbSID := 1024;<br> &nbsp;pUserSID := AllocMem(cbSID);<br> &nbsp;szDomain := AllocMem(cbDomain);<br> &nbsp;if LookupAccountName(nil, 'administrator', pUserSID, cbSID, szDomain, cbDomain, snuType) then<br> &nbsp; &nbsp;ShowMessage('LookupAccountName:User ok')<br> &nbsp;else<br> &nbsp; &nbsp;ShowMessage('LookupAccountName:User failed');<br><br> &nbsp;if SetSecurityDescriptorOwner(@SD, pUserSID, False) then<br> &nbsp; &nbsp;ShowMessage('SetSecurityOwner:User ok')<br> &nbsp;else<br> &nbsp; &nbsp;ShowMessage('SetSecurityOwner:User failed');<br><br> &nbsp;cbDomain := 80;<br> &nbsp;cbSID := 1024;<br> &nbsp;pGroupSID := AllocMem(cbSID);<br> &nbsp;szDomain := AllocMem(cbDomain);<br> &nbsp;if LookupAccountName(nil, 'administrators', pGroupSID, cbSID, szDomain, cbDomain, snuType) then<br> &nbsp; &nbsp;ShowMessage('LookupAccountName:Group ok')<br> &nbsp;else<br> &nbsp; &nbsp;ShowMessage('LookupAccountName:Group failed');<br><br> &nbsp;if SetSecurityDescriptorGroup(@SD, pGroupSID, False) then<br> &nbsp; &nbsp;ShowMessage('SetSecurityGroup ok')<br> &nbsp;else<br> &nbsp; &nbsp;ShowMessage('SetSecurityGroup failed');<br><br> &nbsp;if SetFileSecurity('C:/文件夹', OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION, @SD) then<br> &nbsp; &nbsp;ShowMessage('SetFileSecurity ok')<br> &nbsp;else<br> &nbsp; &nbsp;ShowMessage('SetFileSecurity failed');<br>end;<br><br>我的问题是:但用系统管理员登录,而且对该目录拥有的权限正常的话,可以成功修改该目录的所有者,但如果对该目录的权限进行限制,连系统管理员都不能访问,即点击“安全”页,连管理员都会提示:“您无权查看或编辑目前 文件夹 的权限设置;但是,您可以取得所有权或更改审核设置”。在这样的情况下,执行上面的代码更改所有者就会失败。但是我用系统内置的“文件夹”属性功能--&gt;“高级”却可以成功的将此目录的所有者更改,进而重新对该目录的权限重新设置。为什么系统功能可以做到,而我上面的代码就失败呢。<br><br>其实我这段代码就是为了实现,不小心修改错了某个目录的权限,结果连管理员都不能访问,并且也无法显示该目录的当前所有者的情况下,重新修改该目录的权限,使用户能够恢复正常访问,尽管系统的文件夹功能能够通过一定的方法实现,既从“高级”中重新设置所有者,然后在重新修改权限,但系统功能只能一个个来,如果目录下的文件多的话,非常费时费力,特别是在Win2003中对目录下的文件不能批量设置,只能一次一个,所以希望用代码实现批量设置。<br><br>请熟悉Windows内核功能的行家帮我解释解释。最好能指出我的代码的不足,使我能够完善并实现上面的需求。<br><br>如果确实不行,如果有其他第三方的软件可以实现,这分也可以给他。三百分可不容易赚的呀。
 
请看如下代码: 可以成功执行,但有缺陷<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br> &nbsp;SD: SECURITY_DESCRIPTOR;<br> &nbsp;pUserSID, pGroupSID: Pointer;<br> &nbsp;szDomain: PChar;<br> &nbsp;snuType: SID_NAME_USE;<br> &nbsp;cbSID: DWORD;<br> &nbsp;cbDomain: DWORD;<br>begin<br> &nbsp;if InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION) then<br> &nbsp; &nbsp;ShowMessage('Initialize ok')<br> &nbsp;else<br> &nbsp; &nbsp;ShowMessage('Initialize failed');<br><br> &nbsp;cbDomain := 80;<br> &nbsp;cbSID := 1024;<br> &nbsp;pUserSID := AllocMem(cbSID);<br> &nbsp;szDomain := AllocMem(cbDomain);<br> &nbsp;if LookupAccountName(nil, 'administrator', pUserSID, cbSID, szDomain, cbDomain, snuType) then<br> &nbsp; &nbsp;ShowMessage('LookupAccountName:User ok')<br> &nbsp;else<br> &nbsp; &nbsp;ShowMessage('LookupAccountName:User failed');<br><br> &nbsp;if SetSecurityDescriptorOwner(@SD, pUserSID, False) then<br> &nbsp; &nbsp;ShowMessage('SetSecurityOwner:User ok')<br> &nbsp;else<br> &nbsp; &nbsp;ShowMessage('SetSecurityOwner:User failed');<br><br> &nbsp;cbDomain := 80;<br> &nbsp;cbSID := 1024;<br> &nbsp;pGroupSID := AllocMem(cbSID);<br> &nbsp;szDomain := AllocMem(cbDomain);<br> &nbsp;if LookupAccountName(nil, 'administrators', pGroupSID, cbSID, szDomain, cbDomain, snuType) then<br> &nbsp; &nbsp;ShowMessage('LookupAccountName:Group ok')<br> &nbsp;else<br> &nbsp; &nbsp;ShowMessage('LookupAccountName:Group failed');<br><br> &nbsp;if SetSecurityDescriptorGroup(@SD, pGroupSID, False) then<br> &nbsp; &nbsp;ShowMessage('SetSecurityGroup ok')<br> &nbsp;else<br> &nbsp; &nbsp;ShowMessage('SetSecurityGroup failed');<br><br> &nbsp;if SetFileSecurity('C:/文件夹', OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION, @SD) then<br> &nbsp; &nbsp;ShowMessage('SetFileSecurity ok')<br> &nbsp;else<br> &nbsp; &nbsp;ShowMessage('SetFileSecurity failed');<br>end;<br><br>我的问题是:但用系统管理员登录,而且对该目录拥有的权限正常的话,可以成功修改该目录的所有者,但如果对该目录的权限进行限制,连系统管理员都不能访问,即点击“安全”页,连管理员都会提示:“您无权查看或编辑目前 文件夹 的权限设置;但是,您可以取得所有权或更改审核设置”。在这样的情况下,执行上面的代码更改所有者就会失败。但是我用系统内置的“文件夹”属性功能--&gt;“高级”却可以成功的将此目录的所有者更改,进而重新对该目录的权限重新设置。为什么系统功能可以做到,而我上面的代码就失败呢。<br><br>其实我这段代码就是为了实现,不小心修改错了某个目录的权限,结果连管理员都不能访问,并且也无法显示该目录的当前所有者的情况下,重新修改该目录的权限,使用户能够恢复正常访问,尽管系统的文件夹功能能够通过一定的方法实现,既从“高级”中重新设置所有者,然后在重新修改权限,但系统功能只能一个个来,如果目录下的文件多的话,非常费时费力,特别是在Win2003中对目录下的文件不能批量设置,只能一次一个,所以希望用代码实现批量设置。<br><br>请熟悉Windows内核功能的行家帮我解释解释。最好能指出我的代码的不足,使我能够完善并实现上面的需求。<br><br>如果确实不行,如果有其他第三方的软件可以实现,这分也可以给他。三百分可不容易赚的呀。
 
这个归跟到底还是权限问题!<br>我推荐你个办法吧!<br>把你这个东西写成两个程序<br>一个为界面程序<br>一个为服务!<br>服务在用户未登陆前以 SYSTEM 权限登陆<br>用户界面通过消息操作服务 使程序以SYSTEM权限操作文件夹!
 
后退
顶部