Ir para conteúdo
Fórum Script Brasil
  • 0

VB e MS-DOS


kkkiler

Pergunta

12 respostass a esta questão

Posts Recomendados

  • 0

Vou aproveitar o tópico pra tirar outra dúvida:

Tem jeito de abrir um programa pelo vb utilizando o recurso "Executar como..."(que aparece clicando com o botão direito em um aplicativo).Na verdade, abrir um programa como um outro usuário, pelo vb.Por exemplo, eu coloco lá no vb "shell 'cmd' as administrator 123456", onde os números são a senha do administrador. Então, tem como fazer isso pelo vb?

O fato é q eu quero copiar um arquivo logado como um usuário sem privilégio, para uma pasta do usuário com privilégio(administrador).

Se isso não der certo, teria um jeito de dar todos os privilégios possíveis a um usuário comum para usar o dos? Sei la, liberar os privilégios administrativos pra o usuário comum usar o dos, sem que ele tenha que clicar com o botão direito, "Executar como...".Tenho certeza que é possível esta última opção :)

Aguardando resposta...

Link para o comentário
Compartilhar em outros sites

  • 0

Ok, vamos por partes:

1° Eu já testei o runas. Eu testei usando o explorer como administrador.Consegui apenas copiar o arquivo a mão(botão direito), mas não consegui fazê-lo pelo DOS ou pelo vb. Então eu descobri que na verdade eu tinha que executar o dos como administrador. Esse é o problema. Como executar o dos como admin pelo vb? Ou mesmo por um arquivo bat? Além disso, há um momento que é preciso digitar a senha do administrador no prompt de comando, ou seja, eu tentei de tudo, mas esse comando insiste que eu digite a senha na tela preta.Fiz até um bat pra ver se dava certo, mas eu sempre tive que digitar a senha na tela. Eu quero que o programa faça isso, sem eu precisar digitar.

2°Quanto ao componente...bem, primeiro vou dizer que eu tinha dado uma pausa nesse assunto e fui fazer outras coisas no vb. Antes de te perguntar pelo primeira vez do assunto, eu já tinha encontrado um compilador que fazia a tarefa, mas como eu sou teimoso B) , eu não quis usar pois so quero fazer pelo vb(o dos não conta). Dae quando eu voltei pro assunto, eu olhei o componente, achei muito complicado xP e fui procurar se tinha outra solução. Achei o runas, que no fim das contas não deu certo.

Enfim... acho que vou ter que aprender a usar o componente mesmo, ou eu uso o compilador hahaha(se você souber alguma coisa do uso desse componente, me fala porque eu já dei uma olhada e parece muito complicado)

Link para o comentário
Compartilhar em outros sites

  • 0

e se você escrever a senha por codigo pelo proprio visual basic?? tipo, você da runas no bat, ai ele pede pra digitar a senha. ai você usa a api sendmessage. ou pode usar o componente XComm do Graymalkin. veja esse link aqui: http://scriptbrasil.com.br/forum/index.php?showtopic=9403

mas tipo, quando você digita a senha na tela preta, ele aparece asteriscos ou aparece a senha de verdade?? se você precisar esconder a janela, acho q você pode usar a api showwindow.

quanto ao componente tb achei complicado heeeheh, mas nem tentei usar, mas se nd der certo, seria uma opcao estuda-lo.

Link para o comentário
Compartilhar em outros sites

  • 0

Eu quero fazer usando essa API aí... o único problema é que eu não entendi como usá-la(sim, eu olhei o post do Graymalkin) e também procurei em outros lugares.Estou com dificuldade. Você não pode me dar um exemplo prático usando essa api para se comunicar com o dos, enviando uma mensagem a ele? Eu não entendi direito como declara a API, nem como envia a mensagem

Não quero usar a dll do graymalkin. porque? porque quero aprender a pescar, não quero o peixe pronto :D. Depois que eu aprender, quem sabe eu uso ne hehe

Daí eu vou fazer assim: Usando o runas, vou abrir outra tela dos como admin, digitando a senha usando API(ou por acaso tem jeito de abrir o dos como admin pelo vb?). Nessa tela irei digitar o comando para copiar o arquivo, também usando API. È isso. Só preciso entender como q usa haha

Editado por kkkiler
Link para o comentário
Compartilhar em outros sites

  • 0
