Zmena prav k adresari   zodpovězená otázka

VB.NET

Dobry den,

resim nasledujici problem. Mam aplikaci v VB.NET, ktera bezproblemu prideluje prava uzivatelum (uzivatele ve Windows 7) k pristupu k nejakemu adresari. Vse funguje v pohode, pokud aplikaci spusti clovek, ktery ma prava pro zmenu prav. Potrebuji, aby kdyz aplikaci spusti uzivatel, ktere tyto prava nema, aby presto aplikace mohla tato pristupova prava zmenit. Muzete mi nekdo poradit jak na to jit? Nize prikladam kod, ktery pouzivam pro pridelovani a odebirani prav

 Sub AddDirectorySecurity(ByVal FileName As String, ByVal Account As String, ByVal Rights As FileSystemRights, ByVal ControlType As AccessControlType)
        
        Dim dInfo As New DirectoryInfo(FileName)
        Dim dSecurity As DirectorySecurity = dInfo.GetAccessControl()


        dSecurity.AddAccessRule(New FileSystemAccessRule(Account, Rights, InheritanceFlags.ContainerInherit Or InheritanceFlags.ObjectInherit, PropagationFlags.None, ControlType))

         dInfo.SetAccessControl(dSecurity)
    End Sub


    Sub RemoveDirectorySecurity(ByVal FileName As String, ByVal Account As String, ByVal Rights As FileSystemRights, ByVal ControlType As AccessControlType)

        Dim dInfo As New DirectoryInfo(FileName)

        Dim dSecurity As DirectorySecurity = dInfo.GetAccessControl()

        dSecurity.RemoveAccessRule(New FileSystemAccessRule(Account, Rights, InheritanceFlags.ContainerInherit Or InheritanceFlags.ObjectInherit, PropagationFlags.None, ControlType))

        dInfo.SetAccessControl(dSecurity)
    End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pomoci Process.Start můžete spustit proces pod jiným uživatelem. Ten se nastaví vlastnostmi UserName, Domain a Password objektu ProcessStartInfo. Pro nastavení práv by jste si musel udělat zvlášť prográmek, který takto budete volat, nebo můžete rovnou volat command line utilitu Windows cacls.exe.

Kód může být následující:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        RunCommandAs("cacls.exe", """C:\Slozka"" /e /g Users:C", "DOMENA\User", "Heslo")
    End Sub

    Public Shared Sub RunCommandAs(ByVal command As String, arguments As String, ByVal user As String, ByVal password As String)
        Dim userName As String = ExtractLogin(user)
        Dim domainName As String = ExtractDomain(user)

        Dim startInfo As ProcessStartInfo = New ProcessStartInfo(command, arguments)
        With startInfo
            .UseShellExecute = False
            .RedirectStandardError = True
            .Domain = domainName
            .UserName = userName
            .Password = MakeSecureString(password)
            .LoadUserProfile = False
            .CreateNoWindow = True
        End With

        Dim process As Process = System.Diagnostics.Process.Start(startInfo)
        'Wait for the process to end.
        process.WaitForExit()

        Dim errorOutput As String = process.StandardError.ReadToEnd()
        If Not String.IsNullOrEmpty(errorOutput) Then
            Throw New SecurityException(errorOutput)
        End If
    End Sub

    Private Shared Function MakeSecureString(ByVal text As String) As SecureString
        Dim secure As SecureString = New SecureString
        For Each c As Char In text
            secure.AppendChar(c)
        Next

        Return secure
    End Function

    Private Shared Function ExtractLogin(ByVal loginName As String) As String
        Dim strExp As String = loginName.Replace("/", "\\")
        Dim index As Integer = strExp.IndexOf(Microsoft.VisualBasic.ChrW(92))
        If (index <> -1) Then
            strExp = strExp.Substring((index + 1))
        Else
            index = strExp.IndexOf(Microsoft.VisualBasic.ChrW(64))
            If (index <> -1) Then
                strExp = strExp.Substring(0, index)
            End If
        End If

        Return strExp
    End Function

    Private Shared Function ExtractDomain(ByVal loginName As String) As String
        Dim strExp As String = loginName.Replace("/", "\\")
        Dim index As Integer = strExp.IndexOf(Microsoft.VisualBasic.ChrW(92))
        If (index <> -1) Then
            strExp = strExp.Substring(0, index)
        Else
            index = strExp.IndexOf(Microsoft.VisualBasic.ChrW(64))
            If (index <> -1) Then
                strExp = strExp.Substring((index + 1))
            Else
                strExp = ""
            End If
        End If
        index = strExp.IndexOf(Microsoft.VisualBasic.ChrW(46))
        If (index <> -1) Then
            strExp = strExp.Substring(0, index)
        End If

        Return strExp.ToUpper(System.Globalization.CultureInfo.CurrentCulture)
    End Function
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Skvele, to je presne ono. Velmi Vam dekuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback