Problém s Shell32.ShellLinkObject a zapnutým UAC   zodpovězená otázka

VB.NET

Dobrý den,

obracím se na vás, protože nemůžu nikde najít řešení tohoto problému. Jde o to, že potřebuji zjišťovat informace ze zástupce (.lnk). Kód pro zjišťování je tento:

    Public Function GetShortcutInfo(ByVal path_ As String) As Shell32.ShellLinkObject
        If String.IsNullOrEmpty(path_) Then Return Nothing
        If IO.Path.GetExtension(path_).ToUpper <> ".LNK" Then Return Nothing

        Dim ShellAppType As Type = Type.GetTypeFromProgID("Shell.Application")
        Dim oShell As Object = Activator.CreateInstance(ShellAppType, False)
        Dim oFolder As Shell32.Folder = oShell.NameSpace(IO.Path.GetDirectoryName(path_))

        If (Not oFolder Is Nothing) Then
            Dim oFolderItem As Shell32.FolderItem = oFolder.ParseName(IO.Path.GetFileName(path_))

            If (Not oFolderItem Is Nothing) Then
                Return CType(oFolderItem.GetLink, Shell32.ShellLinkObject)
            Else
                Return Nothing
            End If
        Else
            Return Nothing
        End If
    End Function

Na Windows 7, při zapnutém UAC, kód nefunguje ani když je aplikace spuštěna s oprávněním správce. Chybu vyhodí příkaz oFolderItem.GetLink:Přístup byl odepřen. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

Dokáže někdo poradit?

Díky

JD

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je v aplikaci manifest se správnými hodnotami?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V manifestu mám teď tohle a funguje to správně:

<requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

Před tím byla v manifestu hodnota level="asInvoker". Když jsem pak aplikaci spustil jako administrator, tak to vyhazovalo chybovou hlášku (viz, první příspěvek). Předpokládal jsem že v tom rozdíl není pokud aplikace sama vyžaduje vyšší oprávnění nebo jí sám takto spustím.

Nevíte o nějakém způsobu, jak zjišťovat info o zástupci bez toho, že by program vyžadoval vyšší práva (zástupci např. v All users)? Jde mi jen o čtení, zástupce měnit nechci.

Ještě mám jeden problém s UAC, ale na to založím nové vlákno.

Díky

JD

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nastudujte http://msdn.microsoft.com/en-us/library/... a najděte vhodnou kombinaci parametrů v manifestu. Myslím, že větší kriplovina než UAC v historii Windows nebyla vytvořena.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nakonec mě to babrání s UAC přestalo bavit... Předělal jsem to tak, že zjišťuji informace o zástupci pomocí Windows Script Host Object Model IWshRuntimeLibrary.IWshShortcut. Takhle je to ok.

Další věc která mě štve, je nefunkční drag&drop mezi aplikacemi s různým stupněm oprávnění. Sice chápu proč to tak funguje, ale vysvětlujte to uživatelům! Naštěstí u většiny aplikací není potřeba spouštění se zvýšenými právy, takže se tím vůbec nehodlám zabývat.

Díky za ochotu

JD

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A aplikace využívající IWshRuntimeLibrary.IWshShortcut na All Users zástupci spuštěná pod běžným uživatelem a zapnutým UAC nic nekřičí?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Překvapivě ne, i když jsem očekával stejnou chybu.

Přikládám kód, pokud chcete vyzkoušet:

    Public Function GetShortcutInfo(path_ As String) As FileType
        If (Not String.IsNullOrEmpty(path_)) And (Path.GetExtension(path_).ToUpper = ".LNK") Then
            Try
                Dim shell As New IWshRuntimeLibrary.WshShell
                Dim link As IWshRuntimeLibrary.IWshShortcut = CType(shell.CreateShortcut(path_), IWshRuntimeLibrary.IWshShortcut)

                Dim fileType_ As New FileType
                fileType_.Path = link.TargetPath
                fileType_.Arguments = link.Arguments
                fileType_.Description = Path.GetFileNameWithoutExtension(link.FullName)
                fileType_.IconPath = link.IconLocation.Substring(0, link.IconLocation.LastIndexOf(","))
                fileType_.IconIndex = Convert.ToInt32(link.IconLocation.Substring(link.IconLocation.LastIndexOf(",") + 1))

                Return fileType_
            Catch ex As Exception
                Return New FileType
            End Try
        Else
            Return New FileType
        End If
    End Function

funkce vrací instanci této třídy:

Public Class FileType

    Private path_ As String
    Private description_ As String
    Private arguments_ As String
    Private iconPath_ As String
    Private iconIndex_ As Integer

    Public Property Path() As String
        Get
            Return path_
        End Get
        Set(ByVal value As String)
            path_ = value
        End Set
    End Property

    Public Property Description() As String
        Get
            Return description_
        End Get
        Set(ByVal value As String)
            description_ = value
        End Set
    End Property

    Public Property Arguments() As String
        Get
            Return arguments_
        End Get
        Set(ByVal value As String)
            arguments_ = value
        End Set
    End Property

    Public Property IconIndex() As Integer
        Get
            Return iconIndex_
        End Get
        Set(ByVal value As Integer)
            iconIndex_ = value
        End Set
    End Property

    Public Property IconPath() As String
        Get
            Return iconPath_
        End Get
        Set(ByVal value As String)
            iconPath_ = value
        End Set
    End Property

    Public Sub New()
        path_ = String.Empty
        description_ = String.Empty
        arguments_ = String.Empty
        iconPath_ = String.Empty
        iconIndex_ = 0
    End Sub

End Class

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