none
Windows 7 nao retorna meu Owner mas o XP retorna, porque??? RRS feed

  • Pergunta

  • Tenho um macro VBS aqui que executado no win XP roda normal, mas quando executo no win 7 ele nao me retorna a propriedade OWNER conforme deveria fazer tal função.
    Qual a causa disso e como arrumar??
    segue a função:

    'Função que retorna a propriedade OWNER, que não é previamente definida no objeto File
    function getEspProp(filename, folder, opt)

     'Objetos Folder e File
     Set objShell = CreateObject ("Shell.Application")
     Set objFolder = objShell.Namespace(folder)
     Set oFile = objFolder.ParseName(filename)

     'Retorno da função
     getEspProp = objFolder.GetDetailsOf(oFile, opt)

     'Limpeza dos objetos utilizados
     set objShell  = nothing
     set objFolder = nothing
     set oFile  = nothing

    end function

    quinta-feira, 2 de outubro de 2014 15:11

Respostas

  • Por via das dúvidas eu peguei seu script original e fiz as alterações que sugeri (talvez eu tivesse esquecido algo), mas funcionou.

    Segue o script modificado que funcionou pra mim.

    dim pathStr
    dim header 
    dim outputFile
    dim strRes
    
    '################################# VARIAVEIS DE CONFIGURAÇÃO ################################################
    outPutFile = "C:\teste\teste.csv"
    outResumo = "C:\teste\resumo.txt"
    pathStr = "E:\"
    '############################################################################################################
    
    'Header - Nome das Colunas analisadas
    header = "NOME_ARQUIVO;DIRETORIO;CAMINHO_COMPLETO;TAMANHO_BYTES;TAMANHO_FORMATADO;PROPRIETÁRIO;DATA_CRIAÇÃO;DATA_ULTIMO_ACESSO;DATA_ULTIMA_MODIFICAÇÃO"
    
    'Criação do Cabeçalho - Parametro 2: Criação de um novo arquivo destino, ou sobreescreve o arquivo de mesmo nome
    addToFile outPutFile ,header, 2
    
    'Inicia a função recursiva - Parametro 8: Adiciona no arquivo destino que já existe, sem sobreescrever
    
    strRes =  readDir(outputFile ,pathStr, 8)
    
    Const strComputer = "."
    
    Dim objWMIService, colItems, objItem
    
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType = '4' AND NAME = '" & left(pathStr,2) & "'") 'Comment
    
    Dim oShell
    Dim filesys, filetxt
    
    Set oShell = CreateObject("WScript.shell")
    Set filesys = CreateObject("Scripting.FileSystemObject")
    Set filetxt = filesys.CreateTextFile(outResumo, True)
    
    filetxt.WriteLine ("DRIVE SIZE USED")
    
    For Each objItem In colItems
    	filetxt.WriteLine (objItem.Name & " " & objItem.Size & " " & strRes)
    Next
    
    'Finaliza o processamento
    msgbox "Finished"
    
    
    'Função recursiva que armazena a linha com o arquivo
    function readDir(outputFile, dirPath, opt)
    	dim i 
    	dim f
    	dim str
    	dim fname
    	dim fFolder
    	dim owner
    	dim size
    	dim sizet 
    
    	'Criação de objeto FileSytem
    	Set objFSO = CreateObject("Scripting.FileSystemObject")
    	'Objeto Folder
    	Set folder = objFSO.GetFolder(dirPath) 
    	'Objeto File
    	Set Files = folder.Files
    	size = 0
    	on error resume next
    	For Each file in files
    		if err = 0 then
    			' COntrução da String que será armazenada no arquivo
    			str = ""
    			str = file.name & ";"
    			str = str & file.ParentFolder  & ";"
    			str = str & file.path & ";"
    			str = str & file.size & ";"
    
    
    			sizet = sizet + file.size
    
    			size = file.size
    			str = str & getFormatedFileSize(size) & ";"
    
    			fname = file.name
    			fFolder = file.ParentFolder
    			'owner = getEspProp(fname , fFolder,8 )
    			owner = GetFileOwner(file.path)
    
    			'Remove o domínio do usuário
    			if instr(1,owner,"\") > 0  then
    				owner = mid(owner, instr(1,owner,"\") +1)
    			end if
    
    			str = str & owner  & ";"
    			str = str & file.DateCreated  & ";"
    			str = str & file.DateLastAccessed  & ";"
    			str = str & file.DateLastModified  & ";"
    
    			'Adiciona linha ao arquivo destino
    			addToFile outputFile , str , opt
    		else
    			err = 0
    		end if
    		
    	Next
    
    	err = 0
    	on error goto 0
    
    	on error resume next
    	if err = 0 then
    		'Recursividade que acessa todas as subpastas e arquivos
    		For Each Subfolder in Folder.SubFolders
    			sizet = sizet + readDir(outputFile, subfolder.path, 8)
    		next
    	else
    		err = 0
    	end if
    	err = 0
    
    	readDir = sizet
    
    	on error goto 0
    
    	set objFSO = nothing 
    	set folder = nothing
    	set Files  = nothing
    	set file = nothing
    
    end function
    
    
    'Função que retorna a propriedade OWNER, que não é previamente definida no objeto File
    function getEspProp(filename, folder, opt)
    
    	'Objetos Folder e File
    	Set objShell = CreateObject ("Shell.Application")
    	Set objFolder = objShell.Namespace(folder)
    	Set oFile = objFolder.ParseName(filename)
    
    	'Retorno da função
    	getEspProp = objFolder.GetDetailsOf(oFile, opt)
    
    	'Limpeza dos objetos utilizados
    	set objShell  = nothing
    	set objFolder = nothing
    	set oFile  = nothing
    
    end function
    
    
    'Função que adiciona a linha STR no arquivo FILENAME
    function addToFile(filename, str, opt) 
    
    	'Objetos para inserção no arquivo
    	Set filesys = CreateObject("Scripting.FileSystemObject")
    	Set filetxt = filesys.OpenTextFile(filename, opt, True)
    
    	'Insere a string STR no arquivo
    	filetxt.WriteLine(str)
    
    	'Fecha o arquivo
    	filetxt.Close  
    
    	'Limpeza dos objetos utilizados
    	set filesys = nothing
    	set filetxt = nothing
    
    end function
    
    
    'Formata o campo TAMANHO
    function getFormatedFileSize(size)
    
    	'Giga
    	if size >= (1024*1024*1024) then
    		getFormatedFileSize = Round(size / (1024*1024*1024),2) & " GB"
    		exit function
    	end if
    
    	'Mega
    	if size >= (1024*1024) then
    		getFormatedFileSize = Round(size / (1024*1024),2) & " MB"
    		exit function
    	end if
    
    	'Kilo
    	if size >= (1024) then
    		getFormatedFileSize = Round(size / (1024),2) & " KB"
    		exit function
    	end if
    
    	'Bytes
    	if size < (1024) then
    		getFormatedFileSize = size  & " Bytes"
    		exit function
    	end if
    
    
    end function
    
    Function GetFileOwner(strFile)
    	Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
    	Set colItems = objWMIService.ExecQuery _
    	("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & strFile & "'}" _
    	& " WHERE AssocClass=Win32_LogicalFileOwner ResultRole=Owner")
    	For Each objItem in colItems
    		'Wscript.Echo strFile & " " & objItem.AccountName
    		GetFileOwner = objItem.AccountName
    	Next
    	
    End Function

    Depois que testei fiz mais algumas modificações, apenas no inicio, parametrizando o script na parte de configurações de variaveis, isso foi o que me deu mais trabalho porque o seu script apontava pra lugares que não existiam na minha máquina. Agora ficou mais fácil ler outro drive também, basta mudar a variavel pathStr.


    Fábio de Paula Junior

    sexta-feira, 3 de outubro de 2014 14:32
    Moderador

Todas as Respostas

  • Dudu,

    Tem como você enviar o script com um exemplo de utilização? Assim fica mais fácil testar.



    Fábio de Paula Junior

    quinta-feira, 2 de outubro de 2014 16:31
    Moderador
  • Opa, entao Fabio, ele é utilizado aqui (segue codigo abaixo) e no XP funciona sem problemas mas no win7 ele nao mostra os OWNERS ):
    -----------------------------------------------

    dim pathStr
    dim header
    dim outputFile
    dim strRes

    '################################# VARIAVEIS DE CONFIGURAÇÃO ################################################
    outPutFile = "link do output file(o forum nao deixou eu responder com o link aqui)"
    pathStr = "E:\"
    '############################################################################################################

    'Header - Nome das Colunas analisadas
    header = "NOME_ARQUIVO;DIRETORIO;CAMINHO_COMPLETO;TAMANHO_BYTES;TAMANHO_FORMATADO;PROPRIETÁRIO;DATA_CRIAÇÃO;DATA_ULTIMO_ACESSO;DATA_ULTIMA_MODIFICAÇÃO"

    'Criação do Cabeçalho - Parametro 2: Criação de um novo arquivo destino, ou sobreescreve o arquivo de mesmo nome
    addToFile outPutFile ,header, 2

    'Inicia a função recursiva - Parametro 8: Adiciona no arquivo destino que já existe, sem sobreescrever

    strRes =  readDir(outputFile ,pathStr, 8)

     Const strComputer = "."

     Dim objWMIService, colItems, objItem

     Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
     Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType = '4' AND NAME = 'E:'")

     Dim oShell
     Dim filesys, filetxt

     Set oShell = CreateObject("WScript.shell")
     Set filesys = CreateObject("Scripting.FileSystemObject")
     Set filetxt = filesys.CreateTextFile("C:\Users\VITOHOF\Downloads\RESUMO.txt", True)

     filetxt.WriteLine ("DRIVE SIZE USED")

     For Each objItem In colItems
             filetxt.WriteLine (objItem.Name & " " & objItem.Size & " " & strRes)
     Next

    'Finaliza o processamento
    msgbox "Finished"


    'Função recursiva que armazena a linha com o arquivo
    function readDir(outputFile, dirPath, opt)
     dim i
     dim f
     dim str
            dim fname
     dim fFolder
     dim owner
     dim size
     dim sizet 

     'Criação de objeto FileSytem
     Set objFSO = CreateObject("Scripting.FileSystemObject")
     'Objeto Folder
     Set folder = objFSO.GetFolder(dirPath) 
     'Objeto File
     Set Files = folder.Files
     size = 0
     on error resume next
     For Each file in files
      if err = 0 then

       ' COntrução da String que será armazenada no arquivo
       str = ""
       str = file.name & ";"
       str = str & file.ParentFolder  & ";"
       str = str & file.path & ";"
       str = str & file.size & ";"


       sizet = sizet + file.size

       size = file.size
       str = str & getFormatedFileSize(size) & ";"
       
       fname = file.name
       fFolder = file.ParentFolder
       owner = getEspProp(fname , fFolder,8 )
       
       'Remove o domínio do usuário
       if instr(1,owner,"\") > 0  then
        owner = mid(owner, instr(1,owner,"\") +1)
       end if

       str = str & owner  & ";"
       str = str & file.DateCreated  & ";"
       str = str & file.DateLastAccessed  & ";"
       str = str & file.DateLastModified  & ";"

       'Adiciona linha ao arquivo destino
       addToFile outputFile , str , opt
      else
       err = 0
      end if
     Next

     err = 0
     on error goto 0

     on error resume next
      if err = 0 then
       'Recursividade que acessa todas as subpastas e arquivos
       For Each Subfolder in Folder.SubFolders
        sizet = sizet + readDir(outputFile, subfolder.path, 8)
       next
      else
       err = 0
      end if
     err = 0

     readDir = sizet
     
     on error goto 0
     
     set objFSO = nothing 
     set folder = nothing
     set Files  = nothing
     set file = nothing

    end function


    'Função que retorna a propriedade OWNER, que não é previamente definida no objeto File
    function getEspProp(filename, folder, opt)

     'Objetos Folder e File
     Set objShell = CreateObject ("Shell.Application")
     Set objFolder = objShell.Namespace(folder)
     Set oFile = objFolder.ParseName(filename)

     'Retorno da função
     getEspProp = objFolder.GetDetailsOf(oFile, opt)

     'Limpeza dos objetos utilizados
     set objShell  = nothing
     set objFolder = nothing
     set oFile  = nothing

    end function


    'Função que adiciona a linha STR no arquivo FILENAME
    function addToFile(filename, str, opt) 

     'Objetos para inserção no arquivo
     Set filesys = CreateObject("Scripting.FileSystemObject")
     Set filetxt = filesys.OpenTextFile(filename, opt, True)

     'Insere a string STR no arquivo
     filetxt.WriteLine(str)
     
     'Fecha o arquivo
     filetxt.Close  

     'Limpeza dos objetos utilizados
     set filesys = nothing
     set filetxt = nothing

    end function


    'Formata o campo TAMANHO
    function getFormatedFileSize(size)

     'Giga
     if size >= (1024*1024*1024) then
      getFormatedFileSize = Round(size / (1024*1024*1024),2) & " GB"
      exit function
     end if

     'Mega
     if size >= (1024*1024) then
      getFormatedFileSize = Round(size / (1024*1024),2) & " MB"
      exit function
     end if

     'Kilo
     if size >= (1024) then
      getFormatedFileSize = Round(size / (1024),2) & " KB"
      exit function
     end if

     'Bytes
     if size < (1024) then
      getFormatedFileSize = size  & " Bytes"
      exit function
     end if


    end function

    -----------------------------------------------------------

    quinta-feira, 2 de outubro de 2014 16:59
  • Dudu,

    Tente isto:

    1) adicione esta função

    Function GetFileOwner(strFile)
    	Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
    	Set colItems = objWMIService.ExecQuery _
    	("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & strFile & "'}" _
    	& " WHERE AssocClass=Win32_LogicalFileOwner ResultRole=Owner")
    	For Each objItem in colItems
    		'Wscript.Echo strFile & " " & objItem.AccountName
    		GetFileOwner = objItem.AccountName
    	Next
    	
    End Function

    2) Substitua a linha abaixo

    owner = getEspProp(fname , fFolder,8 )

    por esta

    owner = GetFileOwner(file.path)


    Fábio de Paula Junior

    quinta-feira, 2 de outubro de 2014 18:58
    Moderador
  • Entao, continua na mesma, sem exibir os Owners no .txt após a execução no windows 7 ):
    tem alguma ideia de o que pode ser???

    Obrigado (:
    sexta-feira, 3 de outubro de 2014 13:25
  • Alias, não ta abrindo a janela escrita "finished" quando termina a execução do script agora ): e no XP, tudo normal... Se desse pra ficar usando no XP era tranquilo, mas ta migrando tudo pra 7 aqui e eu realmente nao sei a causa disso ):
    sexta-feira, 3 de outubro de 2014 13:30
  • Dudu,

    Com as modificações que fiz gerou a planilha abaixo

    Mande o seu script modificado.

    Estou executando no Windows 7

    C:\Users\fabio.junior>ver
    
    Microsoft Windows [versão 6.1.7601]
    
    C:\Users\fabio.junior>


    Fábio de Paula Junior

    sexta-feira, 3 de outubro de 2014 13:40
    Moderador
  • ah, ta aparecendo a janela sim, mas ainda sem mostrar os owners no txt ):
    sexta-feira, 3 de outubro de 2014 13:53
  • Por via das dúvidas eu peguei seu script original e fiz as alterações que sugeri (talvez eu tivesse esquecido algo), mas funcionou.

    Segue o script modificado que funcionou pra mim.

    dim pathStr
    dim header 
    dim outputFile
    dim strRes
    
    '################################# VARIAVEIS DE CONFIGURAÇÃO ################################################
    outPutFile = "C:\teste\teste.csv"
    outResumo = "C:\teste\resumo.txt"
    pathStr = "E:\"
    '############################################################################################################
    
    'Header - Nome das Colunas analisadas
    header = "NOME_ARQUIVO;DIRETORIO;CAMINHO_COMPLETO;TAMANHO_BYTES;TAMANHO_FORMATADO;PROPRIETÁRIO;DATA_CRIAÇÃO;DATA_ULTIMO_ACESSO;DATA_ULTIMA_MODIFICAÇÃO"
    
    'Criação do Cabeçalho - Parametro 2: Criação de um novo arquivo destino, ou sobreescreve o arquivo de mesmo nome
    addToFile outPutFile ,header, 2
    
    'Inicia a função recursiva - Parametro 8: Adiciona no arquivo destino que já existe, sem sobreescrever
    
    strRes =  readDir(outputFile ,pathStr, 8)
    
    Const strComputer = "."
    
    Dim objWMIService, colItems, objItem
    
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType = '4' AND NAME = '" & left(pathStr,2) & "'") 'Comment
    
    Dim oShell
    Dim filesys, filetxt
    
    Set oShell = CreateObject("WScript.shell")
    Set filesys = CreateObject("Scripting.FileSystemObject")
    Set filetxt = filesys.CreateTextFile(outResumo, True)
    
    filetxt.WriteLine ("DRIVE SIZE USED")
    
    For Each objItem In colItems
    	filetxt.WriteLine (objItem.Name & " " & objItem.Size & " " & strRes)
    Next
    
    'Finaliza o processamento
    msgbox "Finished"
    
    
    'Função recursiva que armazena a linha com o arquivo
    function readDir(outputFile, dirPath, opt)
    	dim i 
    	dim f
    	dim str
    	dim fname
    	dim fFolder
    	dim owner
    	dim size
    	dim sizet 
    
    	'Criação de objeto FileSytem
    	Set objFSO = CreateObject("Scripting.FileSystemObject")
    	'Objeto Folder
    	Set folder = objFSO.GetFolder(dirPath) 
    	'Objeto File
    	Set Files = folder.Files
    	size = 0
    	on error resume next
    	For Each file in files
    		if err = 0 then
    			' COntrução da String que será armazenada no arquivo
    			str = ""
    			str = file.name & ";"
    			str = str & file.ParentFolder  & ";"
    			str = str & file.path & ";"
    			str = str & file.size & ";"
    
    
    			sizet = sizet + file.size
    
    			size = file.size
    			str = str & getFormatedFileSize(size) & ";"
    
    			fname = file.name
    			fFolder = file.ParentFolder
    			'owner = getEspProp(fname , fFolder,8 )
    			owner = GetFileOwner(file.path)
    
    			'Remove o domínio do usuário
    			if instr(1,owner,"\") > 0  then
    				owner = mid(owner, instr(1,owner,"\") +1)
    			end if
    
    			str = str & owner  & ";"
    			str = str & file.DateCreated  & ";"
    			str = str & file.DateLastAccessed  & ";"
    			str = str & file.DateLastModified  & ";"
    
    			'Adiciona linha ao arquivo destino
    			addToFile outputFile , str , opt
    		else
    			err = 0
    		end if
    		
    	Next
    
    	err = 0
    	on error goto 0
    
    	on error resume next
    	if err = 0 then
    		'Recursividade que acessa todas as subpastas e arquivos
    		For Each Subfolder in Folder.SubFolders
    			sizet = sizet + readDir(outputFile, subfolder.path, 8)
    		next
    	else
    		err = 0
    	end if
    	err = 0
    
    	readDir = sizet
    
    	on error goto 0
    
    	set objFSO = nothing 
    	set folder = nothing
    	set Files  = nothing
    	set file = nothing
    
    end function
    
    
    'Função que retorna a propriedade OWNER, que não é previamente definida no objeto File
    function getEspProp(filename, folder, opt)
    
    	'Objetos Folder e File
    	Set objShell = CreateObject ("Shell.Application")
    	Set objFolder = objShell.Namespace(folder)
    	Set oFile = objFolder.ParseName(filename)
    
    	'Retorno da função
    	getEspProp = objFolder.GetDetailsOf(oFile, opt)
    
    	'Limpeza dos objetos utilizados
    	set objShell  = nothing
    	set objFolder = nothing
    	set oFile  = nothing
    
    end function
    
    
    'Função que adiciona a linha STR no arquivo FILENAME
    function addToFile(filename, str, opt) 
    
    	'Objetos para inserção no arquivo
    	Set filesys = CreateObject("Scripting.FileSystemObject")
    	Set filetxt = filesys.OpenTextFile(filename, opt, True)
    
    	'Insere a string STR no arquivo
    	filetxt.WriteLine(str)
    
    	'Fecha o arquivo
    	filetxt.Close  
    
    	'Limpeza dos objetos utilizados
    	set filesys = nothing
    	set filetxt = nothing
    
    end function
    
    
    'Formata o campo TAMANHO
    function getFormatedFileSize(size)
    
    	'Giga
    	if size >= (1024*1024*1024) then
    		getFormatedFileSize = Round(size / (1024*1024*1024),2) & " GB"
    		exit function
    	end if
    
    	'Mega
    	if size >= (1024*1024) then
    		getFormatedFileSize = Round(size / (1024*1024),2) & " MB"
    		exit function
    	end if
    
    	'Kilo
    	if size >= (1024) then
    		getFormatedFileSize = Round(size / (1024),2) & " KB"
    		exit function
    	end if
    
    	'Bytes
    	if size < (1024) then
    		getFormatedFileSize = size  & " Bytes"
    		exit function
    	end if
    
    
    end function
    
    Function GetFileOwner(strFile)
    	Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
    	Set colItems = objWMIService.ExecQuery _
    	("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & strFile & "'}" _
    	& " WHERE AssocClass=Win32_LogicalFileOwner ResultRole=Owner")
    	For Each objItem in colItems
    		'Wscript.Echo strFile & " " & objItem.AccountName
    		GetFileOwner = objItem.AccountName
    	Next
    	
    End Function

    Depois que testei fiz mais algumas modificações, apenas no inicio, parametrizando o script na parte de configurações de variaveis, isso foi o que me deu mais trabalho porque o seu script apontava pra lugares que não existiam na minha máquina. Agora ficou mais fácil ler outro drive também, basta mudar a variavel pathStr.


    Fábio de Paula Junior

    sexta-feira, 3 de outubro de 2014 14:32
    Moderador
  • Obrigado pela ajuda que vc vem dando, fabio.
    Ta dando caminho nao encontrado, na linha 153, mas realmente ta gerando certinho a planilha ai pra voce! Eu não tenho conhecimento quase nenhum em VBS, mas ficou pra mim fazer isso funcionar, desculpa se eu estiver enchenco muito o saco com erros simples, mas esse caminho nao encontrado eu nao sei o que fazer tambem ):
    sexta-feira, 3 de outubro de 2014 14:46
  • Confere as váriaveis de configuração.

    Fábio de Paula Junior

    sexta-feira, 3 de outubro de 2014 16:01
    Moderador
  • Acabei de fazer isso, passou a dar erro na linha 34 agora, não imaginei que fosse ser tao complicado fazer o script rodar aqui ):
    sexta-feira, 3 de outubro de 2014 16:03
  • Linha 34 é essa?

    Set filetxt = filesys.CreateTextFile(outResumo, True)

    Se for então confira o valor de outResumo lá nas configurções.


    Fábio de Paula Junior

    sexta-feira, 3 de outubro de 2014 16:22
    Moderador