VB.NET中的启动文件夹权限

VB.NET中的启动文件夹权限,vb.net,permissions,windows-10,Vb.net,Permissions,Windows 10,我正在开发一个应用程序,只需点击一个按钮即可安装公司的所有定制软件。列表中包括一个资产跟踪/报告工具,每个人都必须在启动时运行该工具。我们的标准版本(我对此没有任何控制权)是Windows 10,我们也有一些传统的Windows 7机器,但在每种情况下,启动注册表项都被锁定,因此我开始在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\startup中创建快捷方式 如果启动文件夹不存在,则会创建该文件夹。以本地管理员身份登录,我可以在不弹出

我正在开发一个应用程序,只需点击一个按钮即可安装公司的所有定制软件。列表中包括一个资产跟踪/报告工具,每个人都必须在启动时运行该工具。我们的标准版本(我对此没有任何控制权)是Windows 10,我们也有一些传统的Windows 7机器,但在每种情况下,启动注册表项都被锁定,因此我开始在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\startup中创建快捷方式

如果启动文件夹不存在,则会创建该文件夹。以本地管理员身份登录,我可以在不弹出UAC的情况下手动创建启动文件夹,获得文件夹的所有权,并分配每个人都有修改权限,在其中创建快捷方式。当我注销/登录时,软件会运行。但是,当我编写此代码时,会出现权限错误

代码如下:

Sub DetectFolders()
    Dim sFolder1 As String = "C:\My Apps\"
    Dim sFolder2 As String = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\"
    Dim sFolder3 As String = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\"
    If Not Directory.Exists(sFolder1) Then
        Directory.CreateDirectory(sFolder1)
    End If

    If Not Directory.Exists(sFolder2) Then
        Try
            ' create folder

            TakeOwnership(sFolder3)
            Application.DoEvents()

            AddDirectorySecurity(sFolder3, "MyDomain\" & Environment.UserName, FileSystemRights.FullControl, AccessControlType.Allow)
            Application.DoEvents()

            Directory.CreateDirectory(sFolder2)
            Application.DoEvents()

            TakeOwnership(sFolder2)

            ' everyone has modify access // TEST
            AddDirectorySecurity(sFolder2, "Everyone", FileSystemRights.Modify, AccessControlType.Allow)

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Config", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Me.Close()
        End Try

    End If


End Sub

Sub TakeOwnership(ByVal sfolder As String)
    ' take ownership
    Try
        Dim ds As System.Security.AccessControl.DirectorySecurity
        Dim account As System.Security.Principal.NTAccount
        ds = System.IO.Directory.GetAccessControl(sfolder, System.Security.AccessControl.AccessControlSections.Owner)

        account = New System.Security.Principal.NTAccount(System.Security.Principal.WindowsIdentity.GetCurrent.Name)
        ds.SetOwner(account)

        System.IO.Directory.SetAccessControl(sfolder, ds)
        Application.DoEvents()
    Catch ex As Exception

        MessageBox.Show("" & ex.Message & "", "Take Ownership", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try

End Sub

Sub AddDirectorySecurity(ByVal FileName As String, ByVal Account As String, ByVal Rights As FileSystemRights, ByVal ControlType As AccessControlType)
    Try
        ' Create a new DirectoryInfoobject.
        Dim dInfo As New DirectoryInfo(FileName)

        ' Get a DirectorySecurity object that represents the 
        ' current security settings.
        Dim dSecurity As DirectorySecurity = dInfo.GetAccessControl()

        ' Add the FileSystemAccessRule to the security settings. 
        dSecurity.AddAccessRule(New FileSystemAccessRule(Account, Rights, ControlType))

        ' Set the new access settings.
        dInfo.SetAccessControl(dSecurity)
    Catch ex As Exception
        MessageBox.Show("" & ex.Message & "", "Add Security", MessageBoxButtons.OK, MessageBoxIcon.Error)

    End Try


End Sub
出现的前两个错误是:试图执行未经授权的操作,该操作是在首次调用AddDirectorySecurity和TakeOwnership时生成的

然后,我得到一个错误,它表明:

对路径“C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup”的访问被拒绝

这是从DetectFolders子目录中的directory.createdirectory行生成的


我很快就开始没有办法让它工作了。我的代码里有什么东西吗?是我遗漏了什么,还是windows 10不能以这种方式工作。我们将非常感谢您提供的任何建设性帮助。

您是否以管理员身份运行vb应用程序?这是一个clickonce应用程序,但在尝试了一些东西后,我将更改它,因为clickonce看起来无法提升。我真的需要更多的咖啡因。快捷方式的“开始位置”文件夹指向正确的位置吗?你试过使用“开始位置”而不是快捷方式吗?看看这里。。这可能会有帮助,但当然可能不会你是否以管理员的身份运行vb应用程序?这是一个clickonce应用程序,但在尝试了一些东西后,我改变了它,因为clickonce看起来无法提升。我真的需要更多的咖啡因。快捷方式的“开始位置”文件夹指向正确的位置吗?你试过使用“开始位置”而不是快捷方式吗?看看这里。。这可能会有帮助,但当然可能不会