Ir para conteúdo


Luigi

Cadastrado: 20 Ago 2011
Offline Última atividade: Hoje, 01:51
-----

Tópicos que criei

Serviços do Windows (SERVICES)

Ontem, 10:32

Serviços do Windows:
O que é?

 

Onde localizo?

Windows -> Programas -> Ferramentas Administrativas -> Serviços

 

Serviços inúteis.

Mas perceba, que existe serviços inúteis para Windows 95, Windows 98, Windows XP, Windows 8, Windows 10.

Cada versão de OS (Operational System/Sistema Operacional) tem suas características, não existe algo genérico, lembre-se disso antes de cometer um erro.

Dica: sempre pare ou desative o serviço, só remova se tiver certeza absoluta de que ele realmente é inútil.

 

Vou deixar o meu Windows mais rápido se desinstalar o serviço?
Não.

Desativar já é mais do que suficiente, hoje você não o usa, mas amanhã pode ser que use, e reinstalá-lo nas configurações padrão, pode lhe custar algumas horas.
 

 

Posso manipular (iniciar/parar/remover/desativar) qualquer serviço?

Somente aqueles serviços que sua conta no Windows tem privilégios para administrar.

Todo serviço criado possui um owner (proprietário).

Se você é o owner desse o serviço, você tem esse direito (iniciar/parar/remover/desativar).

Se você não o criou, você só vai visualizar, não vai conseguir parar, remover e muito menos iniciar.

 

O que posso usar para manipular um serviço:

 

Posso fazer o meu script ser um serviço?
Sim, pode.

Funciona muito bem, mas uma característica importante de um serviço é: ELE NÃO TEM INTERFACE GRÁFICA!

Então se você quer interagir com um script, rodando como um serviço do Windows, sugiro enfaticamente, que você aprenda como fazer o ScriptA e o ScriptB usando se comunicarem através de IPC.

 

Quais as vantagens de fazer um script rodar como serviço?

Acredito que não vá rodar mais rápido, nem mais lento.

Mas você pode definir prioridades para o seu serviço (baixa, média, alta) e isso já é algo interessante.

Poder executá-lo em uma conta própria, onde outros usuários não terão acesso, então você tem um script "blindado".

 

É muito difícil criar um script como serviço?
Eu diria que inicia com nível de dificuldade médio para difícil.

Envolve conhecimento de vários UDFs do AutoIt e um conhecimento médio de serviço.

 

Não tem algo mais fácil?
Tipo, eu precisava que meu script nunca fosse fechado...
Já olhou a função Break? Ele por si funciona muito bem.

 

Vi o comando Break mas ainda não é o que eu quero... Quero que o script se execute novamente quando for fechado, tem algo assim?

Tem sim jovem gafanhoto: _AlwaysRun() - Monitor a program and restart if it closed

 

Posso criar um serviço oculto?
Boa pergunta! Não tenho conhecimento pra responder isso.

 

O que é um IPC?
IPC significa Inter Process Communication, ou Processo de Inter Comunicação (minha tradução), que nada mais é do que a capacidade de fazer dois scripts que estão sendo executados conversarem entre si.
Exemplo: ScriptA enviando ou recebendo dados do ScriptB.
 
Existem pelo menos 10 formas de IPC já discutidas em posts anteriores aqui no fórum AutoItBrasil e no fórum americano.
Exemplos de IPC:
 
Das 10 formas já discutidas e tentadas (algumas exaustivamente pelo nosso saudoso mentor JScript, eu, Belini), 10 funcionaram muito bem com o ScriptA e o ScriptB rodando na mesma conta.
 
Agora, quando o ScriptA está rodando em uma ContaA, e precisa se comunicar com o ScriptB, que está sendo executado na ContaB, existe somente uma opção que conheço até agora: TCP/IP ou melhor TCPSend/TCPReceive, das outras 9 opções eu tentei exaustivamente, e não consegui fazer funcionar, fica o desafio para você.
 
Na minha opinião, isso é necessário para construir um serviço de forma descente.
Quando você apenas liga o computador e não se autentica, qual é a conta que está usando o serviço?
Nenhuma conta.
Se nenhum usuário está usando o computador, como então rodar um serviço?
 
Você precisa criar uma conta de usuário para o serviço e criar o serviço com uma conta de administrador e configurar o serviço para usar esta conta.
Em algum ponto da configuração do serviço, você informa, "inicializar com o Windows".
 
Então o seu script/serviço passa a funcionar, depois que você liga o Windows, sem você autenticar.
Se você deslogar, seu serviço continua funcionando.
Somente a conta que criou o serviço ou uma conta com direitos administrativos consegue parar/iniciar esse serviço.
Usuários normais, só vão ver o status do seu serviço (se está parado ou rodando) mas não vão conseguir interagir com ele.
Seu serviço só vai parar, se o script der pau ou se o Windows for desligado.
 
