Pergunta

Preciso acessar um recurso de rede no qual apenas uma determinada conta de domínio tem acesso. Estou usando a chamada de logonusuário, mas obtenha uma exceção "não possui privilegiado", pois o aplicativo da Web está em execução com a conta do ASP.NET e não possui permissões adequadas para fazer essa chamada.

Existe uma maneira de contornar isso? Alterar a identidade ou permissões da conta do ASP.NET não é uma opção, pois essa é uma máquina de produção com muitos projetos em execução. Existe uma maneira melhor de conseguir isso?

Usando o ASP.NET 2.0, forma a autenticação.

Atenciosamente.

Foi útil?

Solução

Apenas chamar o logonusser não é suficiente. Você precisa se passar esse usuário. Você pode se passar por apenas o acesso ao recurso de rede.

O código de amostra pode ser encontrado em Msdn.

Outras dicas

Você poderia adicionar um

<identity impersonate="true" userName=""/>

Tag no seu web.config, mas isso pode não ser o ideal, pois você provavelmente não deseja executar o site inteiro como esse usuário ...

Você pode mapear o compartilhamento da rede como uma unidade local com o DomainName e senha ... e depois puxar arquivos para o site através da unidade mapeada?

NET USE Z: \\SERVER\Share password /USER:DOMAIN\Username /PERSISTENT:YES

Eu só tive experiência íntima com isso abaixo de 1.1, para que as coisas possam mudar nos 2,0 dias, mas ... temos um aplicativo que é implantado em cenários de intranet e atacamos a mesma coisa. Corremos com a identidade impessoa ativada, a autenticação do modo de formulários, o acesso anônimo desativado. A maneira mais fácil de controlar isso (que eu encontrei) é colocar as credenciais do usuário que têm acesso no web.config. Eles vão para o nó onde você vira a identidade se impede. Se forem as informações do Super Scret, eu não faria dessa maneira! Estamos acessando apenas gráficos compartilhados em um ambiente de impressão; portanto, a maioria dos sites está feliz em configurar uma conta limitada para colocarmos no web.confit. O logonusuário realmente precisa de privilégios elevados. O MSDN possui alguns bons artigos sobre como se passar por um usuário específico no código. Eu pescaria alguns links, mas este telefone não copia a pasta.

Você pode alterar o ACL protegendo o recurso de rede? Um truque que usei no passado é criar um grupo do Active Directory e, em seguida, colocar o objeto de computador nesse grupo. Em seguida, uso esse grupo na lista de controle de acesso do objeto (arquivo, compartilhamento etc.) que preciso acessar.

Isso me permitiu executar o Windows Services como sistema local e obter acesso aos recursos de rede protegidos. E esse truque também parece funcionar para o processo ASP.NET, que é executado como serviço de rede.

  • Com este webpart y conectar -se a um recurso líquido com acesso restrito, coloquei um arquivo e fecho a conexão com o recurso (como usuário com acesso concedido), você não precisa fazer uma nova conexão de compartilhamento, que foi apenas uma restrição, que meu O departamento de Sistems faz para mim. Pode ser, existem muitas importações que são necessárias, mas faço para muitos testes e não tenho tempo para limpar o código. Espero que ajude para você. (Desculpe pelo meu pobre inglês).

Importações importações System.componentModel Imports System.web.ui Imports System.web.ui.webcontrols Imports System.io Imports System.io.File Imports System.Diagnostics Imports System.xml.Serialization Imports Microsoft.ShoPeoPoint Imports. Importações microsoft.sharepoint.webPartPages importam microsoft.sharepoint.webcontrols importações microsoft.sharepoint.administration importações system.security.PerropsIsTerTs importações system.security.Permissions Imports SystemeT.Nuntime.Intesetes Importoms System.Estem.EstemronsMonsMonsMonsionsMonsions SystemeT.NuNTETETIMETIMETIMEstos.Estem.Estem.Estem.EstemronsMonsMonsMonsions SystemTeets.NuTime.Essetes System.Estem.Estem.Estem.EstemronsMonsions System.Missões .Ui.htmlControls

Classe pública impessoalização privada const logon32_provider_default como número inteiro = 0 const privado logon32_logon_interactive como número inteiro = 2

<DllImport("advapi32.dll", SetLastError:=True)> _
Public Shared Function LogonUser(ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As Integer, ByVal dwLogonProvider As Integer, ByRef phToken As IntPtr) As Boolean
End Function

<DllImport("advapi32.dll", EntryPoint:="DuplicateToken", ExactSpelling:=False, CharSet:=CharSet.Auto, SetLastError:=True)> _
Public Shared Function DuplicateToken(ByVal ExistingTokenHandle As IntPtr, ByVal ImpersonationLevel As Integer, ByRef DuplicateTokenHandle As IntPtr) As Integer
End Function

