Ir para conteúdo


Luigi

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

#13401 Serviços do Windows (SERVICES)

Postado por Luigi em 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.




#13383 WMI & AutoIt

Postado por Luigi em 16 agosto 2017 - 12:36

@Pedro,

 

Veja esse link.

 

Fiz uma pequena adaptação, será que é isso?

  1.  
  2. $oWMISvc = ObjGet("winmgmts:\\" & @ComputerName & "\root\cimv2")
  3. $colDiskDrives = $oWMISvc.ExecQuery("SELECT * FROM Win32_DiskDrive")
  4. For $oDiskDrive In $colDiskDrives
  5. ConsoleWrite("DiskDrive = " & $oDiskDrive.DeviceId & " Caption = " & $oDiskDrive.Caption & "/" & $oDiskDrive.SerialNumber & @LF)
  6.  
  7. $sQuery = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" & $oDiskDrive.DeviceId & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition"
  8. $colPartitions = $oWMISvc.ExecQuery($sQuery)
  9.  
  10. For $oPartition In $colPartitions
  11. ConsoleWrite(@TAB & "Partition = " & $oPartition.DeviceId & @LF)
  12.  
  13. $sQuery = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & $oPartition.DeviceId & "'} WHERE AssocClass = Win32_LogicalDiskToPartition"
  14. $colLogicalDisks = $oWMISvc.ExecQuery($sQuery)
  15.  
  16. For $oLogicalDisk In $colLogicalDisks
  17. ConsoleWrite(@TAB & @TAB & "LogicalDisk = " & $oLogicalDisk.DeviceId & @LF)
  18.  
  19.  



#13379 COMO FAZER UM PROGRAMA REABRIR AUTOMATICAMENTE COM UM SCRIPT

Postado por Luigi em 14 agosto 2017 - 06:41

Olá, eu não faria um script pra isso, eu usaria o nssm.




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

Postado por Luigi em 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




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

Postado por Luigi em 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.




#13325 Sistema Gestão x AutoIT

Postado por Luigi em 29 julho 2017 - 09:10

Olá @muekita,

 

Ajudaria muito se você pudesse dar mais detalhes sobre o sistema que você quer automatizar.

 

Por exemplo: automatizar um LibreOffice (que é feito em java) é complicado...

O AutoIt não consegue "pegar" as handles dos controles.

Mas isso não é regra, tenho pouca experiência com este ramo de automatização.

 

Se o programa for um .exe (Delphi, C, etc), onde o AutoIt consegue pegar facilmente todos os "handles" dos controles, a automatização é bem mais fácil.

 

Se for a automatização de uma página de internet, depende:

Algumas páginas são renderizadas em HTML puro, as chances são muito boas.

Outras páginas são renderizadas SilverLight, eu pessoalmente fiz algumas tentativas e não consegui.

 

 

Mas a mãe de toda a automação é o AU3Info.

Abra o Scite, vá no menu TOOLS, e ache o AU3Info (CTRL + F6).

Na ferramenta "Finder Tool" (parece uma mira), clique e arraste para cima do controle, se as informações na TAB Window forem mudando de acordo como você vai navegando, a possibilidade de automatizar é muito grande, pois você consegue escrever o código para selecionar e tomar uma ação para os "handles", agora, se eles ficaram em branco, xi... É muito complicado.

 

Existe um tipo de automação que você pode fazer com o AutoIt, que é movimentar o mouse, clicar, digitar, apenas baseado em coordenadas x,y da tela.

Mas se for uma página HTML, quando mudar o CSS, toda a automatização que você escreveu vai falhar, pois ela não estava achando os controles por "handles" (isso significa que eles podem estar em qualquer posição), mas sim por x,y, que pode mudar a qualquer momento (pelo zoom do navegador, pelo tamanho da fonte do Windows, por mudança do estilo da página).

Esse tipo de automatização é muito volátil.

 

Forneça mais informações.

 

Até mais.




#13312 Menu de contexto para itens diferentes

Postado por Luigi em 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