Quando você autenticar, seu serviço está lá, funcionando.
Não na sua conta.
 
Mas eu quero uma interface gráfica para o meu serviço!
Beleza, então construa uma, não há problemas em fazer isso, mas vai ter que usar IPC.
No meu entendimento, a maioria dos antivírus são assim, um é o servidor do antivírus e o outro é o cliente/interface gráfica.
O executável do serviço em si, não tem interface gráfica, se você conhece alguma forma de fazer isso, compartilhe comigo por favor, pois até hoje eu não vi algo parecido.
 
Se você está pensando em criar um script para rodar como serviço, é muito importante que somente uma instância do script seja executada, quero dizer, ter apenas um script rodando por vez. Mesmo que você dê um duplo clique em cima dele, ele não deve abrir um novo programa, para prevenir múltiplas instâncias, use o _Singleton.
 
Desafio para os participantes do fórum:
Tem muita gente legal e com bom conhecimento nesse fórum, e tenho certeza de que cada um usa um sistema operacional diferente do outro, seria interessante ter um script genérico, que identificasse em que sistema operacional está sendo executado e parasse os serviços inúteis do Windows baseado em uma lista de serviços!
 
Pensei em algo mais ou menos assim...
  1.  
  2. #include-once
  3. #include <Array.au3>
  4.  
  5. Global $g_aX86WIN_10[] = ["servico inutil 1", "servico inutil 2"]
  6. Global $g_aX64WIN_10[] = ["servico inutil 3", "servico inutil 4"]
  7.  
  8. Global $g_aX86WIN_81[] = ["servico inutil 5", "servico inutil 6"]
  9. Global $g_aX64WIN_81[] = ["servico inutil 7", "servico inutil 8"]
  10.  
  11. Global $g_aX86WIN_VISTA[] = ["servico inutil 9", "servico inutil 10"]
  12. Global $g_aX64WIN_VISTA[] = ["servico inutil 11", "servico inutil 12"]
  13.  
  14. ConsoleWrite("[" & @OSArch & @OSVersion & "]" & @LF)
  15.  
  16. Global $arr = Eval("g_a" & @OSArch & @OSVersion)
  17.  
  18. For $ii = 0 To UBound($arr, 1) - 1
  19. PararServico($arr[$ii])
  20.  
  21. Func PararServico($nome)
  22. ConsoleWrite("Parando o servico inutil '" & $nome & "'" & @LF)
  23. Return True
  24. EndFunc
  25.  
  26.  

 

WEBGRAFIA:

 

Se você acha que eu escrevi alguma informação incorreta, me avise, eu não sei tudo e terei a maior alegria em estudar e melhorar este texto.


Documentação fácil e achando variáveis órfãs

12 agosto 2017 - 01:09

Abra um script qualquer, e escreva no início:

  1.  
  2. #Tidy_Parameters /gd

Depois use um: CTRL + T

 

Preste a atenção na saída do console:

  1.  
  2. >"C:\Program Files (x86)\AutoIt3\SciTE\..\AutoIt3.exe" "C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.au3" /Tidy /in "C:\Dropbox\Ctrl\temp_08.au3"
  3. +>00:59:12 Starting AutoIt3Wrapper v.17.224.935.0 SciTE v.3.7.3.0   Keyboard:00010416  OS:WIN_10/  CPU:X64 OS:X64  Environment(Language:0416)  CodePage:0  utf8.auto.check:4
  4. +>         SciTEDir => C:\Program Files (x86)\AutoIt3\SciTE   UserDir => C:\Users\master\AppData\Local\AutoIt v3\SciTE\AutoIt3Wrapper   SCITE_USERHOME => C:\Users\master\AppData\Local\AutoIt v3\SciTE 
  5. >Running Tidy (17.224.935.0)  from:C:\Program Files (x86)\AutoIt3\SciTE\tidy
  6. Documentation file:C:\Dropbox\Ctrl\temp_08_tidy.txt
  7. +>00:59:12 Tidy ended.rc:0
  8. +>00:59:12 AutoIt3Wrapper Finished.
  9. >Exit code: 0    Time: 0.7259

Preste a atenção nessa linha:

Documentation file:C:\Dropbox\Ctrl\temp_08_tidy.txt

 

Abra o arquivo de texto que foi gerado e procure a seguinte seção:

  1.  
  2. == Variables ======================================================================================================
  3. Variable name             Dim   Used in Row(s)
  4. ========================= ===== ===================================================================================