Daí eu vou fazer assim: Usando o runas, vou abrir outra tela dos como admin, digitando a senha usando API(ou por acaso tem jeito de abrir o dos como admin pelo vb?). Nessa tela irei digitar o comando para copiar o arquivo, também usando API. È isso. Só preciso entender como q usa haha

bom, eu tinha pensado em você escrever o bat em por codigo visual basic, e abrir o bat com o runas. apesar q você tinha dito q não queria usar bat, entenda q dessa forma você pode fazer "como se o bat não existisse". você escreve o bat, salva temporariamente, roda e apaga. acho q seria mais "bem-feito" do que digitar o texto todo na janela, entende?? principalmente se forem varios comandos.

a ideia q eu tinha passado do sendmessage era só para a senha, q ele pediria no runas.

a e entenda tb q nunca tentei usar o runas. aqui no meu pc, só existe um usuario, q é o admin (e sem senha) e não da pra testar, então não posso te dar mta ajuda nos procedimentos do runas, mas se ele ta pedindo a senha, dei a ideia de como você digitar a senha.

o codigo pode acabar ficando simples ou complicado, dependendo exatamente do q você precisa e como você implementar, mas da pra dexar funcionando legalzinho se for bem trabalhado, alem de q nem vai ser tão complexo quanto parece.

bom o graymalkin tinha os exemplos certinhos la. mas pra usar o FindWindow, você faz assim ó:

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
aqui na janela do dos aparece escrtio, no titulo, o texto C:\WINDOWS\system32\cmd.exe então é esse q você vai procurar (note q ele adiciona o nome do bat tb no titulo da janela, ai você tem q ver certinho como vai ficar o nome da janela):
hWindow = FindWindow(vbNullString, "C:\WINDOWS\system32\cmd.exe")
o FindWindow vai gravar o enderco da janela na variavel hWIndow, entendeu?? assim, sempre q você precisar acessar a janela, você vai passar esse endereco. mas tipo, não use o FindWindow imediatamente depois de abrir a janela, pois normalmente demora-se algumas fracoes de segundo pra ela aparecer. ou você pode o FindWindow num loop ate ele achar a janela (se o hWindow for <> 0 significa q achou), ou habilita um timer e espera 1 ou 2 segundos pra chamar o FindWindow. bom, tem um problema q eu não tinha previsto quando postei antes. se você mandar o sendmessage com o settext com o hwnd da janela ele vai escrever no titulo da janela. normalmente, a gente procura o hwnd de um textbox e escreve nele. mas na janela do dos fica dificil, testei e não consegui de nenhum jeito aqui. não sei se você encontrou alguma forma, mas isso não tem mta importancia, porque existe um modo 1.123.098.034 de vezes mais simples do q o sendmessage: você pode simplesmente por o foco na janela e usar o SendKeys, é bem menos complexo. é só colocar foco na janela do dos e mandar o texto. você pode abrir com o shell com o vbFocus no segundo parametro e se você ajeitar certinho, talvez nem do FindWindow você precise, mas se você tiver problemas com o foco, pode usar a API:
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
se você fizer:
SetForegroundWindow hWindow
ele coloca a janela em foco (lembre-se q o hWindow você vai achar pelo FindWindow). ai mande o texto tipo:
SendKeys "senha"
e pra mandar o enter:
SendKeys "{ENTER}"
o unico problema q você pode ter com o SendKeys é com tempo, tipo, seu programa pode estar executando codigos antes da janela ter recebido o texto, nesse caso você pode ter q adicionar um timer, mas se você conseguir implementar certinho, é pra funcionar sem problemas. ai se precisar esconder a janela, pode usar a api:
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Boolean
ShowWindow hWindow, 0 'Isso esconde
ShowWindow hWindow, 5 'Isso mostra[/code]

e pode ficar tranquilo q tanto o SetForegroundWindow quanto o SendKeys funcionam com a janela escondida.

bom, não sei quanto a parte do runas, e de digitar a senha, tudo, mas pelo menos pra escrever o texto na janela esta tudo testado aqui e funcionou certinho. então se você tiver problemas nessa parte, muito provavelmente é o esquema do timer, ai qualquer coisa poste ai. e se você conseguir manejar foco certinho, tlavez nem precise das apis.

ve se deu pra entender ai e se você consegue fazer, qualquer coisa poste.

EDITADO:

