Conseguir que los equipos de servidor dns
el Código para recuperar los equipos de servidor DNS que funciona en Windows 9x/ME y 2000/XP, independiente de IpHelper API, etc.
he visto publicaciones en varios grupos de noticias y programación de sitios preguntando cómo conseguir que los equipos de servidor DNS. He probado este 'hack' método en el '95, '98, ME, NT, 2000 y XP y funciona bien... el IpHelper API requiere Windows 2000.
& [snip] &
unidad de BaclDnsHelper
interfaz
usos
& nbsp & nbsp SysUtils,
& nbsp & nbsp Clases,
& nbsp & nbsp Windows
función GetDnsIp : string
aplicación
const
& nbsp & nbsp //
& nbsp & nbsp // NOTA: Para '9x, debemos usar /lote o la interfaz gráfica de usuario aparecerá, por lo que
& nbsp & nbsp // usamos un archivo ficticio
& nbsp & nbsp //
& nbsp & nbsp IPCFG_DUMMY_FILE = '_dmytmpdns.tmp'
& nbsp & nbsp IPCFG_WIN9X = 'winipcfg.exe /todos /lote '/ / _dmytmpgdns.txt'
& nbsp & nbsp IPCFG_WINNT = 'ipconfig.exe /all'
& nbsp & nbsp IPCFG_DNS_SERVER_LINE = 'Servidores DNS'
& nbsp & nbsp REG_NT_NAMESERVER_PATH =
& nbsp & nbsp & nbsp & nbsp 'System/CurrentControlSet/Services/Tcpip/Parameters'
& nbsp & nbsp REG_NT_NAMESERVER = 'DhcpNameServer'
& nbsp & nbsp REG_9X_NAMESERVER_PATH = 'System/CurrentControlSet/Services/MSTCP'
& nbsp & nbsp REG_9X_NAMESERVER = 'servidor de nombres'
función BackSlashStr (const s : string) : string
begin
& nbsp & nbsp Resultado := s
& nbsp & nbsp si el Resultado[de Longitud(Resultado)] <> '/' entonces
& nbsp & nbsp & nbsp & nbsp Resultado := Resultado '/'
fin
función GetWindowsPath : string
var
& nbsp & nbsp Temp : array [0..MAX_PATH] of char
begin
& nbsp & nbsp GetWindowsDirectory (Temp, SizeOf(Temp))
& nbsp & nbsp Resultado := BackSlashStr (Temp)
fin
función GetSystemPath : cadena
var
& nbsp & nbsp Temp : array [0..MAX_PATH] of char
begin
& nbsp & nbsp GetSystemDirectory (Temp, SizeOf(Temp))
fin
función LooksLikeIP(StrIn: string): boolean
var
& nbsp & nbsp IPAddr : string
& nbsp & nbsp período, octeto, i : Integer
begin
& nbsp & nbsp resultado := false // default
& nbsp & nbsp IPAddr := StrIn
& nbsp & nbsp for i := 1 to 4 do begin
& nbsp & nbsp & nbsp & nbsp si i = 4 entonces período := 255 demás período := pos('.',IPAddr)
& nbsp & nbsp & nbsp & nbsp si periodo = 0 entonces salida
& nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp octeto := StrToInt(copia(IPAddr,1,periodo 1))
& nbsp & nbsp & nbsp & nbsp excepto
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp salida
& nbsp & nbsp & nbsp & nbsp final // a continuación, octeto < 1 si i = 1, < 0 si i > 1
& nbsp & nbsp & nbsp & nbsp si (octeto < (1 div i)) o (octeto > 254) a continuación, salida
& nbsp & nbsp & nbsp & nbsp si i = 4 then resultado := true else IPAddr := copy(IPAddr,período de 1,255)
& nbsp & nbsp final
fin
procedimiento GetConsoleOutput (const línea de Comandos : string
& nbsp & nbsp var Salida : TStringList)
var
& nbsp & nbsp SA: TSecurityAttributes
& nbsp & nbsp SI: TStartupInfo
& nbsp & nbsp PI: TProcessInformation
& nbsp & nbsp parámetro stdoutfile, AppProcess, AppThread : THandle
& nbsp & nbsp RootDir, WorkDir, StdOutFileName:string
const
& nbsp & nbsp FUNC_NAME = 'GetConsoleOuput'
begin
& nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp parámetro stdoutfile:=0
& nbsp & nbsp & nbsp & nbsp AppProcess:=0
& nbsp & nbsp & nbsp & nbsp AppThread:=0
& nbsp & nbsp & nbsp & nbsp // Inicializar dirs
& nbsp & nbsp & nbsp & nbsp RootDir:=ExtractFilePath(ParamStr(0))
& nbsp & nbsp & nbsp & nbsp WorkDir:=ExtractFilePath(línea de Comandos)
& nbsp & nbsp & nbsp & nbsp // Comprobar WorkDir
& nbsp & nbsp & nbsp & nbsp si no (FileSearch(ExtractFileName(línea de Comandos),WorkDir)<>')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp WorkDir:=RootDir
& nbsp & nbsp & nbsp & nbsp // Inicializar el archivo de salida atributos de seguridad
& nbsp & nbsp & nbsp & nbsp FillChar(SA,SizeOf(SA),#0)
& nbsp & nbsp & nbsp & nbsp SA.nLength:=SizeOf(SA)
& nbsp & nbsp & nbsp & nbsp SA.lpSecurityDescriptor:=nil
& nbsp & nbsp & nbsp & nbsp SA.bInheritHandle:=True
& nbsp & nbsp & nbsp & nbsp // Crear el Archivo de Salida
& nbsp & nbsp & nbsp & nbsp StdOutFileName:=RootDir 'de salida.tmp'
& nbsp & nbsp & nbsp & nbsp parámetro stdoutfile:=CreateFile(PChar(StdOutFileName),
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GENERIC_READ o GENERIC_WRITE,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FILE_SHARE_READ o FILE_SHARE_WRITE
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @SA,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp CREATE_ALWAYS, // Siempre crear
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FILE_ATTRIBUTE_TEMPORARY o // almacenará en caché en la memoria
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // si es posible
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FILE_FLAG_WRITE_THROUGH,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 0)
& nbsp & nbsp & nbsp & nbsp // Comprobar el Identificador de Salida
& nbsp & nbsp & nbsp & nbsp si el parámetro stdoutfile = INVALID_HANDLE_VALUE, a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp elevar la Excepción.CreateFmt('Función de %s() error!' #10#13
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'de la línea de Comandos = %s',[FUNC_NAME,línea de Comandos])
& nbsp & nbsp & nbsp & nbsp // Inicializar el Inicio Info
& nbsp & nbsp & nbsp & nbsp FillChar(SI,SizeOf(SI),#0)
& nbsp & nbsp & nbsp & nbsp con la SI do begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp cb:=SizeOf(SI)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp dwFlags:=STARTF_USESHOWWINDOW o STARTF_USESTDHANDLES
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp wShowWindow:=SW_HIDE
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp hStdInput:=GetStdHandle(STD_INPUT_HANDLE)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp hStdError:=parámetro stdoutfile
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp hStdOutput:=parámetro stdoutfile
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp // Crear el proceso
& nbsp & nbsp & nbsp & nbsp si CreateProcess(nil, PChar(línea de Comandos), nil, nil,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp True, 0, nil,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PChar(Dar), SI, PI), a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp WaitForSingleObject(PI.hProcess,INFINITO)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp AppProcess:=PI.hProcess
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp AppThread:=PI.hThread
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp elevar la Excepción.CreateFmt('CreateProcess() en función de %s() error!'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp #10#13 'de la línea de Comandos = %s',[FUNC_NAME,línea de Comandos])
& nbsp & nbsp & nbsp & nbsp CloseHandle(parámetro stdoutfile)
& nbsp & nbsp & nbsp & nbsp parámetro stdoutfile:=0
& nbsp & nbsp & nbsp & nbsp Salida.Claro
& nbsp & nbsp & nbsp & nbsp Salida.LoadFromFile (StdOutFileName)
& nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp // Cierre de asas
& nbsp & nbsp & nbsp & nbsp si el parámetro stdoutfile <> 0 entonces CloseHandle(parámetro stdoutfile)
& nbsp & nbsp & nbsp & nbsp si AppProcess <> 0 entonces CloseHandle(AppProcess)
& nbsp & nbsp & nbsp & nbsp si AppThread <> 0 entonces CloseHandle(AppThread)
& nbsp & nbsp & nbsp & nbsp // Borrar archivo de Salida
& nbsp & nbsp & nbsp & nbsp if FileExists(StdOutFileName), a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SysUtils.DeleteFile(StdOutFileName)
& nbsp & nbsp final
fin
función GetBasicOsType : LongWord
var
& nbsp & nbsp VerInfo : TOsVersionInfo
begin
& nbsp & nbsp VerInfo.dwOSVersionInfoSize := SizeOf(VerInfo)
& nbsp & nbsp GetVersionEx (VerInfo)
& nbsp & nbsp Resultado := VerInfo.dwPlatformId
fin
función GetIpCfg9xOutPath : string
begin
& nbsp & nbsp Resultado := GetWindowsPath IPCFG_DUMMY_FILE
fin
función GetIpCfgExePath : string
begin
& nbsp & nbsp Resultado := '
& nbsp & nbsp Caso GetBasicOsType de
& nbsp & nbsp & nbsp & nbsp VER_PLATFORM_WIN32_WINDOWS : Resultado := GetWindowsPath IPCFG_WIN9X
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GetIpCfg9xOutPath
& nbsp & nbsp & nbsp & nbsp VER_PLATFORM_WIN32_NT : Resultado := GetSystemPath IPCFG_WINNT
& nbsp & nbsp final
fin
función GetDnsIpFromReg : string
var
& nbsp & nbsp OpenKey : HKEY
& nbsp & nbsp Vn,
& nbsp & nbsp Subclave : PChar
& nbsp & nbsp Tipo de datos,
& nbsp & nbsp DataSize : integer
& nbsp & nbsp Temp : array [0..2048] of char
begin
& nbsp & nbsp Resultado := '
& nbsp & nbsp Subclave := '
& nbsp & nbsp Vn := '
& nbsp & nbsp caso GetBasicOsType de
& nbsp & nbsp & nbsp & nbsp VER_PLATFORM_WIN32_WINDOWS :
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Subclave := REG_9X_NAMESERVER_PATH
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Vn := REG_9X_NAMESERVER
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp VER_PLATFORM_WIN32_NT :
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Subclave := REG_NT_NAMESERVER_PATH
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Vn := REG_NT_NAMESERVER
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
& nbsp & nbsp si RegOpenKeyEx (HKEY_LOCAL_MACHINE, una Subclave REG_OPTION_NON_VOLATILE,
& nbsp & nbsp & nbsp & nbsp KEY_READ, OpenKey) = ERROR_SUCCESS, a continuación,
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Tipo de datos := REG_SZ
& nbsp & nbsp & nbsp & nbsp DataSize := SizeOf(Temp)
& nbsp & nbsp & nbsp & nbsp si RegQueryValueEx (OpenKey, Vn, nil, @DataType, @Temp
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @DataSize) = ERROR_SUCCESS, a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := cadena de caracteres(Temp)
& nbsp & nbsp & nbsp & nbsp RegCloseKey (OpenKey)
& nbsp & nbsp final
fin
función GetDnsIpFromIpCfgOut (const Salida : TStringList
& nbsp & nbsp var DnsIp : string) : boolean
var
& nbsp & nbsp i : integer
begin
& nbsp & nbsp Resultado := FALSE
& nbsp & nbsp si la Salida.Contador >= 1 y
& nbsp & nbsp & nbsp & nbsp for i := 0 a la Salida.Count - 1 do
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si Pos(IPCFG_DNS_SERVER_LINE, Salida[i]) > 0, entonces
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp DnsIp := Trim(Copia (Salida[i], Pos(':', De salida[i]) 1,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Longitud(Salida[i])))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := LooksLikeIp (DnsIp)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp final
fin
función GetDnsIp : string
var
& nbsp & nbsp Salida : TStringList
& nbsp & nbsp DnsIp,
& nbsp & nbsp CmdLine : string
begin
& nbsp & nbsp CmdLine := GetIpCfgExePath
& nbsp & nbsp si CmdLine <> ' then
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Salida := TStringList.Crear
& nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp caso GetBasicOsType de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp VER_PLATFORM_WIN32_WINDOWS :
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GetConsoleOutput (CmdLine, Salida)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Salida.LoadFromFile (GetIpCfg9xOutPath)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GetConsoleOutput (CmdLine, Salida)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si GetDnsIpFromIpCfgOut (Salida, DnsIp), a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := DnsIp
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp //
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Intento de localizar a través del registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp //
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := GetDnsIpFromReg
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Salida.Libre
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
fin
final.
Conseguir que los equipos de servidor dns
Conseguir que los equipos de servidor dns : Multi-millones de consejos para hacer su vida mas facil.
el Codigo para recuperar los equipos de servidor DNS que funciona en Windows 9x/ME y 2000/XP, independiente de IpHelper API, etc.
he visto publicaciones en varios grupos de noticias y programacion de sitios preguntando como conseguir que los equipos de servidor DNS. He probado este 'hack' metodo en el '95, '98, ME, NT, 2000 y XP y funciona bien... el IpHelper API requiere Windows 2000.
& [snip] &
unidad de BaclDnsHelper
interfaz
usos
& nbsp & nbsp SysUtils,
& nbsp & nbsp Clases,
& nbsp & nbsp Windows
funcion GetDnsIp : string
aplicacion
const
& nbsp & nbsp //
& nbsp & nbsp // NOTA: Para '9x, debemos usar /lote o la interfaz grafica de usuario aparecera, por lo que
& nbsp & nbsp // usamos un archivo ficticio
& nbsp & nbsp //
& nbsp & nbsp IPCFG_DUMMY_FILE = '_dmytmpdns.tmp'
& nbsp & nbsp IPCFG_WIN9X = 'winipcfg.exe /todos /lote '/ / _dmytmpgdns.txt'
& nbsp & nbsp IPCFG_WINNT = 'ipconfig.exe /all'
& nbsp & nbsp IPCFG_DNS_SERVER_LINE = 'Servidores DNS'
& nbsp & nbsp REG_NT_NAMESERVER_PATH =
& nbsp & nbsp & nbsp & nbsp 'System/CurrentControlSet/Services/Tcpip/Parameters'
& nbsp & nbsp REG_NT_NAMESERVER = 'DhcpNameServer'
& nbsp & nbsp REG_9X_NAMESERVER_PATH = 'System/CurrentControlSet/Services/MSTCP'
& nbsp & nbsp REG_9X_NAMESERVER = 'servidor de nombres'
funcion BackSlashStr (const s : string) : string
begin
& nbsp & nbsp Resultado := s
& nbsp & nbsp si el Resultado[de Longitud(Resultado)] <> '/' entonces
& nbsp & nbsp & nbsp & nbsp Resultado := Resultado '/'
fin
funcion GetWindowsPath : string
var
& nbsp & nbsp Temp : array [0..MAX_PATH] of char
begin
& nbsp & nbsp GetWindowsDirectory (Temp, SizeOf(Temp))
& nbsp & nbsp Resultado := BackSlashStr (Temp)
fin
funcion GetSystemPath : cadena
var
& nbsp & nbsp Temp : array [0..MAX_PATH] of char
begin
& nbsp & nbsp GetSystemDirectory (Temp, SizeOf(Temp))
fin
funcion LooksLikeIP(StrIn: string): boolean
var
& nbsp & nbsp IPAddr : string
& nbsp & nbsp periodo, octeto, i : Integer
begin
& nbsp & nbsp resultado := false // default
& nbsp & nbsp IPAddr := StrIn
& nbsp & nbsp for i := 1 to 4 do begin
& nbsp & nbsp & nbsp & nbsp si i = 4 entonces periodo := 255 demas periodo := pos('.',IPAddr)
& nbsp & nbsp & nbsp & nbsp si periodo = 0 entonces salida
& nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp octeto := StrToInt(copia(IPAddr,1,periodo 1))
& nbsp & nbsp & nbsp & nbsp excepto
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp salida
& nbsp & nbsp & nbsp & nbsp final // a continuacion, octeto < 1 si i = 1, < 0 si i > 1
& nbsp & nbsp & nbsp & nbsp si (octeto < (1 div i)) o (octeto > 254) a continuacion, salida
& nbsp & nbsp & nbsp & nbsp si i = 4 then resultado := true else IPAddr := copy(IPAddr,periodo de 1,255)
& nbsp & nbsp final
fin
procedimiento GetConsoleOutput (const linea de Comandos : string
& nbsp & nbsp var Salida : TStringList)
var
& nbsp & nbsp SA: TSecurityAttributes
& nbsp & nbsp SI: TStartupInfo
& nbsp & nbsp PI: TProcessInformation
& nbsp & nbsp parametro stdoutfile, AppProcess, AppThread : THandle
& nbsp & nbsp RootDir, WorkDir, StdOutFileName:string
const
& nbsp & nbsp FUNC_NAME = 'GetConsoleOuput'
begin
& nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp parametro stdoutfile:=0
& nbsp & nbsp & nbsp & nbsp AppProcess:=0
& nbsp & nbsp & nbsp & nbsp AppThread:=0
& nbsp & nbsp & nbsp & nbsp // Inicializar dirs
& nbsp & nbsp & nbsp & nbsp RootDir:=ExtractFilePath(ParamStr(0))
& nbsp & nbsp & nbsp & nbsp WorkDir:=ExtractFilePath(linea de Comandos)
& nbsp & nbsp & nbsp & nbsp // Comprobar WorkDir
& nbsp & nbsp & nbsp & nbsp si no (FileSearch(ExtractFileName(linea de Comandos),WorkDir)<>')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp WorkDir:=RootDir
& nbsp & nbsp & nbsp & nbsp // Inicializar el archivo de salida atributos de seguridad
& nbsp & nbsp & nbsp & nbsp FillChar(SA,SizeOf(SA),#0)
& nbsp & nbsp & nbsp & nbsp SA.nLength:=SizeOf(SA)
& nbsp & nbsp & nbsp & nbsp SA.lpSecurityDescriptor:=nil
& nbsp & nbsp & nbsp & nbsp SA.bInheritHandle:=True
& nbsp & nbsp & nbsp & nbsp // Crear el Archivo de Salida
& nbsp & nbsp & nbsp & nbsp StdOutFileName:=RootDir 'de salida.tmp'
& nbsp & nbsp & nbsp & nbsp parametro stdoutfile:=CreateFile(PChar(StdOutFileName),
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GENERIC_READ o GENERIC_WRITE,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FILE_SHARE_READ o FILE_SHARE_WRITE
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @SA,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp CREATE_ALWAYS, // Siempre crear
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FILE_ATTRIBUTE_TEMPORARY o // almacenara en cache en la memoria
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // si es posible
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FILE_FLAG_WRITE_THROUGH,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 0)
& nbsp & nbsp & nbsp & nbsp // Comprobar el Identificador de Salida
& nbsp & nbsp & nbsp & nbsp si el parametro stdoutfile = INVALID_HANDLE_VALUE, a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp elevar la Excepcion.CreateFmt('Funcion de %s() error!' #10#13
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'de la linea de Comandos = %s',[FUNC_NAME,linea de Comandos])
& nbsp & nbsp & nbsp & nbsp // Inicializar el Inicio Info
& nbsp & nbsp & nbsp & nbsp FillChar(SI,SizeOf(SI),#0)
& nbsp & nbsp & nbsp & nbsp con la SI do begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp cb:=SizeOf(SI)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp dwFlags:=STARTF_USESHOWWINDOW o STARTF_USESTDHANDLES
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp wShowWindow:=SW_HIDE
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp hStdInput:=GetStdHandle(STD_INPUT_HANDLE)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp hStdError:=parametro stdoutfile
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp hStdOutput:=parametro stdoutfile
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp // Crear el proceso
& nbsp & nbsp & nbsp & nbsp si CreateProcess(nil, PChar(linea de Comandos), nil, nil,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp True, 0, nil,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PChar(Dar), SI, PI), a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp WaitForSingleObject(PI.hProcess,INFINITO)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp AppProcess:=PI.hProcess
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp AppThread:=PI.hThread
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp elevar la Excepcion.CreateFmt('CreateProcess() en funcion de %s() error!'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp #10#13 'de la linea de Comandos = %s',[FUNC_NAME,linea de Comandos])
& nbsp & nbsp & nbsp & nbsp CloseHandle(parametro stdoutfile)
& nbsp & nbsp & nbsp & nbsp parametro stdoutfile:=0
& nbsp & nbsp & nbsp & nbsp Salida.Claro
& nbsp & nbsp & nbsp & nbsp Salida.LoadFromFile (StdOutFileName)
& nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp // Cierre de asas
& nbsp & nbsp & nbsp & nbsp si el parametro stdoutfile <> 0 entonces CloseHandle(parametro stdoutfile)
& nbsp & nbsp & nbsp & nbsp si AppProcess <> 0 entonces CloseHandle(AppProcess)
& nbsp & nbsp & nbsp & nbsp si AppThread <> 0 entonces CloseHandle(AppThread)
& nbsp & nbsp & nbsp & nbsp // Borrar archivo de Salida
& nbsp & nbsp & nbsp & nbsp if FileExists(StdOutFileName), a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SysUtils.DeleteFile(StdOutFileName)
& nbsp & nbsp final
fin
funcion GetBasicOsType : LongWord
var
& nbsp & nbsp VerInfo : TOsVersionInfo
begin
& nbsp & nbsp VerInfo.dwOSVersionInfoSize := SizeOf(VerInfo)
& nbsp & nbsp GetVersionEx (VerInfo)
& nbsp & nbsp Resultado := VerInfo.dwPlatformId
fin
funcion GetIpCfg9xOutPath : string
begin
& nbsp & nbsp Resultado := GetWindowsPath IPCFG_DUMMY_FILE
fin
funcion GetIpCfgExePath : string
begin
& nbsp & nbsp Resultado := '
& nbsp & nbsp Caso GetBasicOsType de
& nbsp & nbsp & nbsp & nbsp VER_PLATFORM_WIN32_WINDOWS : Resultado := GetWindowsPath IPCFG_WIN9X
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GetIpCfg9xOutPath
& nbsp & nbsp & nbsp & nbsp VER_PLATFORM_WIN32_NT : Resultado := GetSystemPath IPCFG_WINNT
& nbsp & nbsp final
fin
funcion GetDnsIpFromReg : string
var
& nbsp & nbsp OpenKey : HKEY
& nbsp & nbsp Vn,
& nbsp & nbsp Subclave : PChar
& nbsp & nbsp Tipo de datos,
& nbsp & nbsp DataSize : integer
& nbsp & nbsp Temp : array [0..2048] of char
begin
& nbsp & nbsp Resultado := '
& nbsp & nbsp Subclave := '
& nbsp & nbsp Vn := '
& nbsp & nbsp caso GetBasicOsType de
& nbsp & nbsp & nbsp & nbsp VER_PLATFORM_WIN32_WINDOWS :
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Subclave := REG_9X_NAMESERVER_PATH
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Vn := REG_9X_NAMESERVER
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp VER_PLATFORM_WIN32_NT :
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Subclave := REG_NT_NAMESERVER_PATH
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Vn := REG_NT_NAMESERVER
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
& nbsp & nbsp si RegOpenKeyEx (HKEY_LOCAL_MACHINE, una Subclave REG_OPTION_NON_VOLATILE,
& nbsp & nbsp & nbsp & nbsp KEY_READ, OpenKey) = ERROR_SUCCESS, a continuacion,
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Tipo de datos := REG_SZ
& nbsp & nbsp & nbsp & nbsp DataSize := SizeOf(Temp)
& nbsp & nbsp & nbsp & nbsp si RegQueryValueEx (OpenKey, Vn, nil, @DataType, @Temp
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @DataSize) = ERROR_SUCCESS, a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := cadena de caracteres(Temp)
& nbsp & nbsp & nbsp & nbsp RegCloseKey (OpenKey)
& nbsp & nbsp final
fin
funcion GetDnsIpFromIpCfgOut (const Salida : TStringList
& nbsp & nbsp var DnsIp : string) : boolean
var
& nbsp & nbsp i : integer
begin
& nbsp & nbsp Resultado := FALSE
& nbsp & nbsp si la Salida.Contador >= 1 y
& nbsp & nbsp & nbsp & nbsp for i := 0 a la Salida.Count - 1 do
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si Pos(IPCFG_DNS_SERVER_LINE, Salida[i]) > 0, entonces
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp DnsIp := Trim(Copia (Salida[i], Pos(':', De salida[i]) 1,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Longitud(Salida[i])))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := LooksLikeIp (DnsIp)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp final
fin
funcion GetDnsIp : string
var
& nbsp & nbsp Salida : TStringList
& nbsp & nbsp DnsIp,
& nbsp & nbsp CmdLine : string
begin
& nbsp & nbsp CmdLine := GetIpCfgExePath
& nbsp & nbsp si CmdLine <> ' then
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Salida := TStringList.Crear
& nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp caso GetBasicOsType de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp VER_PLATFORM_WIN32_WINDOWS :
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GetConsoleOutput (CmdLine, Salida)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Salida.LoadFromFile (GetIpCfg9xOutPath)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GetConsoleOutput (CmdLine, Salida)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si GetDnsIpFromIpCfgOut (Salida, DnsIp), a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := DnsIp
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp //
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Intento de localizar a traves del registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp //
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := GetDnsIpFromReg
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Salida.Libre
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
fin
final.
Conseguir que los equipos de servidor dns
By Consejos Y Trucos
Conseguir que los equipos de servidor dns : Multi-millones de consejos para hacer su vida más fácil.