代码之家  ›  专栏  ›  技术社区  ›  egrunin

如何授予“所有人”对文件的完全权限(以编程方式)

  •  5
  • egrunin  · 技术社区  · 14 年前

    我正在修改一个旧的C++程序运行在Vista上。它不需要管理员权限。

    我修改了代码,把日志文件放进去了 \ProgramData\MyApp\ . 这些日志文件是用 stdio 功能( fopen , fprintf , fclose )

    问题是:

    1. usera首先运行程序,它创建 \ProgramData\MyApp\MyLogFile.txt 使用 CreateFile()

    2. userb下一步运行程序,它尝试附加到 MyLogFile.txt 访问被拒绝。

    我试图创建一个空值 SECURITY_DESCRIPTOR 把它传给 创建文件() . 这确实创建了一个“未分配权限”的文件,但似乎第一个写入该文件的用户取得了所有权,随后所有其他非管理员用户都走运了。

    所有用户共享相同的日志文件很重要,但我尽可能少地更改代码也很重要。

    编辑添加:

    \ProgramData\MyApp 由标准的Visual Studio安装程序创建。(我看不到设置目录安全性的任何位置。)当它创建 \MyApp 资讯科技补助金 Users 这些权限:

    Read & execute  
    List folder contents
    Read
    Special permissions
    

    Advanced 我看到特殊权限包括:

    Create files / write data
    Create folders / append data
    Write attributes
    Write extended attributes
    
    4 回复  |  直到 11 年前
        1
  •  5
  •   Community CDub    7 年前

    +对每个人来说都是一个尝试,但最终我在这里找到了答案:

    how to change the ACLs from c++?

    我确实需要改变解决方案中的一行:

    ea[0].grfAccessMode = DENY_ACCESS;
    

    对此:

    ea[0].grfAccessMode = GRANT_ACCESS;
    
        2
  •  2
  •   Adrian Fâciu    14 年前

    可能您的应用程序使用了安装程序。当安装程序创建文件夹“myapp”时,为每个人分配读/写权限。这可能会解决你的问题。有不同的方法可以做到这一点,但这取决于您使用的设置类型。

    添加了自定义操作信息。

    如果安装后文件夹没有所需的权限,您可以在安装序列上添加自定义操作作为Visual Basic脚本,这将设置所需的权限。

    VBS示例:

        Function SetPermissions()
            Dim strHomeFolder, strHome, strUser
            Dim intRunError, objShell, objFSO
    
            strHomeFolder = "C:\Test"
    
            Set objShell = CreateObject("Wscript.Shell")
            Set objFSO = CreateObject("Scripting.FileSystemObject")
            If objFSO.FolderExists(strHomeFolder) Then
                intRunError = objShell.Run("%COMSPEC% /c Echo Y| cacls " _
                & strHomeFolder & " /t /c /g everyone:F ", 2, True)
    
                If intRunError <> 0 Then
                    Wscript.Echo "Error assigning permissions for user " _
                    & strUser & " to home folder " & strHomeFolder
                End If
            End If
    
    End Function
    
        3
  •  1
  •   Spence    14 年前

    如果这是您真正想要的,您需要为用户“所有人”添加一个允许规则。

    如果内存为…

        4
  •  1
  •   INS    14 年前

    你必须明确使用 CreateFile . 更多地了解 security and access rights . 我确信来自标准C库的函数使用createfile(它不能在Windows上使用任何其他东西),但是使用默认的安全参数,这对您的情况没有帮助。

    我也试着往里面看 SECURITY_ATTRIBUTES SECURITY_DESCRIPTOR 结构,但不容易理解怎么做,尽管这可能是一个机会。

    推荐文章