none
substituir arquivo executavel em maquina remota erro de permissao RRS feed

  • Pergunta

  • Estou com um problema, quero substituir um executavel em maquina remota (várias) de uma listagem em .txt... da erro de permissao...

    ja tentei varios tipos de script...

    alguem pode me ajudar?

    um deles é:

    ===========================================================

    on error resume next

    Const HKEY_LOCAL_MACHINE = &H80000002

    Const ForAppending = 8

    Const ForWriting = 2

    Const ForReading = 1

    ChecaLista strLista
    strComputer = "nome do computador"
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

    Set objFSO = CreateObject("Scripting.FileSystemObject")

    'Coloque aqui a pasta que será verificada
    strPasta = "C:\trocacopiadornovo\arquivos\"

    'Coloque aqui a pasta para a qual os arquivos serão copiados (Se quiser copiar, se nao quiser apague essa linha)
    strDest = "C:\Arquivos de programas\PJERJ\DCP\Produção\"

    ' NOME DO ARQUIVO DE LOG
    strLogFile = "Backup-log.txt"


    Set objLogFile = objFSO.OpenTextFile(strLogFile, 8, True, 0)
    objLogFile.WriteLine  VBCRLF
    objLogFile.WriteLine "==================================================="
    objLogFile.WriteLine "ARQUIVOS COPIADOS EM: " & now
    objLogFile.WriteLine "==================================================="


    ChecaArquivo StrSubPasta

    wscript.echo "Fim do Script"
    wscript.quit

    Sub ChecaArquivo(strSubPasta)

    Set Folder = ObjFSO.GetFolder(strSubPasta)
    GeraLog strSubPasta

    For each subFolder in Folder.SubFolders
       GeraLog SubFolder.Path
       LimpaDel SubFolder.path
       ChecaArquivo SubFolder.path

    Next

    End sub


    '====================================================================

    Sub GeraLog(strCaminho)

    Set objArq = ObjFSO.GetFolder(strCaminho)
    Set MyFiles = objArq.files

    'VERIFICA ARQUIVOS
    For Each MyFiles in objArq.Files
       strFileOrig = Myfiles.path
       strFileDest = strDest & MID(MyFiles.path,Len(strPasta),Len(Myfiles.path))

       if (objFSO.FileExists(strFileDest) = True) Then
          Set objFileDest = objFSO.GetFile(strFileDest)
          If myfiles.DateLastModified > objFileDest.DateLastModified  Then
             objFSO.Copyfile strFileOrig,strFileDest,True
             objLogFile.WriteLine "ARQUIVO SUBSTITUIDO : "  & myfiles.name &  " copiado em : " & Now
          End if
       Else
          pastapai = MID(RIGHT(myFiles.ParentFolder,LEN(myFiles.ParentFolder)),Len(strPasta),Len(myFiles.ParentFolder))
          dirDest = strDest
          arrTipos = split(pastapai,"\")
          For x = 0 to UBOUND(arrTipos)
             if objFSO.folderexists(dirDest & arrTipos(x)) = false Then
               objFSO.CreateFolder(dirDest & arrTipos(x))
               dirDest = dirDest & arrTipos(x) & "\"
             Else
               dirDest = dirDest & arrTipos(x) & "\"
             End if
          Next

          objFSO.Copyfile strFileOrig,strFileDest,True
          objLogFile.WriteLine "ARQUIVO NOVO : "  & dirDest & myfiles.name &  " copiado em : " & Now
       End if
    Next
    End sub

    '========================================================================

    Sub ChecaLista(strLista)


    'Set Lista = ObjFSO.GetFolder(strLista)
    'GeraLog strLista

    Set objFSO2 = CreateObject("Scripting.FileSystemObject")
    Set arquivo = objFSO2.OpenTextFile _
      (".\lista.txt", ForReading, True)

    Set objFSO3 = CreateObject("Scripting.FileSystemObject")
    'Set arquivo2 = objFSO3.OpenTextFile _
    '  (".\resultping.csv", ForAppending, True)

    'arquivo2.Writeline "Computador;Endereço IP;Status"
    Do Until arquivo.AtEndOfStream

    computador = arquivo.Readline

    wscript.echo computador '# MOSTRA NA TELA O NOME DE CADA ITEM DA LISTA EM UMA CAIXA DE MENSAGEM.

    loop

    arquivo.Close
    'arquivo2.Close
    Wscript.echo " FIM DA LISTA!!!!!!!"

    End sub

    =================================================================

    outro é:

    on error resume next

    Const HKEY_LOCAL_MACHINE = &H80000002
    Const ForAppending = 8
    Const ForWriting = 2
    Const ForReading = 1
    'dim Acessa
    ' dim strCaminho
    dim strSubPasta, strLogFile
    dim folder, objFSO,objLogFile, objFSO2

    'Set objFSO = CreateObject("Scripting.FileSystemObject")

    Set objExcel = CreateObject("Excel.Application")
    objExcel.Visible = True
    objExcel.Workbooks.Add
    intRow = 2
     
    objExcel.Cells(1, 1).Value = "Nome do Computador"
    objExcel.Cells(1, 2).Value = "Resultado"
     
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set InputFile = fso.OpenTextFile("lista.Txt")
     
    Do While Not (InputFile.atEndOfStream)

        HostName = InputFile.ReadLine
     
    Set WshShell = WScript.CreateObject("WScript.Shell")
        Ping = WshShell.Run("ping -n 1 " & HostName, 0, True)
     
    objExcel.Cells(intRow, 1).Value = HostName
     
    'Select Case Ping
    if Ping = 0 then
    'Case 0 objExcel.Cells(intRow, 2).Value = "On Line"
      objExcel.Cells(intRow, 2).Value = "On Line"
      Acessa (strComputer)
      GeraLog ()
      msgbox "teste"

    '==================================================

    ' NOME DO ARQUIVO DE LOG
    strLogFile = "Backup-log.txt"
    Set objLogFile = objFSO.OpenTextFile(strLogFile, 8, True, 0)
    objLogFile.WriteLine  VBCRLF
    objLogFile.WriteLine "==================================================="
    objLogFile.WriteLine "ARQUIVOS COPIADOS EM:" & now & HostName
    objLogFile.WriteLine "==================================================="
    'ChecaArquivo strPasta
    'Sub ChecaArquivo(strSubPasta)
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set Folder = ObjFSO.GetFolder(strSubPasta)
    GeraLog strSubPasta
    For each subFolder in Folder.SubFolders
       GeraLog SubFolder.Path
       LimpaDel SubFolder.path
      ChecaArquivo SubFolder.path
    Next
    'end sub
    '====================================================================

    '==================================================
    'Case 1 objExcel.Cells(intRow, 2).Value = "Off Line"
    'End Select
     else objExcel.Cells(intRow, 2).Value = "Off Line"
     end if
    intRow = intRow + 1
    Loop
     
    objExcel.Range("A1:B1").Select
    objExcel.Selection.Interior.ColorIndex = 19
    objExcel.Selection.Font.ColorIndex = 11
    objExcel.Selection.Font.Bold = True
    objExcel.Cells.EntireColumn.AutoFit

    '=================================================
    Sub Acessa (strComputer)
    strComputer = HostName
    msgbox strComputer
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    'Coloque aqui a pasta que será verificada
    strPasta = "C:\trocacopiadornovo\arquivos\"
    'Coloque aqui a pasta para a qual os arquivos serão copiados (Se quiser copiar, se nao quiser apague essa linha)
    strDest = "C:\Arquivos de programas\PJERJ\DCP\Produção\"

    End Sub
    '================================================
    Sub GeraLog ()

    Set objArq = ObjFSO.GetFolder(strPasta)
    Set MyFiles = objArq.files
    'VERIFICA ARQUIVOS
    For Each MyFiles in objArq.Files
       strFileOrig = Myfiles.path
       strFileDest = strDest & MID(MyFiles.path,Len(strPasta),Len(Myfiles.path))
       msgbox strFileOrig
       msgbox strFileDest
       if (objFSO.FileExists(strFileDest) = True) Then
          Set objFileDest = objFSO.GetFile(strFileDest)
          If myfiles.DateLastModified > objFileDest.DateLastModified  Then
             objFSO.Copyfile strFileOrig,strFileDest,True
             objLogFile.WriteLine "ARQUIVO SUBSTITUIDO : "  & myfiles.name &  " copiado em : " & Now
          End if
       Else
          pastapai = MID(RIGHT(myFiles.ParentFolder,LEN(myFiles.ParentFolder)),Len(strPasta),Len(myFiles.ParentFolder))
          dirDest = strDest
          arrTipos = split(pastapai,"\")
          For x = 0 to UBOUND(arrTipos)
             if objFSO.folderexists(dirDest & arrTipos(x)) = false Then
               objFSO.CreateFolder(dirDest & arrTipos(x))
               dirDest = dirDest & arrTipos(x) & "\"
             Else
               dirDest = dirDest & arrTipos(x) & "\"
             End if
          Next
          objFSO.Copyfile strFileOrig,strFileDest,True
          objLogFile.WriteLine "ARQUIVO NOVO : "  & dirDest & myfiles.name &  " copiado em : " & Now
       End if
    Next
    End sub


    blanco schwartz

    terça-feira, 22 de maio de 2012 13:32

Respostas

  • Blanco,

    Algumas observções:

    1. Esta atividade é remota? isto é, vc executa de uma estação de administrador e o script vai realizando a tarefa em máquinas remotas?
    2. Do jeito que o seu script está ele só realiza tarefas locais, independente de você alterar o valor de strComputer, isto porque o objeto objFSO só está realizando tarefas locais, se vc quiser que ele acesse algum arquivo em uma máquina remota você vai ter que colocar o caminho via compartilhamento (\\computador\share\pasta\arquivo...) 

    Se você quiser utilizar este script terá que utilizar em conjunto com o PSExec, assim ele copia este script para a estação remota e executa ele lá.

    Outra forma é substituir o objeto FileSystem por WMI, acho o PSExec mais fácil para você.

    Segue links comprovando este fato.

    Comparing WMI and the FileSystemObject

    technet.microsoft.com/en-us/library/ee176595.aspx

    Cannot access remote files with the FileSystemObject

    support.microsoft.com/kb/197964/en-us


    Fábio de Paula Junior


    sexta-feira, 25 de maio de 2012 02:58
    Moderador
  • Acho até que sua intenção quando utilizou a linha Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2"), era conectar na estação remota mas o objeto instanciado em Set objFSO = CreateObject("Scripting.FileSystemObject"), não tem relação nenhuma com ele. O primeiro conectou na estação remota mas o segundo conectou no host onde você está executando o script.

    Fábio de Paula Junior

    sexta-feira, 25 de maio de 2012 03:02
    Moderador

Todas as Respostas

  • Cara para eu entender melhor e te ajudar:

    a pasta de destino e origem tem permissão do usuario logado para copiar e substituir ou tem a permissão "todos" ?

    isto é para qualquer S.O.?

    se é um executável será que é negado por que o .exe não está sendo usado?

    Aparentemente teu script está ok.

    Até...


    Warley

    terça-feira, 22 de maio de 2012 14:23
  • Obrigado pela atenção.

    As permissoes sao apra todos e inclui meu login la tbm como total.

    peguei duas maquinas da relação para teste remoto. uma é xp outa seven e dao o mesmo erro...

    nao está em uso, ja observei isso...

    comecei a verificar as permissoes etc das maquinas mas nao achei nada ainda...

    será que tem outra maneira de fazer isso? com outro tipo de script ?

    obrigado...


    blanco schwartz

    terça-feira, 22 de maio de 2012 14:41
  • Blanco,

    Algumas observções:

    1. Esta atividade é remota? isto é, vc executa de uma estação de administrador e o script vai realizando a tarefa em máquinas remotas?
    2. Do jeito que o seu script está ele só realiza tarefas locais, independente de você alterar o valor de strComputer, isto porque o objeto objFSO só está realizando tarefas locais, se vc quiser que ele acesse algum arquivo em uma máquina remota você vai ter que colocar o caminho via compartilhamento (\\computador\share\pasta\arquivo...) 

    Se você quiser utilizar este script terá que utilizar em conjunto com o PSExec, assim ele copia este script para a estação remota e executa ele lá.

    Outra forma é substituir o objeto FileSystem por WMI, acho o PSExec mais fácil para você.

    Segue links comprovando este fato.

    Comparing WMI and the FileSystemObject

    technet.microsoft.com/en-us/library/ee176595.aspx

    Cannot access remote files with the FileSystemObject

    support.microsoft.com/kb/197964/en-us


    Fábio de Paula Junior


    sexta-feira, 25 de maio de 2012 02:58
    Moderador
  • Acho até que sua intenção quando utilizou a linha Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2"), era conectar na estação remota mas o objeto instanciado em Set objFSO = CreateObject("Scripting.FileSystemObject"), não tem relação nenhuma com ele. O primeiro conectou na estação remota mas o segundo conectou no host onde você está executando o script.

    Fábio de Paula Junior

    sexta-feira, 25 de maio de 2012 03:02
    Moderador
  • obrigado, era isso mesmo. abçs

    blanco schwartz

    segunda-feira, 28 de maio de 2012 18:29