我想在本地将一个文件夹共享给某个指定的用户,应该用哪些api处理(windows 2000中)?
例如:文件夹名C:\test,本机创建又一个用户名为pc01,在用api NetShareAdd()创建共享时,系统默认的用户是everyone,现在我要将everyone去掉然后改成pc01,要用哪些api函数?
注意:我是要在文件夹的属性--共享--权限那个窗口中将everyone去掉然后增加用户pc01
例如:文件夹名C:\test,本机创建又一个用户名为pc01,在用api NetShareAdd()创建共享时,系统默认的用户是everyone,现在我要将everyone去掉然后改成pc01,要用哪些api函数?
注意:我是要在文件夹的属性--共享--权限那个窗口中将everyone去掉然后增加用户pc01
不用api的
windows自带的一个函数就可以
cacls C:\test /d everyone
1,cacls 只能用于ntfs的中文件夹的“安全属性”,而我要的是在fat32和ntfs中都可以的
2,cacls 只是禁用everyone帐号,而我要的是将这个帐号去掉,再新增一个帐号
3,最重要的一点是我要的并不是在文件夹“安全属性”中设置,而是在文件夹的“共享”属性那里 设置权限
很感谢你能多次给我帮助,但是问题还是没有进展!不知道是不是真的没有办法做到公司所要的结果
还有就是在用cacls时,总是会需要你确认,怎么才能在程序中不弹出一个doc确认窗口
With si2
.shi2_netname = lngNetname
.shi2_path = lngPath
.shi2_re = lngRe
.shi2_type = STYPE_DISKTREE
.shi2_permissions = ACCESS_ALL
.shi2_max_uses = -1
.shi2_passwd = lngPw
End With
没有相关用户信息的
filename 显示 ACL。
/T 更改当前目录及其所有子目录中指定文件的 ACL。
/E 编辑 ACL 而不替换。
/C 在出现拒绝访问错误时继续。
/G user:perm 赋予指定用户访问权限。
Perm 可以是: R(读取);W(写入);C(更改、写入);F(完全控制)。
/R user 撤销指定用户的访问权限(仅在与 /E 一起使用时合法)。
/P user:perm 替换指定用户的访问权限。
Perm 可以是: N(无);R(读取);W(写入);C(更改、写入);F(完全控制)。
/D user 拒绝指定用户的访问。
在命令中可以使用通配符指定多个文件,也可以指定多个用户。
说明:ACL——访问控制列表;ACE——访问控制权限;CI——容器继承;ACE 会由目录继承;OI ——对象继承,ACE 会由文件继承;IO——只继承,ACE 不适用于当前文件/目录。
那么究竟应该怎么使用此命令呢?下面我们来看几个实例。
实例一:查看文件夹的访问权限
我们希望查看D:\student\u01文件夹的访问控制权限,那么只需在命令行模式下键入如下命令:
cacls D:\student\u01
屏幕显示:
d:\student\user01 BUILTIN\Administrators:(OI)(CI)F
STUDENTS\u01:(OI)(CI)C
此时,我们会看到所有用户组和用户对D:\student\u01文件夹的访问控制权限项目,例如F表示完全控制,C表示更改,W表示写入。
实例二:修改文件夹的访问权限
假如你希望给予本地用户u01完全控制D:\student\ u01文件夹及子文件夹中所有文件的访问权限,只需要输入如下命令:
cacls D:\student\u01 /T /E /C /P u01:F
这里的“/T”表示修改文件夹及子文件夹中所有文件的ACL;“/E”表示仅做编辑工作而不替换,也就是说对文件夹原有的权限设置不作替换;“/C”表示在出现拒绝访问错误时继续;而“/P u01:F”表示给予本地用户u01以完全控制的权限;“F”代表完全控制。如果只是希望给予本地用户u01读取权限,那么应当将“F”改为“R”。注意:在Cacls命令行中使用的参数必须要用大写字母,否则会造成命令行参数返回错误的信息。
实例三:撤销用户的访问权限
如果你希望撤销u01用户对D:\student\u01文件夹及其子文件夹的访问控制权限,可以输入如下命令:
cacls D:\student\u01 /T /E /C /R u01
现以我校某机房为例,说明通过使用Cacls命令进行文件夹与磁盘读写操作的设置。该机房共有计算机58台,每台计算机中都建有10个学生用户(分别为uxx,其中xx为从01到10的数字)和一个教师用户teacher。每个班级分配到一个账号,每台计算机分别有C、D、E三个逻辑分区,并且在E分区下建有stud文件夹,在此文件夹中建有10个子文件夹uxx(xx为从01到10的数字)。本学期将有8个班级在该机房上机,其中有3个班级要使用3DMAX软件,该软件要求对C分区拥有写的权限,也就是说使用这3个账号的用户要对C盘拥有写的权利,其余用户对C盘只给予读的权限。用户具体权限如下表所示(因u4-u10用户权限类似,表中只列出u01至u04用户的访问控制)。
具体实现:
1. 使用net users和net group建立Students用户组,u01-u10用户均属于为Students用户组,Teacher用户为“管理员”组。
2. 根据上表各用户权限要求,使用文本编辑器编辑批处理文件,内容如下:
cacls C:\ /T /E /C /P Administrators:F
cacls D:\ /T /E /C /P Administrators:F
cacls E:\ /T /E /C /P Administrators:F
cacls C:\ /T /E /C /P Students:R
cacls C:\ /T /E /C /P u01:W
cacls C:\ /T /E /C /P u02:W
cacls C:\ /T /E /C /P u03:W
cacls D:\ /T /E /C /P Students:R
cacls E:\ /T /E /C /P Students:R
cacls E:\student /E /C /P Students:R
cacls E:\student\u01/T /E /C /P u01:C
cacls E:\student\u02/T /E /C /P u02:C
cacls E:\student\u03/T /E /C /P u03:C
cacls E:\student\u04/T /E /C /P u04:C
……
(其他用户文件的访问权限以此类推。)
3. 将批处理文件分发到每台计算机上并分别运行,每台计算机的用户访问权限就可以在瞬间设置完毕。原来要做一天的工作,现在只要几十分钟就可以全部完成了。
综上所述,我们可以发现,利用命令行模式结合批处理命令,可以避免机房管理中大量的重复劳动。如果能够合理使用net user、net group、Cacls等Windows2000自带的命令行用户管理命令的话,无疑使得像建立用户、添加用户组、更改密码、设置文件访问权限等繁琐的工作变得非常轻松。□(
http://www.zjedu.org/xdjyjs/118/9229.htm你用Cacls命令还更容易点
这二个模组说明如下:
Public Function CreateShare _ ' 建立共享模组
(ByVal sSharePath As String, _ ' 完整路径
ByVal sShareName As String, _ ' 共享名称
ByVal sRe As String, _ ' 说明
ByVal sROPass As String, _ ' 只读密码
ByVal sRWPass As String) As Long ' 完整存取密码 Public Function DeleteShare _ ' 取消共享模组
(ByVal sShareName As String) As Long ' 共享名称呼叫范例如下:Private Sub Command1_Click()
' 建立共享 CDISK
CreateShare "C:\", "CDISK", " 磁盘", "JWHR", "JWHRW"
End SubPrivate Sub Command2_Click()
' 取消共享 CDISK
DeleteShare "CDISK"
End Sub
注:就像一般教人家做坏事的书或电视节目一样,我也要声明一下:
注:以上方式请用于正途 (系统需要),请勿使用以上方法来不当窃取不该看的文件!
Following code is just for winnt/2000:Public Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Public Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
'Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Const HEAP_ZERO_MEMORY = &H8
Public Const LM20_NNLEN = 12Public Type wshare_info_1 'USE FOR WIN98
shi1_netname(13) As Byte
shi1_pad1 As Byte
shi1_type As Integer
shi1_re As Byte
End Type
Public Type Share_Info_1 'Use for WINNT/2000
shi1_netname As Long
shi1_type As Long
shi1_re As Long
End TypePublic Type SHARE_INFO_2
shi2_netname As Long
shi2_type As Long
shi2_re As Long
shi2_permissions As Long
shi2_max_uses As Long
shi2_current_uses As Long
shi2_path As Long
shi2_passwd As Long
End TypePublic Type MungeLong
x As Long
dummy As Integer
End TypePublic Type MungeInt
XLo As Integer
XHi As Integer
dummy As Integer
End Type
Public Const WM_SETTEXT = &HCPublic Const ERROR_SUCCESS = 0
Public Const ERROR_ACCESS_DENIED = 5&
Public Const ERROR_MORE_DATA = 234
Public Const ERROR_NO_SUCH_ALIAS = 1376&
Public Const STYPE_DISKTREE = 0
Public Const STYPE_PRINTQ = 1
Public Const STYPE_DEVICE = 2
Public Const STYPE_IPC = 3
Option Explicit'Add a Net Share resource
Private Sub CmdAddShare_Click()
Dim strPath As String, strShare As String, nPtrShare As Long
Dim SParray() As Byte, sSarray() As Byte, retVal As LongDim nPtrNetName As Long, nPtrPath As Long, nHandleHeap As Long
nHandleHeap = GetProcessHeap()
If nHandleHeap = 0 Then Exit Sub
strPath = Me.Dir1.Path
strShare = StrConv(Right(strPath, Len(strPath) - InStrRev(strPath, "\")),vbUnicode)
strPath = StrConv(Me.Dir1.Path, vbUnicode)
nPtrNetName = HeapAlloc(nHandleHeap, HEAP_ZERO_MEMORY, LenB(strShare) + 1)
nPtrPath = HeapAlloc(nHandleHeap, HEAP_ZERO_MEMORY, LenB(strPath) + 1)
If IsNull(nPtrNetName) Or IsNull(nPtrPath) Then Exit Sub
lstrcpyW ByVal nPtrPath, ByVal strPath
lstrcpyW ByVal nPtrNetName, ByVal strShare
Dim i As Integer
Dim buf(1 To 32) As Byte
For i = 1 To 32
buf(i) = 0
Next
Dim x As Long
Dim tdfShare_Info As SHARE_INFO_2
tdfShare_Info.shi2_netname = nPtrNetName
tdfShare_Info.shi2_type = 0
tdfShare_Info.shi2_re = 0
tdfShare_Info.shi2_permissions = &HFF
tdfShare_Info.shi2_max_uses = -1
tdfShare_Info.shi2_current_uses = 0
tdfShare_Info.shi2_path = nPtrPath
tdfShare_Info.shi2_re = 0retVal = NetShareAdd(ByVal 0, 2, tdfShare_Info, ByVal 0)
HeapFree nHandleHeap, 0, ByVal nPtrPath
HeapFree nHandleHeap, 0, ByVal nPtrNetName
CloseHandle nHandleHeap
CmdEnum_Click
End Sub'Delete Net Share Resource
Private Sub CMDDeleteShare_Click()
Dim strShareRes As String, retVal As Long
strShareRes = StrConv(Trim(List1.Text), vbUnicode)
retVal = NetShareDel(ByVal 0, strShareRes, 0)
CmdEnum_Click
End Sub'Enum Net share resource
Private Sub CmdEnum_Click()
Me.List1.Clear
Dim strNetShareName As String, strNetShareRe As String, nShareType As Long
Dim nLevel As Long
Dim result As Long, bufptr As Long, entriesread As Long, totalentries As Long, resumehandle As Long, BufLen As Long, _
DNArray() As Byte, SNArray(99) As Byte, UNArray() As Byte, _
SName As String, i As Integer, UNPtr As Long, _
TempPtr As MungeLong, TempStr As MungeIntBufLen = -1 ' Buffer size
resumehandle = 0 ' Start with the first entry
nLevel = 1
Doresult = NetShareEnum(ByVal 0, nLevel, bufptr, BufLen, entriesread, totalentries, resumehandle)
If result <> ERROR_SUCCESS And result <> ERROR_MORE_DATA Then
MsgBox ("Error " & result & " enumerating share " & entriesread & " of " & totalentries)
Exit Sub
End If
Dim j As Long
For i = 1 To entriesread
' Get pointer to string from beginning of buffer
' Copy 4 byte block of memory each time
j = (i - 1) * 3result = PtrToInt(TempPtr.x, bufptr + j * 4, 4)
result = PtrToStr(SNArray(0), TempPtr.x)
strNetShareName = Left(SNArray, StrLen(TempPtr.x))result = PtrToInt(TempPtr.x, bufptr + (j + 1) * 4, 4)
nShareType = TempPtr.xresult = PtrToInt(TempPtr.x, bufptr + (j + 2) * 4, 4)
result = PtrToStr(SNArray(0), TempPtr.x)
strNetShareRe = Left(SNArray, StrLen(TempPtr.x))
List1.AddItem strNetShareNameNext iresult = NetApiBufferFree(bufptr)
Loop Until entriesread = totalentriesEnd Sub使用shell命令:(测试环境:NT4.0/Win2000)
Option ExplicitPrivate Sub Command1_Click() 设置共享Dim RetVal As Long
RetVal = Shell("net share AAA=D:\SQLXML", 0) If RetVal = 0 Then
MsgBox ("Error")
Else
MsgBox ("OK")
End IfEnd SubPrivate Sub Command2_Click() '取消共享Dim RetVal As Long
RetVal = Shell("net share AAA /delete", 0) ' Run Calculator.
If RetVal = 0 Then
MsgBox ("Error")
Else
MsgBox ("OK")
End If
End Sub
RetVal = Shell("net share AAA=D:\SQLXML", 0) If RetVal = 0 Then
MsgBox ("Error")
Else
MsgBox ("OK")
End IfEnd SubPrivate Sub Command2_Click() '取消共享Dim RetVal As Long
RetVal = Shell("net share AAA /delete", 0) ' Run Calculator.
If RetVal = 0 Then
MsgBox ("Error")
Else
MsgBox ("OK")
End If
End Sub这一段就可以了,为什么还要上面的呢