#13306 Manipulação de registro 32/64 bits em SO diferentes

Postado por Luigi em 24 julho 2017 - 06:42

Como era de se esperar, o nível dos participantes e complexidade das perguntas no fórum está evoluindo, isso é bom!

 

Até onde sei e li, essa é a primeira pergunta desse teor aqui no fórum, se estiver enganado, por favor, me corrijam.

 

E você já parou para pensar o que é desenvolver um script AutoIt para Windows?

Não é somente para a versão de Windows que está rodando na sua máquina, é para várias versões, que inclui:
Windows XP (maioria esmagadora de 32 bits, mas eu mesmo já trabalhei com a 64 bits);

Windows Vista (sei que a maioria é 32 bits, mas não ouso dizer quantos são 64 bits);

Windows Seven

Windows 8

Windows 8.1

WIndows 10

 

Mais versões veja aqui.

 

Aqui nesta páginavocê tem uma ideia das estatísticas.

 

Interessante notar, que Windows 7 e Windows 10, de certa forma estão empatados, com aproximadamente trinta e alguma coisa porcento cada um, somados vão para sessenta e alguma coisa.

 

Isso é interessante, se você quer criar um "script popular", quais são as verões de Windows que mais ocupam fatia de mercado? Windows 7 e Windows 10.

 

No caso o Pedro diz que tem Windows 10, instale uma VM de Windows 7, e assim já tem representada mais da metade das máquinas!

 

Mas e o resto? E os outros sistemas da Microsoft?

Bem... Não quero dar uma resposta marota (não é pessoal, é para todos, inclusive pra mim), mas lá vai:

"Você já ganhou dinheiro suficiente com o seu script no Windows 7 e Windows 10 para pagar o seu tempo investido?

Será que vale a pena investir tempo nos outros sistemas, que já estão dentro da cova esperando que algum mísero humano jogue umas pás de terra em cima?

E talvez quem ainda esteja usando um Windows XP, Vista, seja porque não tem dinheiro para trocar de máquina, e você acha que ele vai gastar dinheiro comprando/alugando o seu script? E mesmo assim você quer desenvolver para um pão duro desses?

Se você respondeu sim, posso lhe pagar R$ 1,00 por hora para trabalhar pra mim?"




#13298 WMI & AutoIt

Postado por Luigi em 24 julho 2017 - 07:57

If WMI = parado Then
script para, alerte usuario para resolver o wmi
Then
script funciona
EndIf


#13254 WMI & AutoIt

Postado por Luigi em 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




#13214 Serial Windows

Postado por Luigi em 07 julho 2017 - 12:54

Se estamos falando de proteção de software, através de seriais seja windows, HD, etc, prefiro fazer um controle online (quando possível).

 

Aproveitando post e a função do Luigi, tenho uma função que lê a quantidade de usuários no windows através da chave HK_USERS.

 

Será que existe alguma função do Windows estilo object (winmgmts) que retorne esta quantidade?

 

Obrigado.

sim, existe, quantos e quais.

depois eu compartilho.




#13201 SEND() ta abrindo Corel Draw

Postado por Luigi em 06 julho 2017 - 01:39

ao invés de usar o send, use ClipPut e ClipGet, vulgo ctrl+c e ctrl+v

 

se bem que existem udfs pra manipular, enviar pelo gmail, mais facil do que automatizar da forma manual




#13189 Serial Windows

Postado por Luigi em 04 julho 2017 - 06:22

Agora lendo o post com mais atenção, entendi o que o @Marcos quer...

 

Veja bem, o Windows evoluiu com o passar do tempo mas alguns scripts não.

 

O Script que pegava o Serial do Windows XP (AAAAA-BBBBB-CCCCC-DDDDD-EEEEE), ainda funciona para pegar o serial do Windows XP, exemplo:

  1.  
  2. $sSerial = ''
  3. $oFso = ObjCreate("Scripting.FileSystemObject")
  4. $oSNSet = ObjGet("winmgmts:")
  5. $oWinOS = $oSNSet.InstancesOf("Win32_OperatingSystem")
  6. For $oSN in $oWinOS
  7. If $oSN.SerialNumber Then
  8. $sSerial = $oSN.SerialNumber
  9. ExitLoop
  10. EndIf
  11. MsgBox(64, 'Serial', $sSerial)
  12.  

