电脑问题:利用c#获取局域网服务器的ip以及对应的数据库
在net中提供了一些类来显示和控制Windows系统上的服务,并可以实现对远程计算机服务服务的访问,如SystemServiceProcess命名空间下面的ServiceController 类,SystemManagement下面的一些WMI操作的类。虽然用ServiceController可以很方便的实现对服务的控制,而且很直观、简洁和容易理解。但是我认为他的功能同通过WMI来操作服务相比,那可能就有些单一了,并且对多个服务的操作可能就比较麻烦,也无法列出系统中的所有服务的具体数据。这里要讲的就是如何使用SystemManagement组件来操作远程和本地计算机上的服务。
WMI作为Windows 2000操作系统的一部分提供了可伸缩的,可扩展的管理架构公共信息模型(CIM)是由分布式管理任务标准协会(DMTF)设计的一种可扩展的、面向对象的架构,用于管理系统、网络、应用程序、数据库和设备。Windows管理规范也称作CIM for Windows,提供了统一的访问管理信息的方式。如果需要获取详细的WMI信息请读者查阅MSDN。SystemManagement组件提供对大量管理信息和管理事件集合的访问,这些信息和事件是与根据 Windows 管理规范 (WMI) 结构对系统、设备和应用程序设置检测点有关的。
但是上面并不是我们最关心的,下面才是我们需要谈的话题。毫无疑问,我们要引用SystemManagementDll程序集,并要使用SystemManagement命名空间下的类,如ManagementClass,ManagementObject等。下面用一个名为Win32ServiceManager的类把服务的一些相关操作包装了一下,代码如下:
using System;
using SystemManagement;
namespace ZZWmi
{
public class Win32ServiceManager
{ private string strPath;private ManagementClass managementClass;public Win32ServiceManager():this("",null,null){
}
public Win32ServiceManager(string host,string userName,string password)
{thisstrPath = "\\\\"+host+"\\root\\cimv2:Win32_Service";
thismanagementClass = new ManagementClass(strPath);if(userName!=null&&userNameLength>0)
{
ConnectionOptions connectionOptions = new ConnectionOptions();connectionOptionsUsername = userName;
connectionOptionsPassword = password;
ManagementScope managementScope = new ManagementScope( "\\\\" +host+ "\\root\\cimv2",connectionOptions) ;
thismanagementClassScope = managementScope;
}
}
// 验证是否能连接到远程计算机
public static bool RemoteConnectValidate(string host,string userName,string password){
ConnectionOptions connectionOptions = new ConnectionOptions();connectionOptionsUsername = userName;
connectionOptionsPassword = password;
ManagementScope managementScope = new ManagementScope( "\\\\" +host+ "\\root\\cimv2",connectionOptions) ;
try
{
managementScopeConnect();}
catch
{
}
return managementScopeIsConnected;}
// 获取指定服务属性的值
public object GetServiceValue(string serviceName,string propertyName){
ManagementObject mo = thismanagementClassCreateInstance();moPath = new ManagementPath(thisstrPath+"Name=\""+serviceName+"\"");return mo[propertyName];}
// 获取所连接的计算机的所有服务数据
public string [,] GetServiceList()
{
string [,] services = new string [thismanagementClassGetInstances()Count,4];int i = 0;
foreach(ManagementObject mo in thismanagementClassGetInstances())
{
services[i,0] = (string)mo["Name"];services[i,1] = (string)mo["DisplayName"];
services[i,2] = (string)mo["State"];
services[i,3] = (string)mo["StartMode"];
i++;
}
return services;}
// 获取所连接的计算机的指定服务数据
public string [,] GetServiceList(string serverName)
{
return GetServiceList(new string []{serverName});}
// 获取所连接的计算机的的指定服务数据
public string [,] GetServiceList(string [] serverNames)
{
string [,] services = new string [serverNamesLength,4];
ManagementObject mo = thismanagementClassCreateInstance();
for(int i = 0;i<serverNamesLength;i++)
{
moPath = new ManagementPath(thisstrPath+"Name=\""+serverNames[i]+"\"");
services[i,0] = (string)mo["Name"];
services[i,1] = (string)mo["DisplayName"];
services[i,2] = (string)mo["State"];
services[i,3] = (string)mo["StartMode"];
} return services;}
// 停止指定的服务
public string StartService(string serviceName)
{ string strRst = null;
ManagementObject mo = thismanagementClassCreateInstance();moPath = new ManagementPath(thisstrPath+"Name=\""+serviceName+"\"");
try
{if((string)mo["State"]=="Stopped")//!(bool)mo["AcceptStop"]moInvokeMethod("StartService",null);
}
catch(ManagementException e){ strRst =eMessage; }
return strRst;
}
// 暂停指定的服务
public string PauseService(string serviceName)
{
string strRst = null;
ManagementObject mo = thismanagementClassCreateInstance();moPath = new ManagementPath(thisstrPath+"Name=\""+serviceName+"\"");
try{
//判断是否可以暂停
if((bool)mo["acceptPause"]&&(string)mo["State"]=="Running")moInvokeMethod("PauseService",null);}
catch(ManagementException e){
strRst =eMessage; }
return strRst;}
// 恢复指定的服务
public string ResumeService(string serviceName)
{
string strRst = null;
ManagementObject mo = thismanagementClassCreateInstance();
moPath = new ManagementPath(thisstrPath+"Name=\""+serviceName+"\"");
try
{
//判断是否可以恢复
if((bool)mo["acceptPause"]&&(string)mo["State"]=="Paused")moInvokeMethod("ResumeService",null);}
catch(ManagementException e){strRst =eMessage;
}
return strRst;}
// 停止指定的服务
public string StopService(string serviceName)
{ string strRst = null;
ManagementObject mo = thismanagementClassCreateInstance();
moPath = new ManagementPath(thisstrPath+"Name=\""+serviceName+"\"");
try
{//判断是否可以停止
if((bool)mo["AcceptStop"])//(string)mo["State"]=="Running"
moInvokeMethod("StopService",null);
}
catch(ManagementException e)
{
strRst =eMessage; }
return strRst;
}
}
}
在Win32ServiceManager中通过RemoteConnectValidate静态方法来测试连接成功与否;另外提供了GetServiceValue方法和GetServiceList方法以及它的重载来获取服务信息;后面的四个方法就是对服务的状态控制了。
第一步:首先远程服务器
开始→程序→附件→远程桌面连接→输入远程服务器的地址,登陆
第二步:将服务器上的sqlserver数据库导出来
数据库→表名→在你要导出的表名称上右键→任务→导出数据→出现欢迎使用SQLServer导入和导出向导→下一步→数据源选择你需要的数据源→服务器名称输入服务器的地址→身份验证选择‘使用SQLServer身份验证’→输入你的用户名和密码→数据库选择你需要导出数据的数据库→下一步→复制一个或多个表或视图的数据→下一步→选择你要导出数据的表(可先预览)→下一步→完成
希望可以帮到你
元数据简介
元数据 (metadata) 最常见的定义为“有关数据的结构数据”,或者再简单一点就是“关于数据的信息”,日常生活中的图例、图书馆目录卡和名片等都可以看作是元数据。在关系型数据库管理系统 (DBMS) 中,元数据描述了数据的结构和意义。比如在管理、维护 SQL Server 或者是开发数据库应用程序的时候,我们经常要获取一些涉及到数据库架构的信息:
◆某个数据库中的表和视图的个数以及名称;
◆某个表或者视图中列的个数以及每一列的名称、数据类型、长度、精度、描述等;
◆某个表上定义的约束;
◆某个表上定义的索引以及主键/外键的信息。
下面我们将介绍几种获取元数据的方法。
获取元数据
使用系统存储过程与系统函数访问元数据
获取元数据最常用的方法是使用 SQL Server 提供的系统存储过程与系统函数。
系统存储过程与系统函数在系统表和元数据之间提供了一个抽象层,使得我们不用直接查询系统表就能获得当前数据库对象的元数据。
常用的与元数据有关的系统存储过程有以下一些:
系统存储过程
◆sp_columns 返回指定表或视图的列的详细信息。
◆sp_databases 返回当前服务器上的所有数据库的基本信息。
◆sp_fkeys 若参数为带有主键的表,则返回包含指向该表的外键的所有表;若参数为带有外键的表名,则返回所有同过主键/外键关系与该外键相关联的所有表。
◆sp_pkeys 返回指定表的主键信息。
◆sp_server_info 返回当前服务器的各种特性及其对应取值。
◆sp_sproc_columns 返回指定存储过程的的输入、输出参数的信息。
◆sp_statistics 返回指定的表或索引视图上的所有索引以及统计的信息。
◆sp_stored_procedures 返回当前数据库的存储过程列表,包含系统存储过程。
◆sp_tables 返回当前数据库的所有表和视图,包含系统表。
常用的与元数据有关的系统函数有以下一些:
系统函数
◆COLUMNPROPERTY 返回有关列或过程参数的信息,如是否允许空值,是否为计算列等。
◆COL_LENGTH 返回指定数据库的指定属性值,如是否处于只读模式等。
◆DATABASEPROPERTYEX 返回指定数据库的指定选项或属性的当前设置,如数据库的状态、恢复模型等。
◆OBJECT_ID 返回指定数据库对象名的标识号
◆OBJECT_NAME 返回指定数据库对象标识号的对象名。
◆OBJECTPROPERTY 返回指定数据库对象标识号的有关信息,如是否为表,是否为约束等。
◆fn_listextendedproperty 返回数据库对象的扩展属性值,如对象描述、格式规则、输入掩码等。
由于我们无法直接利用到存储过程与函数的返回结果,因此只有在我们关心的只是查询的结果,而不需要进一步利用这些结果的时候,我们会使用系统存储过程与系统函数来查询元数据。
例如,如果要获得当前服务器上所有数据库的基本信息,我们可以在查询分析器里面运行:
EXEC sp_databases
GO
在返回结果中我们可以看到数据库的名称、大小及备注等信息。
但是如果要引用这部分信息,或者存储这部分信息以供后面使用,那么我们必须借助中间表来完成这个操作:
CREATE TABLE #sp_result
(
DATABASE_NAME sysname,
DATABASE_SIZE int,
REMARKS varchar(254) NULL
)
GO
INSERT INTO #sp_result
EXEC ('sp_databases')
GO
使用信息架构视图访问元数据
信息架构视图基于 SQL-92 标准中针对架构视图的定义,这些视图独立于系统表,提供了关于 SQL Server 元数据的内部视图。信息架构视图的最大优点是,即使我们对系统表进行了重要的修改,应用程序也可以正常地使用这些视图进行访问。因此对于应用程序来说,只要是符合 SQL-92 标准的数据库系统,使用信息架构视图总是可以正常工作的。
信息架构视图
◆INFORMATION_SCHEMACHECK_CONSTRAINTS:返回有关列或过程参数的信息,如是否允许空值,是否为计算列等。
◆INFORMATION_SCHEMACOLUMNS:返回当前数据库中当前用户可以访问的所有列及其基本信息。
◆INFORMATION_SCHEMACONSTRAINT_COLUMN_USAGE:返回当前数据库中定义了约束的所有列及其约束名。
◆INFORMATION_SCHEMACONSTRAINT_TABLE_USAGE:返回当前数据库中定义了约束的所有表及其约束名。
◆INFORMATION_SCHEMAKEY_COLUMN_USAGE:返回当前数据库中作为主键/外键约束的所有列。
◆INFORMATION_SCHEMASCHEMATA:返回当前用户具有权限的所有数据库及其基本信息。
◆INFORMATION_SCHEMATABLES:返回当前用户具有权限的当前数据库中的所有表或者视图及其基本信息。
◆INFORMATION_SCHEMAVIEWS:返回当前数据库中的当前用户可以访问的视图及其所有者、定义等信息。
由于这些信息架构都是以视图的方式存在的,因此我们可以很方便地获得并利用需要的信息。
例如,我们要得到某个表有多少列,可以使用以下语句:
SELECT COUNT() FROM INFORMATION_SCHEMACOLUMNS
WHERE TABLE_NAME='mytable'
使用系统表访问元数据
虽然使用系统存储过程、系统函数与信息架构视图已经可以为我们提供了相当丰富的元数据信息,但是对于某些特殊的元数据信息,我们仍然需要直接对系统表进行查询。因为SQL Server 将所有数据库对象的信息均存放在系统表中,作为 SQL Server 的管理、开发人员,了解各个系统表的作用将有助于我们了解 SQL Server 的内在工作原理。
SQL Server 的系统表非常多,其中最常用的与元数据查询有关的表有如下一些:
syscolumns 存储每个表和视图中的每一列的信息以及存储过程中的每个参数的信息。
syscomments 存储包含每个视图、规则、默认值、触发器、CHECK 约束、DEFAULT 约束和存储过程的原始 SQL 文本语句。
sysconstraints 存储当前数据库中每一个约束的基本信息。
sysdatabases 存储当前服务器上每一个数据库的基本信息。
sysindexes 存储当前数据库中的每个索引的信息。
sysobjects 存储数据库内的每个对象(约束、默认值、日志、规则、存储过程等)的基本信息。
sysreferences 存储所有包括 FOREIGN KEY 约束的列。
systypes 存储系统提供的每种数据类型和用户定义数据类型的详细信息。
将系统存储过程、系统函数、信息架构视图与系统表结合使用,可以方便地让我们获得所有需要的元数据信息。
示例:
1、 获得当前数据库所有用户表的名称。
SELECT OBJECT_NAME (id)
FROM sysobjects
WHERE xtype = 'U' AND OBJECTPROPERTY (id, 'IsMSShipped') = 0
其中主要用到了系统表 sysobjects以及其属性 xtype,还有就是用到了 OBJECTPROPERTY 系统函数来判断是不是安装 SQL Server 的过程中创建的对象。
2、获得指定表上所有的索引名称。
SELECT name FROM sysindexes
WHERE id = OBJECT_ID ('mytable') AND indid > 0
综合实例
下面给出了一个存储过程,它的作用是自动将当前数据库的用户存储过程加密。
DECLARE @sp_name nvarchar(400)
DECLARE @sp_content nvarchar(2000)
DECLARE @asbegin int
declare @now datetime
select @now = getdate()
DECLARE sp_cursor CURSOR FOR
SELECT object_name(id)
FROM sysobjects
WHERE xtype = 'P'
AND type = 'P'
AND crdate < @now
AND OBJECTPROPERTY(id, 'IsMSShipped')=0
OPEN sp_cursor
FETCH NEXT FROM sp_cursor
INTO @sp_name
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @sp_content = text FROM
syscomments WHERE id = OBJECT_ID(@sp_name)
SELECT @asbegin =
PATINDEX ( '%AS' + char(13) + '%', @sp_content)
SELECT @sp_content =
SUBSTRING(@sp_content, 1, @asbegin - 1)
+ ' WITH ENCRYPTION AS'
+ SUBSTRING (@sp_content, @asbegin+2, LEN(@sp_content))
SELECT @sp_name = 'DROP PROCEDURE [' + @sp_name + ']'
EXEC sp_executesql @sp_name
EXEC sp_executesql @sp_content
FETCH NEXT FROM sp_cursor
INTO @sp_name
END
CLOSE sp_cursor
DEALLOCATE sp_cursor
该存储过程利用了 sysobjects 和 syscomments 表,并巧妙地修改了原存储过程的 SQL 定义语句,将 AS 修改为了 WITH ENCRYPTION AS,从而达到了加密存储过程的目的。本存储过程在 SQL Server 2000 上通过。
您可能感兴趣的文章:调用MySQL中数据库元数据的方法SQL Server 使用 SET FMTONLY ON 获得表的元数据
0条评论