我想在本地将一个文件夹共享给某个指定的用户,应该用哪些api处理(windows 2000中)?
例如:文件夹名C:\test,本机创建又一个用户名为pc01,在用api NetShareAdd()创建共享时,系统默认的用户是everyone,现在我要将everyone去掉然后改成pc01,要用哪些api函数?
注意:我是要在文件夹的属性--共享--权限那个窗口中将everyone去掉然后增加用户pc01

解决方案 »

  1.   

    上次不是告诉你了
    不用api的
    windows自带的一个函数就可以
      

  2.   

    调用命令就可以了cacls c:\web /d everyone
      

  3.   

    这个是删除web目录的权限的
    cacls C:\test /d everyone
      

  4.   

    老大,你给的方法与我需要的结果有很大的差别。
    1,cacls 只能用于ntfs的中文件夹的“安全属性”,而我要的是在fat32和ntfs中都可以的
    2,cacls 只是禁用everyone帐号,而我要的是将这个帐号去掉,再新增一个帐号
    3,最重要的一点是我要的并不是在文件夹“安全属性”中设置,而是在文件夹的“共享”属性那里  设置权限
    很感谢你能多次给我帮助,但是问题还是没有进展!不知道是不是真的没有办法做到公司所要的结果
      

  5.   

    ntfs添加账户的代码不是给你了只能ntfs做 你共享给他他没有ntfs权限效果不是一样比如你把所有共享给他 但是他只对一个目录有读取 写入权限 这样不就可以了 如果其他目录读取权限没有他连看都看不见不是一样?fat32基本上是没有办法
      

  6.   

    但是公司还是希望在文件夹的“共享属性”的“权限”中控制,我也没有办法啊。
    还有就是在用cacls时,总是会需要你确认,怎么才能在程序中不弹出一个doc确认窗口
      

  7.   

    可以控制模拟点击那个按钮吧你去windows区问下看看有没有这样的windows命令fat32下net share之类的只能设置密码不能设置用户阿
      

  8.   

    fat32下net share之类的的确不能设置用户,但是api: NetShareAdd()中有个参数是能够设置用户的,只是那个参数我不会用,估计那个参数也很难用。
      

  9.   

    没有NetShareAdd()根本没有能设置用户的参数http://www.codesky.net/article/doc/200404/200404204840737.htm你可以看他类型
       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
    没有相关用户信息的
      

  10.   

    CACLS filename [/T] [/E] [/C] [/G user:perm] [/R user [...]] [/P user:perm [...]] [/D user [...]] 
       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 
      

  11.   

    二、Cacls命令在机房中的实际应用 
        现以我校某机房为例,说明通过使用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命令还更容易点
      

  12.   

    下面这个模组文件中 (.bas文件) 已经有完整的声明及完成的二个模组,只要呼叫这二个模组,就可以建立/取消磁盘或目录的资料分享:
    这二个模组说明如下:
    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
    注:就像一般教人家做坏事的书或电视节目一样,我也要声明一下:
    注:以上方式请用于正途 (系统需要),请勿使用以上方法来不当窃取不该看的文件!
      

  13.   

    我说错了不是NetShareAdd而是CreateDirectory中的第二个参数,也是与权限有关的一个参数。cacls这个命令我已经会用了,谢谢你。
      

  14.   

    CreateDirectory的权限怎么可能跟共享有关呢同样是ntfs的
      

  15.   

    Modest(塞北雪貂)·(偶最欣赏楼主的分) 你的文件夹共享怎么弄啊
      

  16.   

    XP下就可以,CACLS 只能在NTFS下进行
      

  17.   

    给你个详细的:VB建立共享文件夹 
    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
      

  18.   

    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这一段就可以了,为什么还要上面的呢