Mas não significa que vai funcionar no Windows 7, muito menos no Windows 10.

 

As chaves do registro onde as coisas ficavam armazenadas antes, talvez não estejam no mesmo local em outro sistema operacional, e com certeza, a forma de proteger os dados, como o número de série também evoluiu, afinal de contas, a Microsoft não iria colocar o número de série do Windows em texto puro em uma chave de registro né?

 

Existe um script que pegue de qualquer Windows? Ainda não vi.

 

Outro dia eu precisava pegar o serial do meu Windows 10 (é sempre bom né), pesquisei no fórum americano e o que encontrei lá não deu certo...

Apelei para um script de PowerShell e funcionou de primeira.

 

Posso compartilhar o script que desenvolvi na época, mas seria interessante cada um testar e ver se funciona e dar um feedback aqui:

  1.  
  2. #include <Array.au3>
  3.  
  4. Local $var = windows_info()
  5. _ArrayDisplay($var)
  6.  
  7. Func windows_info()
  8. Local $func[2][13] = [ _
  9. ["BuildNumber", "BuildType", "Caption", "CSDVersion", "CSName", "InstallDate", "LastBootUpTime", "LocalDateTime", "NumberOfUsers", "RegisteredUser", "SerialNumber", "WindowsDirectory", "cd_key"], _
  10. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] _
  11. ]
  12. Local $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\cimv2")
  13. Local $arrName = StringSplit("BuildNumber,BuildType,Caption,CSDVersion,CSName,InstallDate,LastBootUpTime,LocalDateTime,NumberOfUsers,RegisteredUser,SerialNumber,WindowsDirectory", ",", 2)
  14. ;~ Local $arr = _Array2D_from_1d($arrName, "cd_key")
  15. Local $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem ", "WQL", 0x30)
  16. Local $data
  17. If IsObj($colItems) Then
  18. For $objItem In $colItems
  19. ;~ ReDim $arr[UBound($arr, 1) + 1][UBound($arr, 2)]
  20. For $jj = 0 To UBound($arrName) - 1
  21. $data = Execute("$objItem." & $arrName[$jj])
  22. Switch $jj
  23. Case 0
  24. $func[1][0] = Number($data)
  25. Case 1
  26. $func[1][1] = Number($data)
  27. Case 2
  28. $func[1][2] = String($data)
  29. Case 3
  30. $func[1][3] = String($data)
  31. Case 4
  32. $func[1][4] = String($data)
  33. Case 5
  34. $func[1][5] = _wmi_DateStringToDateTime($data)
  35. Case 6
  36. $func[1][6] = _wmi_DateStringToDateTime($data)
  37. Case 7
  38. $func[1][7] = _wmi_DateStringToDateTime($data)
  39. Case 8
  40. $func[1][8] = Number($data)
  41. Case 9
  42. $func[1][9] = String($data)
  43. Case 10
  44. $func[1][10] = String($data)
  45. Case 11
  46. $func[1][11] = String($data)
  47. EndSwitch
  48. $func[1][12] = String(GetWindowsProductKey())
  49. Return $func
  50. Else
  51. Return $arrName
  52. EndIf
  53. EndFunc ;==>windows_info
  54.  
  55.  
  56. Func GetWindowsProductKey()
  57. ;~ http://www.autoitscript.com/forum/topic/131797-windows-and-office-key/page-2#entry1041055
  58. Local Const $iKeyOffset = 52
  59. Local $sHKLM = "HKLM", $ii
  60. If @OSArch = "X64" Then $sHKLM &= "64"
  61. Local $bKey = RegRead($sHKLM & "\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "DigitalProductId")
  62. Local $aKeys[BinaryLen($bKey)]
  63. For $ii = 0 To UBound($aKeys) - 1
  64. $aKeys[$ii] = Int(BinaryMid($bKey, $ii + 1, 1))
  65. Local Const $isWin8 = BitAND(Int($aKeys[66]) / 6, 1)
  66. $aKeys[66] = BitOR(BitAND($aKeys[66], 0xF7), BitAND($isWin8, 2) * 4)
  67. $ii = 24
  68. Local $sChars = "BCDFGHJKMPQRTVWXY2346789", $iCur, $iX, $sKeyOutput, $iLast
  69. While $ii > -1
  70. $iCur = 0
  71. $iX = 14
  72. While $iX > -1
  73. $iCur *= 256
  74. $iCur = $aKeys[$iX + $iKeyOffset] + $iCur
  75. $aKeys[$iX + $iKeyOffset] = Int($iCur / 24)
  76. $iCur = Mod($iCur, 24)
  77. $iX -= 1
  78. WEnd
  79. $ii -= 1
  80. $sKeyOutput = StringMid($sChars, $iCur + 1, 1) & $sKeyOutput
  81. $iLast = $iCur
  82. WEnd
  83. If $isWin8 Then
  84. Local Const $sKeyPart1 = StringMid($sKeyOutput, 2, $iLast)
  85. Local Const $sInsert = "N"
  86. $sKeyOutput = StringReplace(StringTrimLeft($sKeyOutput, 1), $sKeyPart1, $sKeyPart1 & $sInsert, 1)
  87. If Not $iLast Then $sKeyOutput = $sInsert & $sKeyOutput
  88. EndIf
  89. Local $key = StringRegExpReplace($sKeyOutput, '(\w{5})(\w{5})(\w{5})(\w{5})(\w{5})', '\1-\2-\3-\4-\5')
  90. ConsoleWrite("$key[ " & $key & " ]" & @LF)
  91. Return $key
  92. EndFunc ;==>GetWindowsProductKey
  93.  
  94.  
  95. Func _wmi_DateStringToDateTime($value)
  96. If Not $value Then Return ""
  97. ; http://technet.microsoft.com/en-us/library/ee156576.aspx
  98. ; converte uma data WMI do formato [20131101233010.000000-120] para [11/01/2013 23:30:10]
  99. ; caso os últimos 3 digitos sejam "000" não retorna as horas
  100.  
  101. Switch StringRight($value, 3)
  102. Case "000"
  103. Return StringMid($value, 7, 2) & "/" & StringMid($value, 5, 2) & "/" & StringLeft($value, 4)
  104. Case Else
  105. Return StringMid($value, 7, 2) & "/" & StringMid($value, 5, 2) & "/" & StringLeft($value, 4) & " " & StringMid($value, 9, 2) & ":" & StringMid($value, 11, 2) & ":" & StringMid($value, 13, 2)
  106. EndSwitch
  107. EndFunc ;==>_wmi_DateStringToDateTime
  108.  



#13183 Serial Windows

Postado por Luigi em 04 julho 2017 - 11:31

depende de cada placa mãe, algumas tem serial na placa mae, na bios, outras simplesmente nao tem.

sugiro fazer um codigo que reconheca quando nao ha esse tipo de informacao.

uma dica interessante é usar o unique hardware id do autoit, veja no helop, funciona bem, ate formatar, dai sera outro unique hardware id.


#13174 AutoIT com SAP/R3

Postado por Luigi em 03 julho 2017 - 01:43

Olá @rafig,

 

Eu também uso SAP na empresa onde trabalho, e automatizar com AutoIt depende do gestor/administrador do SAP liberar um objeto .dll ou .ocx para interação ou configuração, caso contrário, não vai funcionar mesmo.

 

No meu caso, a empresa não libera e assunto encerrado, resta-me fazer tudo na mão.

 

Há poucos exemplos no fórum americano do AutoIt, reservo-me o direito de não fazer um copia e cola, pois é pouca coisa para procurar sobre o assunto e está bem redigido.

 

Lamento não ter mais conhecimento para compartilhar sobre este assunto.