Public Shared Function WinLogOn(ByVal strUsuario As String, ByVal strClave As String, ByVal strDominio As String) As WindowsImpersonationContext
    Dim tokenDuplicate As New IntPtr(0)
    Dim tokenHandle As New IntPtr(0)
    If LogonUser(strUsuario, strDominio, strClave, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, tokenHandle) Then
        If DuplicateToken(tokenHandle, 2, tokenDuplicate) <> 0 Then
            Return (New WindowsIdentity(tokenDuplicate)).Impersonate()
        End If
    End If
    Return Nothing
End Function

Descrição da classe final para Webpart1. "), XMLROOT (namespace: =" spscopiarfichero ")> _ classe pública webpart1 herda microsoft.sharepoint.webpartPages.webpartart

Protected WithEvents File1 As HtmlInputFile

Dim vdestino As String = "\\centappd20nd01\uploads_avisos"
Dim vtemporal As String = "c:\pdf"

Protected WithEvents boton1 As Button
Protected WithEvents usuario As TextBox
Protected WithEvents contra As TextBox
Protected WithEvents dominio As TextBox
Protected WithEvents destino As TextBox
Protected WithEvents origen As TextBox
Protected WithEvents temporal As TextBox
Protected WithEvents log As TextBox
'Render this Web Part to the output parameter specified.
Protected Overrides Sub RenderWebPart(ByVal output As System.Web.UI.HtmlTextWriter)
    log.RenderControl(output)
    output.Write("<br><font>Ruta Origen</font><br>")
    File1.RenderControl(output)
    output.Write("<br><font>Ruta Temporal </font><br>")
    temporal.RenderControl(output)
    output.Write("<br><font>Ruta Destino </font><br>")
    destino.RenderControl(output)
    output.Write("<br><font>Usuario </font><br>")
    usuario.RenderControl(output)
    output.Write("<br><font>Contraseña </font><br>")
    contra.RenderControl(output)
    output.Write("<br><font>Dominio </font><br>")
    dominio.RenderControl(output)
    output.Write("<br><br><center>")
    boton1.RenderControl(output)
    output.Write("</center>")
End Sub
Protected Overrides Sub CreateChildControls()

    dominio = New TextBox
    With dominio
        .Text = "admon-cfnavarra"
        .Width = Unit.Pixel("255")
    End With
    Controls.Add(dominio)

    boton1 = New Button
    With boton1
        .Text = "Copiar Fichero"
    End With
    Controls.Add(boton1)

    File1 = New HtmlInputFile
    With File1

    End With
    Controls.Add(File1)

    usuario = New TextBox
    With usuario
        .Text = "SVCWSINCPre_SNS"
        .Width = Unit.Pixel("255")
    End With
    Controls.Add(usuario)

    contra = New TextBox
    With contra
        .Text = "SVCWSINCPre_SNS"
        .Width = Unit.Pixel("255")
    End With
    Controls.Add(contra)

    destino = New TextBox
    With destino
        .Text = vdestino
        .Width = Unit.Pixel("255")
    End With
    Controls.Add(destino)

    log = New TextBox
    With log
        .Width = Unit.Percentage(100)
        .BackColor = System.Drawing.Color.Black
        .ForeColor = System.Drawing.Color.White
    End With
    Controls.Add(log)

    temporal = New TextBox
    With temporal
        .Text = vtemporal
        .Width = Unit.Pixel("255")
    End With
    Controls.Add(temporal)
End Sub
Private Sub boton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles boton1.Click
    If File1.PostedFile.FileName <> "" Then
        Dim _objContext As WindowsImpersonationContext = Nothing
        log.Text = QuienSoy()
        CopyFile(File1.PostedFile.FileName, temporal.Text)
        _objContext = Impersonalizacion.WinLogOn(usuario.Text, contra.Text, dominio.Text)
        CopyFile(temporal.Text & "\" & System.IO.Path.GetFileName(File1.PostedFile.FileName), destino.Text)
        _objContext.Undo()
    Else
        log.Text = "Se debe introducir un fichero"
    End If
End Sub
Friend Shared Function QuienSoy() As String
    Return WindowsIdentity.GetCurrent().Name
End Function
Public Function CopyFile(ByVal StartPath As String, ByVal EndPath As String)
    Try
        Dim fn As String = System.IO.Path.GetFileName(StartPath)
        System.IO.File.Copy(StartPath, EndPath & "\" & fn, False)
        log.Text = "Fichero Copiado Correctamente"
    Catch ex As Exception
        log.Text = ex.Message
    End Try
End Function

Classe final

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top