SqlServer共用表达式(CTE)With As 处理递归查询 - 天才卧龙 - 博客园

mikel阅读(299)

来源: SqlServer共用表达式(CTE)With As 处理递归查询 – 天才卧龙 – 博客园

共用表表达式(CTE)可以看成是一个临时的结果集,可以再SELECT,INSERT,UPDATE,DELETE,MARGE语句中多次引用。

一好处:使用共用表表达式可以让语句更加清晰简练。

1.可以定义递归公用表表达式(CTE)

2.当不需要将结果集作为视图被多个地方引用时,CTE可以使其更加简洁

3.GROUP BY语句可以直接作用于子查询所得的标量列

4.可以在一个语句中多次引用公用表表达式(CTE)

二定义:公用表达式的定义非常简单,只包含三部分:

  1.   公用表表达式的名字(在WITH之后)
  2.   所涉及的列名(可选)
  3.   一个SELECT语句(紧跟AS之后)

在MSDN中的原型:

WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )

按照是否递归,可以将公用表(CTE)表达式分为递归公用表表达式和非递归公用表表达式.

非递归公用表表达式(CTE)

非递归公用表表达式(CTE)是查询结果仅仅一次性返回一个结果集用于外部查询调用。并不在其定义的语句中调用其自身的CTE

   非递归公用表表达式(CTE)的使用方式和视图以及子查询一致

1
2
3
4
5
WITH cte_Test AS
(
SELECT FROM dbo.SysOrganization
)
SELECT FROM cte_Test

公用表表达式的好处之一是可以在接下来一条语句中多次引用:

 

只能接下来一条使用:

由于CTE只能在接下来一条语句中使用,因此,当需要接下来的一条语句中引用多个CTE时,可以定义多个,中间用逗号分隔:

 

递归公用表表达式(CTE)

递归公用表表达式很像派生表(Derived Tables ),指的是在CTE内的语句中调用其自身的CTE.与派生表不同的是,CTE可以在一次定义多次进行派生递归.对于递归的概念,是指一个函数或是过程直接或者间接的调用其自身,递归的简单概念图如下:

 

对于递归公用表达式来说,实现原理也是相同的,同样需要在语句中定义两部分:

  •    基本语句
  •    递归语句

SQL这两部分通过UNION ALL连接结果集进行返回:

 

 

当然,越强大的力量,就需要被约束.如果使用不当的话,递归CTE可能会出现无限递归。从而大量消耗SQL Server的服务器资源.因此,SQL Server提供了OPTION选项,可以设定最大的递归次数:

还是上面那个语句,限制了递归次数:

 

 

2. CTE后面也可以跟其他的CTE,但只能使用一个with,多个CTE中间用逗号(,)分隔,如下面的SQL语句所示:

复制代码
ith
cte1 as
(
    select * from table1 where name like 'abc%'
),
cte2 as
(
    select * from table2 where id > 20
),
cte3 as
(
    select * from table3 where price < 100
)
select a.* from cte1 a, cte2 b, cte3 c where a.id = b.id and a.id = c.id
复制代码

3. 不能在 CTE_query_definition 中使用以下子句:

复制代码
(1)COMPUTE 或 COMPUTE BY
 
(2)ORDER BY(除非指定了 TOP 子句)
 
(3)INTO
 
(4)带有查询提示的 OPTION 子句
 
(5)FOR XML
 
(6)FOR BROWSE
复制代码

4.如果将 CTE 用在属于批处理的一部分的语句中,那么在它之前的语句必须以分号结尾,如下面的SQL所示:

复制代码
declare @s nvarchar(3)
set @s = 'C%'
;  -- 必须加分号
with
t_tree as
(
    select CountryRegionCode from person.CountryRegion where Name like @s
)
select * from person.StateProvince where CountryRegionCode in (select * from t_tree)
复制代码

如果将 CTE 用在属于批处理的一部分的语句中,那么在它之前的语句必须以分号结尾,如下面的SQL所示:

复制代码
declare @s nvarchar(3)
set @s = 'C%'
;  -- 必须加分号
with
t_tree as
(
    select CountryRegionCode from person.CountryRegion where Name like @s
)
select * from person.StateProvince where CountryRegionCode in (select * from t_tree)
复制代码

最后贴出一个递归相关的语句

复制代码
WITH CTE_Organization([SpClassifyId],[ParentClassifyId],[ClassifyName],ClassifyStatus,IsSiteInspection,IsPerformance,IsAfterPerformance,IsPmInterview,Iscbfy,IsStorage,IsRequired )
 AS 
 (SELECT [SpClassifyId],[ParentClassifyId],[ClassifyName],ClassifyStatus,IsSiteInspection,IsPerformance,IsAfterPerformance,IsPmInterview,Iscbfy,IsStorage,IsRequired 
 FROM dbo.SM_SupplierClassify 
 WHERE [ClassifyName] like '%电梯工程%' and ClassifyStatus='Active' 
 UNION ALL 
 SELECT o.[SpClassifyId],o.[ParentClassifyId],o.[ClassifyName],o.ClassifyStatus,o.IsSiteInspection,o.IsPerformance,o.IsAfterPerformance,o.IsPmInterview,o.Iscbfy,o.IsStorage,o.IsRequired 
 FROM dbo.SM_SupplierClassify o INNER JOIN CTE_Organization oo ON o.[SpClassifyId]=oo.[ParentClassifyId]) 
 SELECT distinct * FROM CTE_Organization
复制代码

上述递归相关的表脚本为:

