Meu objetivo é enviar algumas informações (url e um token único) para uma máquina com Windows. Ele está funcionando bem para servidores GNU / Linux, porque eu recebo as informações de /var/lib/dhcp/dhcp.lease ou similar. Esta é minha configuração:
servidor dhcp (servidor GNU / Linux):
host windows {
dynamic;
hardware ethernet XX:XX:XX:XX:XX:XX;
fixed-address 10.70.10.107;
supersede vendor-encapsulated-options "http://URL/TOKEN";
}
A única maneira que encontrei para obter essas informações no servidor do Windows está no registro. Ao adicionar aqui , em HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ services \ Tcpip \ Parâmetros \ Interfaces {ID} você pode encontrar a chave chamada DhcpInterfaceOptions .
O problema é que as informações nesta chave estão "corrompidas". Vou tentar explicar.
Com o Wireshark, posso ver uma resposta DHCP bem formada do meu servidor DHCP com um conjunto de opções 43. Esta opção contém exatamente o que estou procurando. Quando eu tento lê-lo no registro contém um monte de lixo e uma parte da URL está faltando.
As opções de DHCP RFC 2132 definem o seguinte protocolo:
Code Len Vendor-specific information
+-----+-----+-----+-----+---
| 43 | n | i1 | i2 | ...
+-----+-----+-----+-----+---
Eu observei que o Windows está fazendo algo semelhante depois de obter a opção. Quer dizer, se o URL é ' link ', o windows faz o 'h' como ID, 't' como o comprimento e começa a ler depois o segundo 't'. Meu URL é maior que o último caractere imprimível ASCII (~) e não consigo fazer nenhuma solução alternativa sobre isso.
Atualização 1
Captura WireShark:
Option: (t=43,l=16) Vendor-Specific Information
Option: (43) Vendor-Specific Information
Length: 16
Value: 687474703a2f2f55524c2f544f4b454e (http://URL/TOKEN)
Registro do Windows:
"DhcpInterfaceOptions"=hex:06,00,00,00,00,00,00,00,08,00,00,00,00,00,00,00,52,\
45,b7,4f,0a,46,0a,01,08,08,08,08,03,00,00,00,00,00,00,00,04,00,00,00,00,00,\
00,00,52,45,b7,4f,0a,46,0a,01,0f,00,00,00,00,00,00,00,0f,00,00,00,00,00,00,\
00,52,45,b7,4f,74,50,1f,2b,6f,61,6f,75,75,6a,3f,64,6e,77,2e,00,01,00,00,00,\
00,00,00,00,04,00,00,00,00,00,00,00,52,45,b7,4f,ff,ff,ff,00,36,00,00,00,00,\
00,00,00,04,00,00,00,00,00,00,00,52,45,b7,4f,0a,46,0a,01,35,00,00,00,00,00,\
00,00,01,00,00,00,00,00,00,00,52,45,b7,4f,05,00,00,00,fc,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,2a,bd,b6,4f,33,00,00,00,00,00,00,00,04,00,00,00,\
00,00,00,00,52,45,b7,4f,00,00,8c,a0
Atualização 2
Se a URL for menor que o tamanho definido no protocolo do Windows , a URL não será mostrada no registro. No meu caso, 'h' será o identificador e 't' o tamanho (116). Se o URL for:
http://AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
O registro contém algo como eu colei anteriormente. O URL tem exatamente 117 caracteres, mas usamos 2 para id e size. isso significa que os dados são 115. Não é suficiente.
se eu adicionar um "A" ao meu URL:
http://AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Em seguida, o registro contém:
"DhcpInterfaceOptions"=hex:68,00,00,00,00,00,00,00,74,00,00,00,01,00,00,00,62,\
0e,bb,4f,74,70,3a,2f,2f,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,\
41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,\
41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,\
41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,\
41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,06,00,00,00,00,00,\
00,00,08,00,00,00,00,00,00,00,62,0e,bb,4f,0a,46,0a,01,08,08,08,08,03,00,00,\
00,00,00,00,00,04,00,00,00,00,00,00,00,62,0e,bb,4f,0a,46,0a,01,0f,00,00,00,\
00,00,00,00,0f,00,00,00,00,00,00,00,62,0e,bb,4f,75,61,4a,1f,31,4c,ca,11,55,\
6f,2e,63,1f,6d,fe,00,01,00,00,00,00,00,00,00,04,00,00,00,00,00,00,00,62,0e,\
bb,4f,ff,ff,ff,00,33,00,00,00,00,00,00,00,04,00,00,00,00,00,00,00,62,0e,bb,\
4f,00,00,8c,a0,36,00,00,00,00,00,00,00,04,00,00,00,00,00,00,00,62,0e,bb,4f,\
0a,46,0a,01,35,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,62,0e,bb,4f,05,\
00,00,00
41 é a representação hexadecimal de 'A'.