nos proximos dois dias, vai ser meio dificil de eu entrar no forum, entoa não tenha pressa pras respostas, beleza??

Editado por kuroi
Link para o comentário
Compartilhar em outros sites

  • 0

Eu estive ausente por um tempinho... agora voltei, e acabei d testar o método do sendkeys. Eu não sei o q estou fazendo d errado, simplesmente não está enviando a mensagem. Veja como eu coloquei:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

Private Sub Command1_Click()
hWindow = FindWindow(vbNullString, "C:\WINDOWS\system32\cmd.exe")
If hWindow Then
SetForegroundWindow hWindow
SendKeys "ipconfig"
End If
End Sub

Bom, devo avisar que eu estou deixando a janela aberta antes de executar o programa. Fiz alguns testes e percebi que está tudo funcionando, com exceção de enviar a mensagem. Na verdade, se eu fico dando muitos cliques, uma vez ou outra aparece a última letra da mensagem.Enfim, estou quase lá xD

Edit

Fiz o teste em um bloco de notas, deu o mesmo problema, so q depois q eu clico um tempinho o programa envia a mensagem inteira, dae eu tenho q fica clicando até enviar(depois que envia a primeira vez, se eu quiser enviar outra, eu tenho q continuar clicando até enviar)

Edit

Opaopa.... que coisa estranha. O meu código está funcionando, mas só quando o dos está minimizado na hora que eu executo o programa. Ou seja, se o dos aqui estiver maximizado e eu enviar a mensagem, não vai acontecer nada, mas se o dos estiver minimizado, ele envia normalmente. Que bizarro... nota que isso que eu falei não vale pro "enter". Este funciona tanto se o dos estiver minimizado ou não. Bom, quando o dos está minimizado, ele maximiza na primeira vez q eu clico, dae eu minimizo e não maximiza +.Explica pra mim isso... e a solução, que eu não to entendendo nada.

Editado por kkkiler
Link para o comentário
Compartilhar em outros sites

  • 0

provavelmente é isso q eu falei:

o unico problema q você pode ter com o SendKeys é com tempo, tipo, seu programa pode estar executando codigos antes da janela ter recebido o texto, nesse caso você pode ter q adicionar um timer, mas se você conseguir implementar certinho, é pra funcionar sem problemas.

provavelmente funciona quando o dos esta minimizado, porque como não precisa mostrar o caracter na tela, o tempo de processamento é menor.

antes de usar o sendkeys tenta adicionar um timer de 1 segundo, e só chamar o sendkeys depois de um segundo e veja o q da.

se não resolver, tente fazer o teste de enviar uma teclar por vez. sei la, ponha um timer e envie um caracter a cada meio segundo so de teste pra ver.

Link para o comentário
Compartilhar em outros sites

  • 0

opa a dica do loop q eu tinha dado era pro findwindow, porque se você usar o shell e logo depois o findwindow, a janela demoraria algumas fracoes de segundo pra carregar, e o findwindow falharia se fosse executado antes de ela carregar.

ai você podia usar um timer ou por em loop ate encontrar a janela.

pro sendkeys acho q o jeito é com o timer mesmo. a não ser q o visual basic tenha alguma funcao tipo o delay() do pascal (q espera um determinado tempo pra continuar a execucao do codigo), mas nunca vi isso, sempre uso timer pra trabalhar com tempo.

ou você tb pode por um loop q qualquer pra esperar um certo tempo. tipo, delcare a variavel x com valor 0, e enquanto for menor q, por exemplo 2000, vai somando 1. ai ele vai levar alguns segundos (ou milisegundos) pra chegar em 2000. pode parecer uma gambiarra, mas pelo menos o codigo fica mais simples, mas na verdade acho q é possivel q isso não funcione, porque ele estara executando codigo a todo momento, e o timer vai justamente dar um pause entre uma linha e outra.

EDITADO:

na epoca q escrevi isso, eu ainda não conhecia a funcao Sleep() da "kernel32". não testei aqui, mas se não me engano em algum outro tópico, um membro q não me lembro quem era comentou q funciona.

ela é muito mais simples do q usar um timer:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Command1_Click()
    MsgBox "begin"
    Sleep 10000 'espera 10 segundos
    MsgBox "end"
End Sub[/code]

(codigo retirado de http://www.freevbcode.com/ShowCode.Asp?ID=7556)

Editado por kuroi
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...