复制代码
CREATE TABLE [dbo].[SM_SupplierClassify](
    [SpClassifyId] [varchar](100) NOT NULL,
    [ClassifyName] [nvarchar](50) NOT NULL,
    [ClassifyFullName] [nvarchar](100) NULL,
    [ContactPerson] [nvarchar](50) NULL,
    [ContactPhone] [varchar](50) NULL,
    [ParentClassifyId] [varchar](100) NULL,
    [ClassifyLevel] [int] NULL,
    [FullName] [nvarchar](200) NULL,
    [FullId] [varchar](2000) NULL,
    [ClassifyStatus] [varchar](50) NULL,
    [ClassifyRemark] [nvarchar](200) NULL,
    [IsSiteInspection] [bit] NULL,
    [IsPerformance] [bit] NULL,
    [IsAfterPerformance] [bit] NULL,
    [IsPmInterview] [bit] NULL,
    [SeqNo] [int] NULL,
    [Isdeleted] [bit] NULL,
    [CreateUserId] [int] NULL,
    [CreateUserName] [nvarchar](50) NULL,
    [CreateDate] [datetime] NULL,
    [ModifyUserId] [int] NULL,
    [ModifyUserName] [nvarchar](50) NULL,
    [ModifyDate] [datetime] NULL,
    [ForefatherClassifyName] [nvarchar](50) NULL,
    [SupplierClassNo] [nvarchar](100) NULL,
    [Iscbfy] [bit] NULL,
    [IsStorage] [bit] NULL,
    [IsRequired] [bit] NULL,
    [IsMoreContract] [bit] NULL,
PRIMARY KEY CLUSTERED 
(
    [SpClassifyId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
复制代码

数据为:https://files.cnblogs.com/files/chenwolong/%E6%95%B0%E6%8D%AE.zip

@陈卧龙的博客

SQL Server 事务日志文件过大 解决方案_sqlserver日志文件过大-CSDN博客

mikel阅读(359)

来源: SQL Server 事务日志文件过大 解决方案_sqlserver日志文件过大-CSDN博客

事务日志文件(Transaction Log File)是用来记录数据库更新情况的文件,扩展名为ldf。当出现以下情况时,就会报“事务日志已满”的错误:

日志文件没有设置了自动增长,当记录超过初始大小;

日志文件设置了自动增长,“最大文件大小”设置了具体的大小(如2000M),当文件达到设置的大小时。

解决SQL Server数据库事务日志已满的方法
要解决事务日志已满的问题,可以采用以下三种方法,截断日志、收缩日志文件以及修改数据库恢复模式.

修改数据库恢复模式
将数据库恢复模式从“完整模式”或“大容量日志恢复模式”更改为“简单模式”可以解决SQL Server数据库事务日志已满问题。但是,请注意这种方法可能会导致数据丢失。以下是修改数据库恢复模式的步骤:

1. 在 SQL Server Management Studio 中,右键单击数据库,选择“属性”。

 

2. 在“选项”中,将“恢复模式”设置为“简单”,然后点击“确定”

 

3. 在 SQL Server Management Studio 中,右键单击数据库,选择“任务”->“备份”。

 

4. 在“备份类型”中,选择“日志”,点击“确定”。

 

截断日志
截断日志是解决SQL Server数据库事务日志已满问题的较简单方法。通过截断日志,可以清除日志文件中的旧数据,从而释放空间。

在对象资源管理器中,连接到 SQL Server 数据库引擎的实例,然后展开该实例。
展开“数据库”,再右键单击要截断日志的数据库。
指向“任务”,指向“收缩”,然后选择“文件”。
选择文件的文件类型。可用的选项包括“数据”和“日志”文件。默认选项为“数据”。
在与以上所选的“文件类型”相关联的文件组列表中选择文件组。
从所选文件组和文件类型的可用文件列表中选择文件。
选中“释放未使用的空间”选项,将为操作系统释放文件中所有未用空间,并尝试将行重新定位到未分配页。
根据需要,输入在收缩数据库后数据库文件中要保留的最大可用空间百分比。值可以介于 0 和 99 之间。
请注意,在收缩日志文件之前,需要将数据库的恢复模式更改为简单模式。此外,收缩日志文件的步骤与截断日志文件的步骤类似,但是收缩日志文件会将日志文件的大小缩小到指定的大小,而截断日志文件只是删除不活动的虚拟日志文件以释放空间。

总之,使用 SQL Server Management Studio 截断日志的方法包括连接到 SQL Server 数据库引擎的实例,展开“数据库”,右键单击要截断日志的数据库,指向“任务”,指向“收缩”,然后选择“文件”。请注意,在执行截断操作之前,应该备份数据库以防止数据丢失。

收缩日志文件
收缩日志文件是另一种解决SQL Server数据库事务日志已满问题的方法。通过收缩日志文件,可以压缩日志文件的大小,从而释放空间。

在 SQL Server 中,可以使用 SQL Server Management Studio 或 Transact-SQL 来收缩数据或日志文件。以下是使用 SQL Server Management Studio 收缩日志文件的步骤:

在对象资源管理器中,连接到 SQL Server 数据库引擎的实例,然后展开该实例。

展开“数据库”,再右键单击要收缩的数据库。

指向“任务”,指向“收缩”,然后选择“文件”。

 

选择文件的文件类型。可用的选项包括“数据”和“日志”文件。默认选项为“数据”。

在与以上所选的“文件类型”相关联的文件组列表中选择文件组。

从所选文件组和文件类型的可用文件列表中选择文件。

选中“释放未使用的空间”选项,将为操作系统释放文件中所有未用空间,并尝试将行重新定位到未分配页。

根据需要,输入在收缩数据库后数据库文件中要保留的最大可用空间百分比。值可以介于 0 和 99 之间。

请注意,收缩日志文件的步骤与收缩数据文件的步骤略有不同。在收缩日志文件之前,需要将数据库的恢复模式更改为简单模式。以下是使用 Transact-SQL 收缩日志文件的步骤:

将数据库的恢复模式更改为简单模式。
截断事务日志。
收缩日志文件。
具体的 Transact-SQL 命令如下:

— 将数据库的恢复模式更改为简单模式
ALTER DATABASE database_name SET RECOVERY SIMPLE;
— 截断事务日志
BACKUP LOG database_name WITH TRUNCATE_ONLY;
— 收缩日志文件
DBCC SHRINKFILE (file_name, target_size);

其中,file_name 是要收缩的日志文件的逻辑名称,target_size 是要收缩到的目标大小。

总之,收缩日志文件的步骤包括将数据库的恢复模式更改为简单模式、截断事务日志、收缩日志文件。请注意,在执行收缩操作之前,应该备份数据库以防止数据丢失。

使用傲梅企业备份网络版软件备份 SQL Server 数据库并解决事务日志已满问题
如果您的 SQL Server 数据库事务日志已满,并且您正在使用 SSMS 解决该问题,您也可以考虑使用傲梅企业备份网络版软件来备份数据库。傲梅企业备份网络版提供了以下功能:

◉ 提供系统/磁盘/分区/文件备份,助您创建集中备份对于 LAN 内的所有客户端。它还提供 SQL Server 备份,用于在一台 PC/服务器上备份多个实例。
◉ 它使您能够使用计划功能创建自动备份任务。有四种可用的计划模式:一次、每日、每周和每月。
◉ 支持SQL Server 2019/2017/2016/2014/2012/2008(R2)/2005数据库备份。
◉ 它可以安装在Windows Server(Windows Server 2019/2016/2012/2011/2008/2003等)和Windows PC(Windows 10/8.1/8/7/Vista/XP)上。

使用傲梅企业备份网络版软件备份 SQL Server 数据库可以帮助您解决事务日志已满的问题。下面是使用傲梅企业备份网络版备份 SQL Server 数据库的步骤:

1. 在局域网内的其中一台计算机上安装傲梅企业备份网络版作为中央管理计算机。

2.安装客户端程序

启动傲梅企业备份网络版 并转到 “计算机” > “未控制的计算机” > “安装客户端”。您将看到如下两个选项:

客户端手动安装:点击“下一步”即可得到客户端程序安装文件。将安装文件复制到装有 SQL Server 的计算机上,并以管理员身份运行它以安装傲梅企业备份网络版 Agent。

远程客户端安装:点击“下一步”,您将拥有局域网内所有可用的计算机。选择装有SQL Server 的计算机,输入它的用户名和密码,然后单击“安装”。

 

3.请求控制

3.1. 如果您手动安装了客户端程序,客户端计算机将列在 “计算机” > “未控制的计算机”下。勾选装有SQL Server的电脑,点击 “请求控制” 获取控制权限。 提供了两种方法:

输入账号:输入客户端的用户名和密码,点击“确定”。

通过发送消息:程序将向客户端计算机发送消息。在客户端计算机上单击“同意”以授权访问。

 

3.2. 如果您远程安装了客户端程序,客户端计算机将列在 “计算机” > “已控制的计算机”下。在这种情况下,您无需请求控制权。

现在您可以通过 傲梅企业备份网络版每天执行SQL Server自动备份,步骤如下:

1. 转到 “任务” 选项卡,单击 “新建任务” 并选择 “SQL Server 备份”。

 

2. 在弹出窗口中,根据需要编辑任务名称。然后, 在“第一步”栏中点击 “添加计算机” ,选择带有SQL Server数据库的受控计算机。

 

3. 单击“步骤 2”列,然后单击“添加”。该程序将检测计算机上的所有 SQL Server 实例。选择要备份的实例和数据库,然后单击“确定”。

 

4. 单击“第 3 步”列,然后单击“添加存储”。键入网络共享或 NAS 路径以添加目标位置以存储备份文件。

 

5. 单击左下角的“计划并选择您要为其创建计划的计算机”。在“日程设置”窗口的下拉列表中选择“每天” ,完成相应的设置。您还可以通过单击“高级”选择运行完整/差异备份。

 

6. 确认操作,点击 “开始备份”。您可以在此处选择“仅创建任务”或“创建并执行任务”。

 

结论
以上是解决 SQL Server数据库事务日志已满问题的多种方法。截断日志和收缩日志文件是较为简单的方法,但可能会导致数据丢失。修改数据库恢复模式可以解决问题,但也可能会导致数据丢失。使用傲梅企业备份网络版软件备份 SQL Server 数据库是最安全的方法,可以保证数据的完整性。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_41497074/article/details/131675312

解除对svchost.exe的疑惑_termsvcs-CSDN博客

mikel阅读(362)

来源: 解除对svchost.exe的疑惑_termsvcs-CSDN博客

Svchost.exe、lsass.exe、wdfmgr.exe,打开进程列表后你会发现一大堆不知用途的进程,究竟是系统进程还是木马病毒?如果打开系统文件夹,一大堆奇奇怪怪名称的文件,更是会把你弄得晕头转向。很多朋友因此而始终抱有一种未知的恐惧,认为木马、黑客无处不在,即使是高手,也不能把这些陌生的系统文件说个明明白白。为消除大家的疑惑,从这期开始为大家带来一档新的连载栏目——系统蓝色档案为大家曝光这些隐秘文件的秘密。两位主人公,现在就来认识一下。

主人公介绍

小菜:刚接触电脑不久的菜鸟,但对电脑知识有着非常浓厚的学习兴趣,常说的一句话是“菜鸟先飞”。

大嘴:乐于助人的老鸟,经常被别人冠以“大嘴高手”称号,不过这并不是指他嘴特别大,而是一谈到电脑知识就滔滔不绝。

一、紧急状况:系统发现严重病毒

小菜刚刚学习了进程的概念和知识,于是就打开“任务管理器”观察系统中的进程,这一看不要紧,还真发现了一个“病毒”——Svchost.exe,这家伙在系统进程列表中竟然有5个之多(见图1),于是小菜就逐个结束这些进程,没想到第二个进程结束后还会再生,而结束第四个进程时更离谱,系统提示“系统即将关机,离关机还有60秒”,进程再生、错误提示,这些典型的病毒“症状”更让小菜相信“Svchost.exe”是病毒无疑,但无法结束进程,又该怎么清除病毒呢?小菜只好请来了大嘴。

图1 数量众多的SVCHOST进程

大嘴过来后还没看电脑,就先告诉小菜,系统中的Svchost.exe进程是正常系统进程,不是病毒,不仅仅是你,其他朋友一看到系统中这么多的Svchost.exe进程,第一反应也感觉它是病毒,虽然系统中有多个Svchost.exe进程是正常的,但也不保证都是正常的。听起来似乎有些矛盾?这让小菜更有些迷糊,大嘴坐下后给小菜详细讲了起来。

二、松了口气:Svchost.exe是台“CD机”

1.服务装在“CD机”里

Svchost.exe是NT内核操作系统(Windows 2000/XP/2003都属于NT内核操作系统)独有的进程,“Svchost”其实就是“Service Host”(服务宿主)的缩写。微软官方对它的定义是:Svchost.exe是从动态链接库(DLL)中运行的服务的通用主机进程名称,通俗讲,它就是一个服务装载器。大家可以把每个服务想象成一张音乐CD,而Svchost.exe就是用来播放这种CD的CD机。

2.为什么用“CD机”装服务

由于Windows 2000/XP系统服务越来越多,以EXE单独进程的形式启动所有服务会大大增加系统负担,为节省系统资源,微软将一些系统服务以动态链接库(DLL)形式实现,而Svchost.exe就是用来装载这些DLL文件以启动系统服务的程序。没有人会为了发行一张CD而制作一台专用播放此CD的CD机,微软也一样。

3.系统里有几台这样的“CD机”

那为什么系统进程列表中的Svchost.exe会有多个呢?微软为了让系统能更好地进行服务控制,就允许多个Svchost.exe进程同时运行,每个Svchost.exe进程可以包含一组服务,想像一下可以同时容纳3张甚至更多CD的多碟CD机。打开注册表[HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/Svchost]主键,在窗口右侧可以看到许多键值,这里的每个键值都代表一组服务,键值数据则包含了该组服务下面运行的服务名称列表,每组服务启动时都会通过单独的Svchost.exe进程来装载。Windows XP中默认共有六组服务(见图2),其中imgsvc、NetworkService、rpcss、termsvcs四个组,它们都只有一个服务运行,这些服务启动后的Svchost.exe进程用户名为“SYSTEM”。而LocalService和netsvcs组都启动了多个服务,它们的Svchost.exe进程用户名分别为“LOCAL SERVICE”和“NETWORD SERVICE”,从图1中可以看到这种区别。

图2 众多svchost进程的区别

当然了,这六组服务通常并不都是启动状态的,根据系统启动的服务不同,反映在系统进程列表中的Svchost.exe进程数量也是不同的,Windows XP会有四个到六个Svchost.exe进程,而Windows 2000通常则会有两个Svchost.exe进程。

小提示:点击“开始→运行”,在运行框中输入“CMD”回车,然后在打开的命令行窗口中输入“Tasklist /svc”(不含引号)命令,可以更直观地看到每个Svchost.exe进程装载的服务名称列表(见图3)。

图3 查看svchost进程装载的服务名称

4.获取每张“CD”的详细信息

如果想更进一步了解Svchost.exe装载的这些服务都是什么功能,可以记下键值数据中的服务名称,例如“RpcSs”,接着打开注册表的[HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services],再打开下面的“RpcSs”子键,在右边的“Description”键值中就可以看到该服务的描述,而在“ImagePath”键值数据中则可以看到这个服务的运行命令正是“%SystemRoot%/system32/svchost -k rpcss”(见图4)。而在“RpcSs”子键下还有一个“Parameters”(参数)子键,其右边的“ServiceDll”键值数据“%SystemRoot%/system32/rpcss.dll”则表明了RpcSs服务启动时调用的是系统目录下的“Rpcss.dll”文件,这就好像你原来只知道CD中歌曲的歌名,现在又让你能够查到这首歌的演唱者。

图4 查看svchost的具体功能

如果觉得通过注册表查询服务名称了解其属性不太方便,也可以使用“全能助手用Windows服务管理专家”(以下简称“服务管理专家”)来查询,运行软件后单击“All Win32 Services”分支,在右侧服务列表中根据服务名称索引即可快速找到要查询的服务,单击服务名称,即可看到该服务的启动命令以及调用的DLL文件等相关信息(见图5)。同时软件还专门设计了Svchost Group分支,可以快速查询LocalService和netsvcs组中的服务详细信息。

图5 用工具查看svchost的情况

全能助手用Windows服务管理专家 小档案

软件名称:

全能助手用Windows服务管理专家

软件版本:1.02

软件大小:164KB

软件授权:免费

适用平台:Windows 2000/XP

下载地址:

三、危机仍在:小心病毒的骗局

由于Svchost.exe进程的特殊性,它隐藏了真正运行的程序的名称,在表面看到的只是Svchost.exe进程,这个特性同时也让许多病毒、木马有空可钻,企图以此迷惑用户。那么如何判断系统中的多个Svchost.exe进程是否正常呢?下面针对这类病毒常用的几种欺骗手法来进行分析。

骗局1:利用假冒Svchost.exe名称的病毒程序

火眼金睛:这种方式运行的病毒并没有直接利用真正的Svchost.exe进程,而是启动了另外一个名称同样是Svchost.exe的病毒进程,由于这个假冒的病毒进程并没有加载系统服务,它和真正的Svchost.exe进程是不同的,只需在命令行窗口中运行一下“Tasklist /svc”,如果看到哪个Svchost.exe进程后面提示的服务信息是“暂缺”(见图6),而不是一个具体的服务名,那么它就是病毒进程了,记下这个病毒进程对应的PID数值(进程标识符),即可在任务管理器的进程列表中找到它,结束进程后,在C盘搜索Svchost.exe文件,也可以用第三方进程工具直接查看该进程的路径,正常的Svchost.exe文件是位于%systemroot%/System32目录中的,而假冒的Svchost.exe病毒或木马文件则会在其他目录,例如“w32.welchina.worm”病毒假冒的Svchost.exe就隐藏在Windows/System32/Wins目录中,将其删除,并彻底清除病毒的其他数据即可。

图6 查看可疑svchost进程

骗局2:一些高级病毒则采用类似系统服务启动的方式,通过真正的Svchost.exe进程加载病毒程序,而Svchost.exe是通过注册表数据来决定要装载的服务列表的,所以病毒通常会在注册表中采用以下方法进行加载:

添加一个新的服务组,在组里添加病毒服务名
在现有的服务组里直接添加病毒服务名
修改现有服务组里的现有服务属性,修改其“ServiceDll”键值指向病毒程序

判断方法:病毒程序要通过真正的Svchost.exe进程加载,就必须要修改相关的注册表数据,可以打开[HKEY_LOCAL_MACHINE/Software/Microsoft/WindowsNT/CurrentVersion/Svchost],观察有没有增加新的服务组,同时要留意服务组中的服务列表,观察有没有可疑的服务名称,通常来说,病毒不会在只有一个服务名称的组中添加,往往会选择LocalService和netsvcs这两个加载服务较多的组,以干扰分析,还有通过修改服务属性指向病毒程序的,通过注册表判断起来都比较困难,这时可以利用前面介绍的服务管理专家,分别打开LocalService和netsvcs分支,逐个检查右边服务列表中的服务属性,尤其要注意服务描述信息全部为英文的,很可能是第三方安装的服务,同时要结合它的文件描述、版本、公司等相关信息,进行综合判断。例如这个名为PortLess BackDoor的木马程序,在服务列表中可以看到它的服务描述为“Intranet Services”,而它的文件版本、公司、描述信息更全部为空(见图7),如果是微软的系统服务程序是绝对不可能出现这种现象的。从启动信息“C:/WINDOWS/System32/svchost.exe -k netsvcs”中可以看出这是一款典型的利用Svchost.exe进程加载运行的木马,知道了其原理,清除方法也很简单了:先用服务管理专家停止该服务的运行,然后运行regedit.exe打开“注册表编辑器”,删除[HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/IPRIP]主键,重新启动计算机,再删除%systemroot%/System32目录中的木马源程序“svchostdll.dll”,通过按时间排序,又发现了时间完全相同的木马安装程序“PortlessInst.exe”,一并删除即可。

图7 利用多项信息进行综合判断

畅捷通T+ v17任意文件上传漏洞复现_/tplus/sm/setupaccount/upload.aspx?preload=1-CSDN博客

mikel阅读(395)

来源: 畅捷通T+ v17任意文件上传漏洞复现_/tplus/sm/setupaccount/upload.aspx?preload=1-CSDN博客

1.前言
8月29晚上就开始收到通知,让我们来排查一下是否有使用畅捷通的系统,说是疑似0day导致很多用户被植入勒索病毒,一时间风头十足。第二天很多平台都更新的防护策略,本次漏洞是任意文件上传漏洞,如果网站前端存在waf等安全设备,应该是可以被正常拦截的,所以也无需过于担心。

2.漏洞复现
2.1 漏洞信息:
适用版本:<=v17.0
漏洞类型:任意文件上传
漏洞危害:可实现RCE获取主机权限
涉及接口:/tplus/SM/SetupAccount/Upload.aspx?preload=1
2.2 漏洞分析
这是一个上传漏洞,所以我们需要构造一个post的上传请求,请求接口即为/tplus/SM/SetupAccount/Upload.aspx?preload=1,不难看出,这是一个上传用户个人头像的接口。
通过源码分析可知:

上传过程中只检测了Content-Type这一个参数,攻击者可以随意构造filename的参数从而 上传任意文件,这就导致了漏洞的产生。

不难看出上传路径为当前目录下的images目录,即为/tplus/SM/SetupAccount/images/目录。
到这里漏洞的产生原因就很清楚了,算是一个比较常见的上传漏洞,接下来就是常规的文件上传了。

2.3 漏洞利用
我们可以构造如下参数的上传包(出于和谐考虑就不贴完整的上传包了):

Content-Type: multipart/form-data; boundary=—————————33007515338361897914262830846

—————————–33007515338361897914262830846
Content-Disposition: form-data; name=”File1″; filename=”test.html”
Content-Type: image/jpeg

test
—————————–33007515338361897914262830846–

上传之后,如果对方在漏洞利用范围就会成功返回200
此时我们访问一下/tplus/SM/SetupAccount/images/1.html即可访问对应文件,至此这个漏洞的基本复现就完成了。

3.深度利用
注:非授权测试是违法行为,请大家不要恶意攻击他人的业务系统!
漏洞到复现程度在上文就已经实现了,但是实际测试中如果你想要进一步利用就会出现一些问题。

你会发现aspx的文件并不能正常解析,这是由于根目录下的PrecompiledApp.config 中的updatable值设置成了false。导致后面上传的文件无法进行编译。aspx程序无法正常执行。
当然,遇到这种情况,部分环境是可以尝试asp文件进行getshell的。因为asp文件并非.Net处理。这个就只能看运气了绝大多数环境可能并不支持执行asp文件。
但是这种情况并非无法解决问题,我们可以通过手动编译的方式上传编译后的dll文件来提供aspx文件的运行环境。具体操作在这里就不具体分析了,等风头过了之后再考虑补全一下操作方案。
有想复现的白帽子可以参考
https://www.buaq.net/go-53733.html

4.修复方案
官方补丁, https://www.chanjetvip.com/product/goods/goods-detail?id=53aaa40295d458e44f5d3ce5
WAF拦截,由于这是一个常规的上传漏洞,很多waf都是有默认的拦截能力的,需要的话也可以将/tplus/SM/SetupAccount/Upload.aspx路径进行主动拦截。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/xiayu729100940/article/details/126646035

C#中使用log4net记录本地日志的方法和日志工具YALV使用_c# .net 4.0 本地日志-CSDN博客

mikel阅读(296)

来源: C#中使用log4net记录本地日志的方法和日志工具YALV使用_c# .net 4.0 本地日志-CSDN博客

使用log4net记录本地日志,大大方便程序调试,和异常分析

第一步,首先从Visual Studio中的Nuget包管理中搜索下载 Log4Net dll文件 如下图:

 

 

打开配置文件WinFrom或Wpf就是App.config

Web就是web.config,通过推荐配置可以使用日志工具进行日志查看,非常fashion

日志工具下载https://lukepet.github.io/YALV/

 

 

第一种配置

<?xml version=”1.0″?>
<configuration>
<startup>
<supportedRuntime version=”v4.0″ sku=”.NETFramework,Version=v4.0″/>
</startup>
<configSections>
<section name=”log4net” type=”log4net.Config.Log4NetConfigurationSectionHandler, log4net”/>
</configSections>

<log4net>
<!– 定义输出到文件中 –>
<appender name=”RollingLogFileAppender” type=”log4net.Appender.RollingFileAppender”>
<!–定义文件存放位置–>
<file value=”log\\”/>
<!–日志名称–>
<file value=”errorLog.txt”/>
<appendToFile value=”true”/>
<rollingStyle value=”Date”/>
<datePattern value=”yyyy\\yyyyMM\\yyyyMMdd’.txt'”/>
<staticLogFileName value=”false”/>

<!–日志最大可备份数–>
<maxSizeRollBackups value=”10″/>
<!–日志文件大小–>
<maximumFileSize value=”1024KB”/>
<layout type=”log4net.Layout.PatternLayout”>
<!–每条日志末尾的文字说明–>
<!–输出格式–>
<!–样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] – info–>
<conversionPattern value=”%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n出错类:%logger property: [%property{NDC}] – %n错误描述:%message%newline %n”/>
</layout>
</appender>
<root>
<level value=”ERROR”/>
<!–文件形式记录日志–>
<appender-ref ref=”RollingLogFileAppender”/>
</root>
</log4net>
</configuration>

第二种配置

<log4net>
<logger name=”logerror”>
<level value=”ERROR” />
<appender-ref ref=”ErrorAppender” />
</logger>
<logger name=”loginfo”>
<level value=”INFO” />
<appender-ref ref=”InfoAppender” />
</logger>
<appender name=”ErrorAppender” type=”log4net.Appender.RollingFileAppender”>
<param name=”File” value=”Log\\LogError\\” />
<param name=”AppendToFile” value=”true” />
<param name=”MaxSizeRollBackups” value=”100″ />
<param name=”MaxFileSize” value=”10240″ />
<param name=”StaticLogFileName” value=”false” />
<param name=”DatePattern” value=”yyyyMMdd&quot;.txt&quot;” />
<param name=”RollingStyle” value=”Date” />
<layout type=”log4net.Layout.PatternLayout”>
<param name=”ConversionPattern” value=”%n异常时间:%d %n异常级别:%-5p%n异常内容:%m%n” />
</layout> <!–&lt; &gt; = <> %n = 回车–>
</appender>
<appender name=”InfoAppender” type=”log4net.Appender.RollingFileAppender”>
<param name=”File” value=”Log\\LogInfo\\” />
<param name=”AppendToFile” value=”true” />
<param name=”MaxFileSize” value=”10240″ />
<param name=”MaxSizeRollBackups” value=”100″ />
<param name=”StaticLogFileName” value=”false” />
<param name=”DatePattern” value=”yyyyMMdd&quot;.txt&quot;” />
<param name=”RollingStyle” value=”Date” />
<layout type=”log4net.Layout.PatternLayout”>
<param name=”ConversionPattern” value=”日志时间:%d %n日志级别:%-5p %n日志内容:%m%n%n” />
</layout>
</appender>
</log4net>

第三种配置

<configSections>
<section name=”log4net” type=”log4net.Config.Log4NetConfigurationSectionHandler, log4net” />
</configSections>
<log4net>
<logger name=”SysRFLogger”>
<level value=”Debug” />
<appender-ref ref=”SysRFAppender” />
</logger>
<logger name=”DebugRFLogger”>
<level value=”DEBUG” />
<appender-ref ref=”DebugAppender” />
</logger>
<logger name=”MsgLogger”>
<level value=”DEBUG” />
<appender-ref ref=”MsgAppender” />
</logger>
<logger name=”OperInfoLogger”>
<level value=”DEBUG” />
<appender-ref ref=”OperInfoAppender” />
</logger>
<appender name=”SysRFAppender” type=”log4net.Appender.RollingFileAppender”>
<file value=”Logs\syslog.log” />
<appendToFile value=”true” />
<rollingStyle value=”Date” />
<preserveLogFileNameExtension value=”true” />
<datePattern value=”yyyyMMdd” />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%date [%thread] %-5level %logger [%property{NDC}] – %message%newline” />
</layout>
</appender>
<appender name=”DebugAppender” type=”log4net.Appender.RollingFileAppender”>
<file value=”Logs\sysDebuglog.log” />
<appendToFile value=”true” />
<rollingStyle value=”Date” />
<preserveLogFileNameExtension value=”true” />
<datePattern value=”yyyyMMdd” />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%date [%thread] %-5level %logger [%property{NDC}] – %message%newline” />
</layout>
</appender>
<appender name=”MsgAppender” type=”log4net.Appender.RollingFileAppender”>
<file value=”Logs\Messagelog.log” />
<appendToFile value=”true” />
<rollingStyle value=”Date” />
<preserveLogFileNameExtension value=”true” />
<datePattern value=”yyyyMMdd” />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%date [%thread] %-5level %logger [%property{NDC}] – %message%newline” />
</layout>
</appender>
<appender name=”OperInfoAppender” type=”log4net.Appender.AdoNetAppender”>
<bufferSize value=”1″ />
<connectionType value=”System.Data.SQLClient.SQLConnection, System.Data, Version=4.0.30319.18020, Culture=neutral, PublicKeyToken=b77a5c561934e089″ />
<commandText value=”INSERT INTO LOG_USEROPERLOG ([ID],[Date],[User],[Flag],[OperInfo],[OperFlag],[OperResult],[Message]) VALUES (@Id,@log_date, @user, @flag, @operinfo,@operflag, @operresult, @message)” />
<parameter>
<parameterName value=”@Id” />
<dbType value=”String” />
<size value=”36″ />
<layout type=”NT.MultithreadingTaskService.Log.Layout.UserOperLayOut,NT.MultithreadingTaskService.Log”>
<param name=”ConversionPattern” value=”%property{ID}” />
</layout>
</parameter>
<parameter>
<parameterName value=”@log_date” />
<dbType value=”DateTime” />
<layout type=”log4net.Layout.RawTimeStampLayout” />
</parameter>
<parameter>
<parameterName value=”@user” />
<dbType value=”String” />
<size value=”64″ />
<layout type=”NT.MultithreadingTaskService.Log.Layout.UserOperLayOut,NT.MultithreadingTaskService.Log”>
<param name=”ConversionPattern” value=”%property{User}” />
</layout>
</parameter>
<parameter>
<parameterName value=”@flag” />
<dbType value=”Int32″ />
<layout type=”NT.MultithreadingTaskService.Log.Layout.UserOperLayOut,NT.MultithreadingTaskService.Log”>
<param name=”ConversionPattern” value=”%property{Flag}” />
</layout>
</parameter>
<parameter>
<parameterName value=”@operinfo” />
<dbType value=”String” />
<size value=”255″ />
<layout type=”NT.MultithreadingTaskService.Log.Layout.UserOperLayOut,NT.MultithreadingTaskService.Log”>
<param name=”ConversionPattern” value=”%property{OperInfo}” />
</layout>
</parameter>
<parameter>
<parameterName value=”@operflag” />
<dbType value=”String” />
<size value=”32″ />
<layout type=”NT.MultithreadingTaskService.Log.Layout.UserOperLayOut,NT.MultithreadingTaskService.Log”>
<param name=”ConversionPattern” value=”%property{OperFlag}” />
</layout>
</parameter>
<parameter>
<parameterName value=”@operresult” />
<dbType value=”String” />
<size value=”255″ />
<layout type=”NT.MultithreadingTaskService.Log.Layout.UserOperLayOut,NT.MultithreadingTaskService.Log”>
<param name=”ConversionPattern” value=”%property{OperResult}” />
</layout>
</parameter>
<parameter>
<parameterName value=”@message” />
<dbType value=”String” />
<size value=”4000″ />
<layout type=”NT.MultithreadingTaskService.Log.Layout.UserOperLayOut,NT.MultithreadingTaskService.Log”>
<param name=”ConversionPattern” value=”%property{Message}” />
</layout>
</parameter>
</appender>
<root>
<level value=”DEBUG” />
<appender-ref ref=”SysRFAppender” />
</root>
</log4net>

第四种配置也是我最喜欢的

<?xml version=”1.0″ encoding=”utf-8″ ?>

<configuration>
<configSections>
<section name=”log4net” type=”log4net.Config.Log4NetConfigurationSectionHandler, log4net”/>
</configSections>

<log4net>

<!–定义输出到文件中–>
<appender name=”RollingLogFileAppender” type=”log4net.Appender.RollingFileAppender”>
<!–定义文件存放位置–>
<file value=”log\\”/>
<appendToFile value=”true”/>
<rollingStyle value=”Date”/>
<datePattern value=”yyyy\\yyyyMM\\yyyyMMdd-HH’.xml'”/>
<staticLogFileName value=”false”/>
<param name=”MaxSizeRollBackups” value=”100″/>
<Encoding value=”UTF-8″/>
<layout type=”log4net.Layout.XmlLayoutSchemaLog4j”>
<locationInfo value=”true”/>
</layout>
</appender>
<root>
<level value=”Debug”/>
<!–文件形式记录日志–>
<appender-ref ref=”RollingLogFileAppender”/>
</root>

</log4net>

</configuration>

XML要放在configuration节点下

使用方法

private ILog _log = LogManager.GetLogger(“”);
一般常用以下几个方法:
_log.Error();
_log.Debug();
_log.Info();

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/g313105910/article/details/115796506

mysql中插入数据时Duplicate entry '' for key 'PRIMARY'的解决方案_duplicate entry '579' for key 'primary-CSDN博客

mikel阅读(318)

来源: mysql中插入数据时Duplicate entry ” for key ‘PRIMARY’的解决方案_duplicate entry ‘579’ for key ‘primary-CSDN博客

该问题是插入数据表中遇到键重复
1.IGNORE

INSERT IGNORE INTO Table_name(…..) VALUES(1,1),(2,2),(3,3);

使用IGNORE,如果插入的记录中存在重复值会忽略重复值的该记录行,不影响其他行的插入。

2.REPLACE

REPLACE INTO Table_name() VALUES(1,1),(2,2),(3,3)

使用replace当插入的记录遇到主键或者唯一重复时先删除表中重复的记录行再插入

3.*ON DUPLICATE KEY UPDATE *NAME1=VALUES(ID)+1

INSERT TO Table_name() VALUES(1,1),(1,2) ON DUPLICATE KEY UPDATE NAME1=NAME1+1;

ON DUPLICATE KEY UPDATE后面使用VALUES指的是插入记录的值,而不使用VALUES指的是表的自身值。其后执行的UPDATE更新的记录是WHERE重复的主键或唯一键的ID。

以上三种方法均支持标准的INSERT语法,包括INSERT INTO…VALUES,INSERT INTO…SET,INSERT INTO…SELECT。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/zhangyr_student/article/details/80119238

sqlserver 2012 MSSQLSERVER服务显示正在挂起更改且无法启动_sqlserver服务正在挂起更改-CSDN博客

mikel阅读(338)

来源: sqlserver 2012 MSSQLSERVER服务显示正在挂起更改且无法启动_sqlserver服务正在挂起更改-CSDN博客

问题:过了一个周末,本地部署的所有项目突然都登不上去了,项目重新生成,项目的服务重新开启也不行,觉得是数据的问题,果然SQLServer2012无法登陆;
打开服务,看到
在这里插入图片描述

打开SQL2012的配置管理器
在这里插入图片描述
在配置管理器中,

在这里插入图片描述
O(∩_∩)O哈哈~

移动友华PT924光猫获取超级用户方法_pt924g超级密码-CSDN博客

mikel阅读(490)

来源: 移动友华PT924光猫获取超级用户方法_pt924g超级密码-CSDN博客

一、电脑有线或无线连接到PT924,用光猫背后的User用户登陆。

二、在登陆后的浏览器地址栏输入:

http://192.168.1.1/cgi-bin/abcdidfope94e0934jiewru8ew414.cgi,

返回200OK信息,成功开启Telnet服务。

三、打开电脑命令提示符界面(CMD),输入Telnet,

用户名为yhtcAdmin,密码为Cm1@YHfw

成功登陆后,在#号依次输入:

#cd /usr/local/ct

#vi lastgood.xml

然后查找用户和密码,在vi中,

先输入“:”,进入命令模式,

然后输入“/SUSER_PASSWORD”,查找密码。

如成功,则会看到

 

这就是超级用户名和密码了,记录下来。

注,退出VI方法,输入“:”号进入命令模式,接着输入“q!”,回车即可退出。

四、然后在浏览器中,输入http://192.168.1.1,用以上查到的信息可以进入超级用户模式了。

五、随后,您就可以根据自己需要改光猫为桥接模式了。

感谢https://blog.csdn.net/gsls200808/article/details/106307953提供的telnet开启信息。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/xeastsun/article/details/119767111

Telnet远程文件传输_telnet 传输文件-CSDN博客

mikel阅读(266)

来源: Telnet远程文件传输_telnet 传输文件-CSDN博客

Telnet远程文件传输
前期准备
两台电脑同一网段
电脑A(172.16.40.112)电脑B(172.16.40.24)
解决把电脑A中文件通过telnet传输到电脑B中
1、勾选telnet客户端、打开telnet服务

①右键我的电脑–属性–控制面板–程序–程序和功能–启用/关闭windows功能–勾选Telnet Client-确定

②电脑A使用快捷键windows+R–输入cmd打开命令行–输入telnet进入telnet页面

③输入“open+ip”这里我们输入电脑B的ip即为“open 172.16.40.24”

④输入电脑B用户名、密码和域名(PS:域名输任意值即可),进入之后如下图所示

 

⑤打开需要共享的文件盘例如D盘即输入命令“net share file=D:\files”

⑥电脑A再次使用快捷键windows+R–输入cmd打开命令行-输入命令“net share file=D:\111”(PS:111即为要分享的文件)

⑦输入命令“net use \172.16.40.24\ipc$ “123456” /user:“administrator””连接到电脑B

⑧输入复制命令“xcopy d:\1.txt \172.16.40.24\D( D (D(D就是上面提到的共享文件的共享名,这个位置可以是任意你需要的并且共享了的共享文件的共享名)”即可完成复制

PS:关掉一切杀毒软件及防火墙,不然会出现复制不成功情况
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_39870603/article/details/114928541

移动光猫gm228-s超级管理密码获取及桥接 - 哔哩哔哩

mikel阅读(502)

来源: 移动光猫gm228-s超级管理密码获取及桥接 – 哔哩哔哩

强烈建议有一定操作基础的人进行!

强烈建议有一定操作基础的人进行!

强烈建议有一定操作基础的人进行!

否则建议海鲜市场,让人远程操作。

这里只是提供操作思路,有空我在补全一些操作。

如果超级管理密码不是:aDm8H%MdA,那么就是动态密码了。

Telnet的普通用户及密码(此用户没有修改权限)

用户名:CMCCAdmin

光猫背面user的密码+@C1(没有加号)

在这个模式下可以查看宽带的账号密码,应该是/etc/network/….忘是哪里,完了有空补上。

获取root用户的密码

推荐谷歌或者微软edge浏览器:按F12进入开发者模式

地址栏输入:192.168.1.1/webcmcc/telnet.html(会默认打开telnet服务)

在开发者栏中,network(网络)标签中,有一个条请求,点击右边选择playload(参数负载)

包含admin和一个密码,这个密码就是telnet的密码。

这里很坑,我一直以为admin是账号,其实是root

省略telnet操作教程。。。。

登录进去后

cd /config/worka 回车

ls -al 回车

vi lastgood.xml 回车

/TeleAccountName 回车

这里是键值对

超级账户的账号:aucTeleAccountName

密码:aucTeleAccountPassword

我们需要修改后面的Value中的内容

这里的其实可以看见user用户,并且密码是16进制数所对应的ASCII码。但是超级用户的就不是了,只能通过修改超级密码,改成和user用户一样的即可。

鼠标框选 aucUserAccountPassword 后面Value内的十六进制数字,如果是windows命令行进行的telnet操作,单击摁住鼠标左键选中value内的数字,不包含双引号(不用复制后面的00,00),然后单机右键,新建一个记事本,ctrl+v 复制,看下对不对,最后一个数字后面不包含逗号。

按键盘 i 键进入编辑模式

用方向键移动光标删除 aucTeleAccountPassword 后面Value引号内的十六进制数字,很长。。。

鼠标右键粘贴之前复制的内容

按 Esc 退出编辑模式

:wq 回车

reboot 回车

等待2分钟路由重启

登录光猫

输入aucTeleAccountName 后面Value的值,应该是CMCCAdmin

输入光猫背面的默认终端配置密码 作者:24339999341_bili https://www.bilibili.com/read/cv30017987/?jump_opus=1 出处:bilibili