Å få datamaskiner DNS server

Kode for å hente den datamaskiner DNS-server som fungerer på Windows '9x /ME og 2000 /XP, uavhengig av IpHelper API, osv.Jeg har sett innlegg på ulike nyhetsgrupper og programmering sider spør hvordan å få datamaskiner DNS-server . Jeg har testet denne "hack" metode på '95, '98, ME, NT, 2000 og XP og det fungerer fint ... den IpHelper API krever Windows 2000 .-- [klipp] - enhet BaclDnsHelper; interfaceuses SysUtils, klasser , Windows, funksjon GetDnsIp: string; implementationconst ////MERK: For '9x, må vi bruke /batch eller GUI vises så //vi bruker en dummy-fil //IPCFG_DUMMY_FILE =' _dmytmpdns.tmp '; IPCFG_WIN9X = 'Winipcfg.exe /all /batch'; //_dmytmpgdns.txt '; IPCFG_WINNT = 'Ipconfig.exe /all'; IPCFG_DNS_SERVER_LINE = 'DNS-servere'; REG_NT_NAMESERVER_PATH = 'System \\ CurrentControlSet \\ Services \\ Tcpip \\ Parameters'; REG_NT_NAMESERVER = 'DhcpNameServer'; REG_9X_NAMESERVER_PATH = 'System \\ CurrentControlSet \\ Services \\ MSTCP'; REG_9X_NAMESERVER = 'Nameserver'; funksjon BackSlashStr (konst s: string): string; begynne Resultat: = s; hvis Resultat [Lengde (resultater)] < > '\\' Da Resultat: = Resultat + '\\'; ende; funksjon GetWindowsPath: string; Var Temp: array [0..MAX_PATH] av røye, begynner GetWindowsDirectory (Temp, sizeof (Temp)); Resultat: = BackSlashStr (Temp); end; funksjon GetSystemPath: string; Var Temp: array [0..MAX_PATH] av røye, begynner GetSystemDirectory (Temp, sizeof (Temp)); end; funksjon LooksLikeIP (sn: string): boolean; Var IPaddr: string; periode, oktett, jeg: Integer; begynne resultat: = false; //Standard IPaddr: = sn; for i: = 1-4 gjør begynne hvis jeg = 4 da periode: = 255 andre periode: = pos (, IPaddr '.'); hvis perioden = 0 og avslutter; prøve oktett: = StrToInt (kopi (IPaddr, 1, periode - 1)); unntatt exit; slutt; //Nedenfor, oktett < 1 dersom i = 1, < 0 hvis jeg > 1 if (oktett < (1 div i)) eller (oktett > 254) og avslutter; hvis jeg = 4 da resultere: = true annet IPaddr: = kopiere (IPaddr, periode + 1255); end, end, prosedyre GetConsoleOutput (konst Command: string; Var Output: TStringList); Var SA: TSecurityAttributes; SI: TStartupInfo; PI: TProcessInformation; StdOutFile, AppProcess, AppThread: THandle; RootDir, WorkDir, StdOutFileName: string; const FUNC_NAME = 'GetConsoleOuput'; begynne prøve StdOutFile: = 0; AppProcess: = 0; AppThread: = 0; //Initial kataloger RootDir: = ExtractFilePath (ParamStr (0)); WorkDir: = ExtractFilePath (Command); //Sjekk WorkDir hvis ikke (FileSearch (ExtractFileName (Command), WorkDir) < > '') da WorkDir: = RootDir; //Initial utdatafilen sikkerhet attributter FillChar (SA, sizeof (SA), # 0); SA.nLength: = sizeof (SA); SA.lpSecurityDescriptor: = null; SA.bInheritHandle: = true; //Opprett Utdatafil StdOutFileName: = RootDir + 'output.tmp'; StdOutFile: = Create (PChar (StdOutFileName), GENERIC_READ eller GENERIC_WRITE, FILE_SHARE_READ eller FILE_SHARE_WRITE,SA, CREATE_ALWAYS, //Ta alltid det FILE_ATTRIBUTE_TEMPORARY eller //Vil cache minne //hvis mulig FILE_FLAG_WRITE_THROUGH, 0); //Sjekk Output Håndtak om StdOutFile = INVALID_HANDLE_VALUE deretter heve Exception.CreateFmt (+ # 10 # 13 + 'Command line =% s', [FUNC_NAME, Command] Funksjon% s () mislyktes! '); //Initial Oppstart Info FillChar (SI, sizeof (SI), # 0); med SI gjør begynne cb: = sizeof (SI); dwFlags: = STARTF_USESHOWWINDOW eller STARTF_USESTDHANDLES; wShowWindow: = SW_HIDE; hStdInput: = GetStdHandle (STD_INPUT_HANDLE); hStdError: = StdOutFile; hStdOutput: = StdOutFile; slutt; //Opprett prosessen hvis CreateProcess (null, PChar (Command), null, null, Sann, 0, null, PChar (WorkDir), SI, PI), og start WaitForSingleObject (PI.hProcess, uendelig); AppProcess: = PI.hProcess; AppThread: = PI.hThread; ende annet heve Exception.CreateFmt (+ # 10 # 13 + 'Command line =% s', [FUNC_NAME, Command] CreateProcess () i funksjon% s () mislyktes! '); CloseHandle (StdOutFile); StdOutFile: = 0; Output.Clear; Output.LoadFromFile (StdOutFileName); endelig //Close håndtak hvis StdOutFile < > 0 da CloseHandle (StdOutFile); hvis AppProcess < > 0 da CloseHandle (AppProcess); hvis AppThread < > 0 da CloseHandle (AppThread); //Slett Output fil hvis FileExists (StdOutFileName) så SysUtils.DeleteFile (StdOutFileName); end, end, funksjon GetBasicOsType: Long; Var VerInfo: TOsVersionInfo, begynner VerInfo.dwOSVersionInfoSize: = sizeof (VerInfo); GetVersionEx (VerInfo); Resultat: = VerInfo.dwPlatformId; ende; funksjon GetIpCfg9xOutPath: string; begynne Resultat: = GetWindowsPath + IPCFG_DUMMY_FILE; ende; funksjon GetIpCfgExePath: string; begynne Resultat: = ''; Sak GetBasicOsType av VER_PLATFORM_WIN32_WINDOWS: Resultat: = GetWindowsPath + IPCFG_WIN9X + GetIpCfg9xOutPath; VER_PLATFORM_WIN32_NT: Resultat: = GetSystemPath + IPCFG_WINNT; end, end, funksjon GetDnsIpFromReg: string; Var OpenKey: HKEY; Vn, undernøkkel: PChar; Datatype, datasize: integer; Temp: array [0..2048] av røye, begynner Resultat: = ''; Undernøkkel: = ''; VN: = ''; Ved GetBasicOsType av VER_PLATFORM_WIN32_WINDOWS: begynne undernøkkel: = REG_9X_NAMESERVER_PATH; VN: = REG_9X_NAMESERVER; slutt; VER_PLATFORM_WIN32_NT: begynne undernøkkel: = REG_NT_NAMESERVER_PATH; VN: = REG_NT_NAMESERVER; slutt; slutt; hvis RegOpenKeyEx (HKEY_LOCAL_MACHINE, undernøkkelen REG_OPTION_NON_VOLATILE, KEY_READ, OpenKey) = ERROR_SUCCESS deretter begynne datatype: = REG_SZ; Datasize: = sizeof (Temp); hvis RegQueryValueEx (OpenKey, Vn, nil,DataType,Temp,DataSize) = ERROR_SUCCESS deretter Resultat: = streng (Temp); RegCloseKey (OpenKey); end, end, funksjon GetDnsIpFromIpCfgOut (konst Output: TStringList; Var DnsIp: string): boolean; Var jeg: integer; begynne Resultat: = false; hvis Output.Count > = 1 så for i: = 0 til Output.Count - en ikke begynne hvis Pos (IPCFG_DNS_SERVER_LINE, Utgang [i]) > 0 da begynne DnsIp: = Trim (Copy (Output [i], Pos ( ':', Utgang [i]) + 1, Lengde (Output [i]))); Resultat: = LooksLikeIp (DnsIp); slutt; end, end, funksjon GetDnsIp: string; Var Output: TStringList; DnsIp, cmdline: string; begynne cmdline: = GetIpCfgExePath; hvis cmdline < > '' Da begynne Output: = TStringList.Create; prøve saken GetBasicOsType av VER_PLATFORM_WIN32_WINDOWS: begynne GetConsoleOutput (cmdline, utgang); Output.LoadFromFile (GetIpCfg9xOutPath); slutt; annet GetConsoleOutput (cmdline, utgang); slutt; hvis GetDnsIpFromIpCfgOut (Output, DnsIp) så Resultat: = DnsIp annet begynne ////Forsøk å lokalisere via registeret //Resultat: = GetDnsIpFromReg; slutt; endelig Output.Free; slutt; end, end,. slutten



Previous:
Next Page: