




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#获取系统信息方法一:利用注册表获取/RegistryKey 类所需要的包:/RegistryKey 类所需要的包:using Microsoft.Win32;/DllImport方法所需要的包:using System.Runtime.InteropServices;/StringBuilder所需要的包:using System.Text;/声明API函数 DllImport(kernel32) public static extern void GetWindowsDirectory(StringBuilder WinDir,int count); DllImport(kernel32) public static extern void GetSystemDirectory(StringBuilder SysDir,int count); DllImport(kernel32) public static extern void GetSystemInfo(ref CPU_INFO cpuinfo); DllImport(kernel32) public static extern void GlobalMemoryStatus(ref MEMORY_INFO meminfo); DllImport(kernel32) public static extern void GetSystemTime(ref SYSTEMTIME_INFO stinfo); /定义以下各结构 /定义CPU的信息结构 StructLayout(LayoutKind.Sequential) public struct CPU_INFO public uint dwOemId; public uint dwPageSize; public uint lpMinimumApplicationAddress; public uint lpMaximumApplicationAddress; public uint dwActiveProcessorMask; public uint dwNumberOfProcessors; public uint dwProcessorType; public uint dwAllocationGranularity; public uint dwProcessorLevel; public uint dwProcessorRevision; /定义内存的信息结构 StructLayout(LayoutKind.Sequential) public struct MEMORY_INFO public uint dwLength; public uint dwMemoryLoad; public uint dwTotalPhys; public uint dwAvailPhys; public uint dwTotalPageFile; public uint dwAvailPageFile; public uint dwTotalVirtual; public uint dwAvailVirtual; /定义系统时间的信息结构 StructLayout(LayoutKind.Sequential) public struct SYSTEMTIME_INFO public ushort wYear; public ushort wDay; public ushort wHour; public ushort wMinute; public ushort wSecond; public ushort wMilliseconds; private void initSysInfoData() /获取操作系统设置 lstSysInfo.Items.Add(计算机名 : + SystemInformation.ComputerName ); lstSysInfo.Items.Add(是否已连接网络 : + SystemInformation.Network ); lstSysInfo.Items.Add(用户域 : + SystemInformation.UserDomainName ); lstSysInfo.Items.Add(当前线程用户名 : + SystemInformation.UserName ); lstSysInfo.Items.Add(启动方式 : + SystemInformation.BootMode ); lstSysInfo.Items.Add(菜单的字体 : + SystemInformation.MenuFont ); lstSysInfo.Items.Add(显示器的数目 : + SystemInformation.MonitorCount ); lstSysInfo.Items.Add(鼠标已安装 : + SystemInformation.MousePresent ); lstSysInfo.Items.Add(鼠标按钮数 : + SystemInformation.MouseButtons); lstSysInfo.Items.Add(是否交互模式 : + SystemInformation.UserInteractive ); lstSysInfo.Items.Add(屏幕界限: + SystemInformation.VirtualScreen ); public void initEnvData() /获取程序运行的相关信息. lstEnv.Items.Add(命令行:+ Environment.CommandLine); lstEnv.Items.Add(命令行参数:+ String.Join(, ,Environment.GetCommandLineArgs(); lstEnv.Items.Add(当前目录:+ Environment.CurrentDirectory); lstEnv.Items.Add(操作系统版本:+ Environment.OSVersion); lstEnv.Items.Add(系统目录:+ Environment.SystemDirectory); lstEnv.Items.Add(堆栈信息:+ Environment.StackTrace); lstEnv.Items.Add(用户域:+ Environment.UserDomainName); lstEnv.Items.Add(CLR版本:+ Environment.Version); lstEnv.Items.Add(系统启动后经过的毫秒:+ Environment.TickCount); lstEnv.Items.Add(进程上下文的物理内存量:+ Environment.WorkingSet); String drives = Environment.GetLogicalDrives(); lstEnv.Items.Add(本机磁盘驱动器: + String.Join(, , drives); / 获取本机所有环境变量 IDictionary environmentVariables = Environment.GetEnvironmentVariables(); foreach (DictionaryEntry de in environmentVariables) lstEnv.Items.Add(de.Key+=+de.Value); public void initRegKeyData() /通过注册表获取信息 RegistryKey Rkey = Registry.LocalMachine; Rkey = Rkey.OpenSubKey(HARDWAREDESCRIPTIONSystemCentralProcessor0); lstRegkey.Items.Add(处理器信息:+Rkey.GetValue(ProcessorNameString).ToString().Trim(); Rkey=Registry.LocalMachine; Rkey = Rkey.OpenSubKey(SOFTWAREMicrosoftWindows NTCurrentVersionNetworkCards1); lstRegkey.Items.Add(网卡信息:+(String)Rkey.GetValue(Description); public void initAPIData() /调用GetWindowsDirectory和GetSystemDirectory函数分别取得Windows路径和系统路径 const int nChars = 128; StringBuilder Buff = new StringBuilder(nChars); GetWindowsDirectory(Buff,nChars); lstAPI.Items.Add(Windows路径:+Buff.ToString(); GetSystemDirectory(Buff,nChars); lstAPI.Items.Add(系统路径:+Buff.ToString(); /调用GetSystemInfo函数获取CPU的相关信息 CPU_INFO CpuInfo; CpuInfo = new CPU_INFO(); GetSystemInfo(ref CpuInfo); /CPU信息的读取是错误的,我本只有一个CPU,读成了两个 lstAPI.Items.Add(本计算机中有+CpuInfo.dwNumberOfProcessors.ToString()+个CPU); lstAPI.Items.Add(CPU的类型为+CpuInfo.dwProcessorType.ToString(); lstAPI.Items.Add(CPU等级为+CpuInfo.dwProcessorLevel.ToString(); lstAPI.Items.Add(CPU的OEM ID为+CpuInfo.dwOemId.ToString(); lstAPI.Items.Add(CPU中的页面大小为+CpuInfo.dwPageSize.ToString(); /调用GlobalMemoryStatus函数获取内存的相关信息 MEMORY_INFO MemInfo; MemInfo = new MEMORY_INFO(); GlobalMemoryStatus(ref MemInfo); lstAPI.Items.Add( MemInfo.dwMemoryLoad.ToString()+%的内存正在使用); lstAPI.Items.Add(物理内存共有+MemInfo.dwTotalPhys.ToString()+字节); lstAPI.Items.Add(可使用的物理内存有+MemInfo.dwAvailPhys.ToString()+字节); lstAPI.Items.Add( 交换文件总大小为+MemInfo.dwTotalPageFile.ToString()+字节); lstAPI.Items.Add( 尚可交换文件大小为+MemInfo.dwAvailPageFile.ToString()+字节); lstAPI.Items.Add( 总虚拟内存有+MemInfo.dwTotalVirtual.ToString()+字节); lstAPI.Items.Add( 未用虚拟内存有+MemInfo.dwAvailVirtual.ToString()+字节); /调用GetSystemTime函数获取系统时间信息 SYSTEMTIME_INFO StInfo; StInfo = new SYSTEMTIME_INFO(); GetSystemTime(ref StInfo); lstAPI.Items.Add(StInfo.wYear.ToString()+年+StInfo.wMonth.ToString()+月+StInfo.wDay.ToString()+日); lstAPI.Items.Add(StInfo.wHour+8).ToString()+点+StInfo.wMinute.ToString()+分+StInfo.wSecond.ToString()+秒); 方法二:利用System.Management命名空间获取using System.Management;ManagementClass mc = new ManagementClass(Win32_Processor);ManagementObjectCollection moc = mc.GetInstances();String strCpuID = null;foreach (ManagementObject mo in moc)strCpuID = mo.PropertiesProcessorId.Value.ToString();this.label1.Text = strCpuID;break;/获取CPU基本信息using System.Runtime.InteropServices; DllImport(kernel32 ) public static extern void GetSystemInfo(ref CPU_INFO cpuinfo); /定义CPU的信息结构 StructLayout(LayoutKind.Sequential) public struct CPU_INFO public uint dwOemId; public uint dwPageSize; public uint lpMinimumApplicationAddress; public uint lpMaximumApplicationAddress; public uint dwActiveProcessorMask; public uint dwNumberOfProcessors; public uint dwProcessorType; public uint dwAllocationGranularity; public uint dwProcessorLevel; public uint dwProcessorRevision; private void Form1_Load(object sender, EventArgs e) /调用GetSystemInfo函数获取CPU的相关信息 CPU_INFO CpuInfo; CpuInfo = new CPU_INFO(); GetSystemInfo(ref CpuInfo); string a = 本计算机中有 + CpuInfo.dwNumberOfProcessors.ToString()+ 个CPU ; string b= CPU的类型为 + CpuInfo.dwProcessorType.ToString(); string c= CPU等级为 + CpuInfo.dwProcessorLevel.ToString(); string d= CPU的OEM ID为 + CpuInfo.dwOemId.ToString(); string e = CPU中的页面大小为 + CpuInfo.dwPageSize.ToString(); /获取物理内存using System.Management;/注意需要引用string st = ; ManagementClass mc = new ManagementClass(Win32_ComputerSystem); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) st = moTotalPhysicalMemory.ToString(); /显示卡信息ManagementObjectSearcher searcher = new ManagementObjectSearcher(rootCIMV2, SELECT * FROM Win32_VideoController); foreach (ManagementObject info in searcher.Get() string a= 适配器兼容性 + infoAdapterCompatibility.ToString(); string b= 适配器类型 + infoAdapterDACType.ToString(); string c= 视频模式描述+infoVideoModeDescription.ToString(); string d= 字幕+infoCaption.ToString(); string e= 目前比特每像素+infoCurrentBitsPerPixel.ToString(); string f= 目前的水平分辨率+infoCurrentHorizontalResolution.ToString(); string g= 视频处理器+infoVideoProcessor.ToString(); string h= 最大刷新率 + infoMaxRefreshRate.ToString(); string i= 设备ID + infoDeviceID.ToString(); string j= 描述 + infoDescription.ToString(); /获取分区信息using System.Management;private void button1_Click(object sender, EventArgs e) WqlObjectQuery wmiquery = new WqlObjectQuery(SELECT * FROM Win32_LogicalDisk WHERE DeviceID = e:); ManagementObjectSearcher wmifind = new ManagementObjectSearcher(wmiquery); foreach (ManagementObject mobj in wmifind.Get() string a= (磁盘类型: + mobjDescription.ToString(); string b= (分区类型: + mobjFileSystem.ToString(); string c= (可用空间: + mobjFreeSpace.ToString(); string d= (实际大小: + mobjSize.ToString(); /获取主板信息using System.Management; ManagementObjectSearcher my = new ManagementObjectSearcher(SELECT * FROM Win32_BaseBoard); foreach (ManagementObject share in my.Get() string a = 主板制造商: + shareManufacturer.ToString(); string b= 产品: + shareProduct.ToString(); string c= 主板序列号: + shareSerialNumber.ToString(); /获取IP地址using System.Management;string st = ; ManagementClass mc = new ManagementClass(Win32_NetworkAdapterConfiguration); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) if (bool)moIPEnabled = true) /st=moIpAddress.ToString(); System.Array ar; ar = (System.Array)(mo.PropertiesIpAddress.Value); st = ar.GetValue(0).ToString(); Stringipadd= st; break; /获取进程详细信息using System.Diagnostics; string s = ; System.Int32 processid; Process process; /Retrieve the additional information about a specific process processid = Int32.Parse(this.textBox1.Text); process = System.Diagnostics.Process.GetProcessById(processid); s = s + 该进程的总体优先级类别: + Convert.ToString(process.PriorityClass) + rn; s = s + 由该进程打开的句柄数: + process.HandleCount + rn; s = s + 该进程的主窗口标题: + process.MainWindowTitle + rn; s = s + 该进程允许的最小工作集大小: + process.MinWorkingSet.ToString() + rn; s = s + 该进程允许的最大工作集大小: + process.MaxWorkingSet.ToString() + rn; s = s + 该进程的分页内存大小: + process.PagedMemorySize + rn; s = s + 该进程的峰值分页内存大小: + process.PeakPagedMemorySize + rn; System.Windows.Forms.MessageBox.Show(s); 为了避免异常崩溃 建议放在 TRY 里运行 /获取系统的启动日期和安装日期.System.Management.ObjectQuery MyQuery=new ObjectQuery(SELECT * FROM Win32_OperatingSystem); System.Management.ManagementScope MyScope=new ManagementScope(); ManagementObjectSearcher MySearch=new ManagementObjectSearcher(MyScope,MyQuery); ManagementObjectCollection MyCollection=MySearch.Get(); string StrInfo=; foreach(ManagementObject MyObject in MyCollection) StrInfo=MyObject.GetText(TextFormat.Mof); string InstallDate=StrInfo.Substring(StrInfo.LastIndexOf(InstallDate)+15,14); string LastBootUpTime=StrInfo.Substring(StrInfo.LastIndexOf(LastBootUpTime)+18,14); string a =InstallDate; string b =LastBootUpTime;方法三:利用WMI列表获取系统相应信息获取使用方法:至于使用方法不用多说了吧,.NET 里面对WMI的使用,是放在 System.Management 这个空间下的,要使用的话,需要先添加对 System.Management.dll 引用哦一:WMI基础知识 = WMI 最初于1998年作为一个附加组件与 Windows NT 4.0 Service Pack 4 一起发行,是内置在Windows 2000、 Windows XP和Windows Server 2003 系列操作系统中核心的管理支持技术。基于由 Distributed Management Task Force (DMTF) 所监督的业界标准,WMI是一种规范和基础结构,通过它可以访问、配置、管理和监视几乎所有的Windows资源。大多用户习惯于使用众多的图形化管理工具来管理Windows资源,在WMI之前这些工具都是通过 Win32应用程序编程接口(Application ProgrammingInterfaces,API)来访问和管理Windows资源的。只要你熟悉系统编程你就知道API有多么重要。但是大多数脚本语言都不能直接调用Win32 API,WMI的出现使得系统管理员可以通过一种简便的方法即利用常见的脚本语言实现常用的系统管理任务。 利用WMI需要和脚本如WSH和VBScript结合起来,可以实现的功能大家可以看微软的MSDN文档。 在编写我们自己的脚本之前,我们需要对WMI的体系结构有个基本的了解。如图一:(1.gif) 在WMI 体系结构中我们最需要关心的就是WMI提供程序,WMI提供程序在WMI和托管资源之间扮演着中间方的角色。提供程序代表使用者应用程序和脚本从WMI托管资源请求信息,并发送指令到WMI托管资源。下面是我们利用WMI编程经常要用到的WMI内置提供程序清单,以供编程参考。 1.Active Directory提供程序 链接库文件:dsprov.dll 命名空间:rootdirectoryldap 作用:将Active Directory 对象映射到 WMI。 2.事件日志提供程序 链接库文件:ntevt.dll 命名空间:rootcimv2 作用:管理 Windows 事件日志,例如,读取、备份、清除、复制、删除、监视、重命名、压缩、解压缩和更改事件日志设置。 3.注册表提供程序 链接库文件:stdprov.dll 命名空间:rootdefault 作用:读取、写入、枚举、监视、创建、删除注册表项和值。 4.Win32 提供程序 链接库文件:cimwin32.dll 命名空间:rootcimv2 作用:提供关于计算机、磁盘、外围设备、文件、文件夹、文件系统、网络组件、操作系统、打印机、进程、安全性、服务、共享、SAM 用户及组,以及更多资源的信息。 5.Windows 安装程序提供程序 链接库文件:msiprov.dll 命名空间:rootcimv2 作用:提供对已安装软件信息的访问。 从上面可以看出在WMI中类(即内置提供程序)被分组到命名空间中,命名空间可以看成是一个组。比如,命名空间 rootcimv2 包括大部分表示通常与计算机和操作系统相关联的资源的类。在使用类的时候要说明类所在的命名空间。类由属性和方法构成。这是可视化编程中的两个重要的概念。属性描述的是对象的状态,方法是对象可以执行的操作。 理论知识学起来很枯燥,下面让我们边分析高手的脚本源码边进行理论知识的巩固吧。 二:解析RTCS.VBS主要代码 = 有时候阅读别人的源码未尝不是一个好而且快捷的办法,下面就让我们来认真学习zzzEVAzzz编写的一个可以远程开启telnet服务的脚本RTCS.VBS。 该脚本可以直接访问目标的WMI,不依赖于目标的ipc$,实现远程开启/关闭目标telnet服务,为了方便大家学习我抽出了最主要的代码,具体分析如下: set objlocator=createobject(wbemscripting.swbemlocator) /创建WbemScripting.SwbemLocator对象(脚本接口)。 /可以看出WMI其实就是把Com组件WbemScripting.SWbemLocator封装起来罢了。 set objswbemservices=objlocator.connectserver(ipaddress,root/default,username,password) /通过ConnectServer函数请求连接到WMI控件服务上,root/default为命名空间。 set objinstance=objswbemservices.get(stdregprov) /建立访问注册表的实例。 set objmethod=objinstance.methods_(SetDWORDvalue) /建立可以更改注册表键值的方法。 set objinparam=objmethod.inparameters.spawninstance_() /MethodData.InParameters用于获取或设置方法的输入参数。这里用spawninstance方法为它建立一个子实例,下面就可以将参数值赋予这个对象的属性。 objinparam.hdefkey=&h80000002 /hdefkey表示根键,根键的十六制值如下: /HKEY_CLASSES_ROOT (&H80000000) /HKEY_CURRENT_USER (&H80000001) /HKEY_LOCAL_MACHINE (&H80000002) /HKEY_USERS (&H80000003) /HKEY_CURRENT_CONFIG (&H80000005) objinparam.ssubkeyname=SOFTWAREMicrosoftTelnetServer1.0 /ssubkeyname表示子键。 objinparam.svaluename=NTLM /svaluename表示属性名。 objinparam.uvalue=ntlm /uvalue表示键值。 set objoutparam=objinstance.execmethod_(SetDWORDvalue,objinparam) /利用execmethod执行方法,这里才真正改写了注册表。 /下面是修改telnet服务的TelnetPort值,原理同上。 objinparam.svaluename=TelnetPort objinparam.uvalue=port set objoutparam=objinstance.execmethod_(SetDWORDvalue,objinparam) 修改telnet的注册表部分就完成了,将NTLM和TelnetPort进行了修改,要是对方的telnet服务没有开启呢?下面就需要根据telnet的具体情况,来启动telnet服务,继续看代码。 /首先查询远程主机上tlntsvr的启动方式。 set objswbemservices=objlocator.connectserver(ipaddress,rootcimv2,username,password) /win32_service类在rootcimv2命名空间中,作用没忘记吧?快看基础知识呵。 set colinstances=objswbemservices.execquery(select * from win32_service where name='tlntsvr') /注意:查询都是通过枚举来实现的。 for each objinstance in colinstances if objinstance.startmode=Disabled then set objmethod=objinstance.methods_(changestartmode) /创建changestartmode方法来改变tlntsvr的启动方式。 set objinparam=objmethod.inparameters.spawninstance_() objinparam.startmode=Manual /将启动方式改为手动方式。 set objoutparam=objinstance.execmethod_(changestartmode,objinparam) end if /下面启动我们的telnet服务。这里zzzEVAzzz的思路好象有点不对,也不知道是不是他的疏忽,我个人认为当telnet服务已经启动时不应该用stopservice方法停止服务。 if objinstance.started=true then intstatus=objinstance.stopservice() /stopservice是WMI中用于停止服务实例的服务的方法。 else intstatus=objinstance.startservice() end if next 三:手把手教你编写WMI版本的ROTS.vbs来开启3389 = zzzVEAzzz 的脚本就分析到这里吧,怎么样?很EASY吧?!我相信大家现在一定蠢蠢欲动了?:)好,一起来写一个什么程序呢?ROTS.vbs我想大家一定都用过吧?什么东东啊?我砸!大家应该知道这个ROTS是有它的使用条件的,不仅要有管理员帐号,还要允许进行ipc连接,在这个到处都是墙的年代,ipc 早就不实用了,而且ROTS.vbs早就被查杀了,那该怎么办?当然是自己动手了。能不能实现ROTS的一样的远程开启33*功能而不受ipc的限制呢?答案自从我写了这篇文章后成为肯定的,哈哈,吹吹了。 当然我们也是要求系统至少是2000server及以上的,最近看到有个软件可以给2000pro开3389,由于比较忙,也没怎么去理它,这里我们暂且不说它,知道了原理一样好办。 开启3389有个注册表导入的方法,其它一些软件的开法,我想也大多是通过修
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业面源污染治理2025年绿色防控技术与政策体系研究报告
- 2025法士特校园招聘模拟试卷附答案详解(突破训练)
- 2025江西数字文化产业有限公司诚聘数字技术部智能化工程师1人考前自测高频考点模拟试题及答案详解(新)
- 高铁建设2025年对中部地区新型城镇化推动作用研究报告
- 2025年杭州淳安县第二人民医院公开招聘合同制工作人员2人考前自测高频考点模拟试题完整答案详解
- 2025年网络安全解决方案行业上市公司技术突破与市场应用报告
- 2025杭州高新区(滨江)教育局所属事业单位直接考核招聘幼儿园聘用制教师13人考前自测高频考点模拟试题附答案详解(典型题)
- 2025广东中山大学附属第一医院惠亚医院院内合同人员(财务科收费处收费员)招聘1人考前自测高频考点模拟试题及一套答案详解
- 2025年潍坊市寒亭区人民检察院公开招聘工作人员模拟试卷及答案详解(各地真题)
- 2025广东云浮市郁南县林业局招聘生态管护人员2人模拟试卷附答案详解(模拟题)
- 劳务装修包清工劳务合同
- 《计算机视觉-基于OpenCV的图像处理》全套教学课件
- GB/T 18029.1-2024轮椅车第1部分:静态稳定性的测定
- 高考生物选择性必修2生物与环境基础知识填空默写(每天打卡)
- FZT 34002-2016 亚麻印染布行业标准
- 2023年高考物理(山东卷)真题评析及2024备考策略
- 全国身份证号地区对应表
- 主要机械设备表(汇总200种)
- GB/T 18386-2017电动汽车能量消耗率和续驶里程试验方法
- GB/T 17282-1998根据运动粘度确定石油分子量(相对分子质量)的方法
- GB/T 13912-2020金属覆盖层钢铁制件热浸镀锌层技术要求及试验方法
评论
0/150
提交评论