Por exemplo, no meu script está:

  1.  
  2. $hGUI                     ----- 00034 00037
  3. $hInput                   ----- 00017 00039 00056
  4. $hWnd                     ----- 00050

Isso significa que a variável $hGui foi usada 2 vezes, nas linhas 34 e 37.

A variável $hInput foi usada 3 vezes, nas linhas 17, 39 e 56.

A variável $hWnd só foi usada uma única vez, na linha 50...

Isso significa que ela é uma variável de entrada de função, que nunca foi usada ou é uma variável perdida em algum lugar, que também não foi usada.

 

Enfim, uma forma simples de achar variáveis órfãs no script.

 

De contra partida, fica um documento bonito, gerado automaticamente.

 

Mais informações, veja aqui: https://www.autoitsc...toIt3/Tidy.html


Quanto tempo demora para recuperar/atribuir o valor de uma variável?

30 julho 2017 - 10:18

Olá,

 

Mais um tópico da seção: escovação de bit.

 

Faz alguns dias que eu estava pensando, quando quero resgatar o valor de uma variável para usar, qual a forma mais rápida?

 

O que realmente motivou o teste foi que eu achava que pegar uma variável de um array multidimensional ( quero dizer [n][m] ) poderia ser lento, exemplo:

  1.  
  2. Global $config[2][2] = [[1,2],[3,4]]
  3. ConsoleWrite($config[0][0] & @LF) ; Quanto tempo leva para o AutoIt ir no array, fazer a busca da informação na linha/coluna e trazer de volta a informação?

E fiquei com dúvida, ah, vai que por DllStructCreate é mais rápido, e eu tô aqui marcando bobeira, fazendo um script com um recurso mais lento, então fiz o teste.

 

No AutoIt há várias formas, escolhi apenas 3 delas, se você conhece mais alguma seria interessante acrescentar no exemplo.

 

Arquivo anexado  array x struct x SD.au3   2,78K   7 Downloads

 

No meu computador, o tempo para recuperar as informações foram os seguintes:

array[n][m]..: 201ms

Struct.......: 219ms

Scripting....: 279ms

 

Eu tinha certeza de que o Scripting.Dictionary era o mais lento, pois ele armazena as informações externamente, a partir de uma forma criada por uma DLL do Windows, externa ao AutoIt.

 

Só que o DllStructCreate também usa alguma DLL do Windows...

 

Mas o armazenamento de informações em array é nativo do AutoIt, ele não precisa sair do código, então pelo menos agora, há um teste que demonstra que essa é a forma mais rápida.


Menu de contexto para itens diferentes

25 julho 2017 - 12:08

Olá,

 

Já faz muito tempo que tento resolver uma forma de ter um menu de contexto personalizado para cada elemento da GUI.

Depois de muita pesquisa no fórum americano, muitos tópicos não respondidos, acabei descobrindo uma solução, não sei se é a ideal, mas funciona como eu queria, um menu de contexto personalizado para cada item da GUI.

 

O pulo do gato está na linha 89:

    $try = _GUICtrlMenu_TrackPopupMenu($hMenu, $wParam, -1, -1, 1, 1, 2, 1)

O último parâmetro da função _GUICtrlMenu_TrackPopupMenu atribuído em 1, carrega a variável $try com o valor do menu de contexto clicado, entrando no Switch da linha 92...101.

Assim você consegue resolver o problema.

 

Acredito que os GUIRegisterMsg das linhas 24 e 25 deveriam funcionar, mas não funcionam, estão comentadas para uma futura re-avaliação.

 

Segue script:

 

Arquivo anexado  exemplo_menu_de_contexto.au3   3,91K   7 Downloads


WMI & AutoIt

18 julho 2017 - 08:04

Olá, compartilho alguns pequenos scripts de AutoIt coletando informações diversas através do WMI, veja mais em:
https://github.com/chechelaky/WMI


@Manimal, conforme minha promessa:
https://github.com/c...n32_Account.au3


Alguns são bem simples, e fiz questão de colocar o link da página da Microsoft, para que você possa expandir seus conhecimentos.

O que você pode conseguir com esses scripts?
Coletar a velocidade do processador, quantos núcleos possui, quantos pentes de memória RAM há no PC e as vezes até o número de série do módulo de memória RAM (logicamente, quando o fabricante escreve tal informação, caso contrário é vazio mesmo), quantos monitores há no PC, qual a resolução de cada um, qual o número de série e data de fabricação do monitor, e por aí vai...

 

Precisa de alguma coisa que não está nos exemplos?
Então estude esta página: https://msdn.microso...8(v=vs.85).aspx

 

Ela possui uma grande quantidade de informação, adapte o que você precisa, ouse, erre, corrija e faça dar certo! 8D