代码程序实现域密码和domino密码的统一性及权限控制和日志统计功能

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

前面的文件咱们分别介绍了,通过web方式重置domino邮箱用户的internet密码、web方式重置域密码等功能及重置域密码后台重置domino密码的internet,来保证域密码和邮箱密码统一性;

因为作为管理员来说重置密码是家常便饭,但是安全也是必需考虑的,怎么说呢,比如管理员故意找某些用户的问题,重置用户密码导致不能正常使用,甚至更严重的是,老板的密码被重置了,后果非常严重,老板会问我的密码前一段时间自己更改过,怎么密码突然就不对了,然后老板会问,帮忙查一下,到底是怎么回事,那作为IT部门的责任人会怎么做呢,无从查找,那今天主要介绍,为了防止上面的问题发生,需要做对用户的操作记录通过日志的形式登记,第二:就是通过权限设置对web方式重置页面进行权限控制;具体见下:

目的:

委派指定的用户通过web方式对用户进行密码重置,重置的过程中domino的internet密码也被修改,达到密码统一性,同时对委派的用户进行重置记录的log形式登记

操作步骤:

1.创建委派用户的用户组(restpwd),将权限委派给普通组内的用户,通过提取组内的用户进行验证登陆及重置工作;将重置密码的权限委派个user01、user02、同时将该用户添加到组即可。

2.创建登陆及验证页面及权限控制

3.对用户的重置记录做log形式的登记。

1. 创建用户组resetpwd

clip_image002

2.创建登陆界面借权限控制

首先呢,还是在原有的功能上进行修改(源代码本人博客的附件中,可以通过自己的真实环境下使用,通过修改自己需要的域名即可);、

首先在models下创建登陆界面试图;并且添加脚本内容;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using  System;
using  System.Collections.Generic;
using  System.Configuration;
using  System.IO;
using  System.Linq;
using  System.Web;
namespace  ChangePassword.Models
{
public  class  Logger
{
private  static  string LogFile = ConfigurationManager.AppSettings[ "LogFile" ].ToString();
public  static  void  CheckLog(string Log)
{
if  (File.Exists(LogFile))
{
WriteLog(Log);
}
else
{
CreateLog();
WriteLog(Log);
}
}
private  static  void  CreateLog()
{
StreamWriter SW;
SW = File.CreateText(LogFile);
SW.Close();
}
private  static  void  WriteLog(string Log)
{
using  (StreamWriter SW = File.AppendText(LogFile))
{
SW.WriteLine(Log);
SW.Close();
}
}
}
}

clip_image004

接下来添加配置文件,该文件需要在ADOperator.cs下添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Web;
using  System.DirectoryServices;
using  System.Runtime.InteropServices;
using  System.Security.Principal;
using  System.Configuration;
using  System.Collections;
namespace  ChangePassword.Models
{
public  class  ADOperator
{
///
///域名
///
private  static  string DomainName = ConfigurationManager.AppSettings[ "DomainName" ].ToString();
///
/// LDAP 地址
///
private  static  string LDAPDomain = ConfigurationManager.AppSettings[ "LDAPDomain" ].ToString();
///
/// LDAP绑定路径
///
private  static  string ADPath = ConfigurationManager.AppSettings[ "ConnectionLDAP" ].ToString();
///
///管理员登录帐号
///
private  static  string ADUser = ConfigurationManager.AppSettings[ "LDAPAdminUser" ].ToString();
///
///管理员登录密码
///
private  static  string ADPassword = ConfigurationManager.AppSettings[ "LDAPAdminPwd" ].ToString();
private  static  string ADGroupName = ConfigurationManager.AppSettings[ "ADGroupName" ].ToString();
public  static  ArrayList adminlist = null;
private  static  DirectoryEntry root = null;
//private static DirectorySearcher searcher = null;
//private static SearchResultCollection results = null;
public  ADOperator()
{
root =  new  DirectoryEntry(ADPath, ADUser, ADPassword, AuthenticationTypes.Secure);
//searcher = new DirectorySearcher(root);
//searcher.PropertiesToLoad.Add("cn");
//searcher.PropertiesToLoad.Add("DisplayName");
//searcher.PropertiesToLoad.Add("mail");
//searcher.PropertiesToLoad.Add("SAMAccountName");
//searcher.PropertiesToLoad.Add("Department");
//searcher.PropertiesToLoad.Add("userPassword");
//searcher.Filter = "(objectcategory=user)";
//searcher.SearchScope = SearchScope.Subtree;
//searcher.SizeLimit = Int32.MaxValue;
//searcher.PageSize = 1000;
//searcher.Sort = new SortOption("SAMAccountName", System.DirectoryServices.SortDirection.Ascending);
//results = searcher.FindAll();
}
/// <summary>
/// 释放占用资源
/// </summary>
public  void  dispose()
{
root.Dispose();
root = null;
//searcher.Dispose();
//searcher = null;
//results.Dispose();
//results = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
public  int  Login(string itcode, string pwd)
{
// 这个地方改一下。。 域名
itcode =  "iiosoft\\"  + itcode;
DirectoryEntry rootUser =  new  DirectoryEntry(ADPath, itcode, pwd, AuthenticationTypes.None);
DirectorySearcher deSearch =  new  DirectorySearcher(rootUser);
deSearch.Filter =  "(&(&(objectCategory=person)(objectClass=user))(sAMAccountName="  + itcode +  "))" ;
try
{
SearchResult rs = deSearch.FindOne();
rootUser.Dispose();
rootUser = null;
deSearch.Dispose();
deSearch = null;
rs = null;
return  1;
}
catch
{
rootUser.Dispose();
rootUser = null;
deSearch.Dispose();
deSearch = null;
return  0;
}
}
public  int  IsUserExistsByAccount(string itcode)
{
DirectorySearcher de =  new  DirectorySearcher(root);
de.Filter =  "(&(&(objectCategory=person)(objectClass=user))(sAMAccountName="  + itcode +  "))" ;
de.SearchScope = SearchScope.Subtree;
SearchResultCollection sr = de.FindAll();
if  (sr.Count > 0)
{
return  1;
}
else
{
return  0;
}
//foreach (SearchResult result in results)
//{
// DirectoryEntry entry = result.GetDirectoryEntry();
// if (result.Properties["SAMAccountName"][0].ToString().ToUpper() == itcode.ToString().ToUpper())
// {
// return 1;
// }
//}
//return 0;
}
public  int  ChangeUserPassword(string itcode, string opwd, string npwd)
{
DirectorySearcher de =  new  DirectorySearcher(root);
de.Filter =  "(&(&(objectCategory=person)(objectClass=user))(sAMAccountName="  + itcode +  "))" ;
de.SearchScope = SearchScope.Subtree;
SearchResult sr = de.FindOne();
DirectoryEntry user = sr.GetDirectoryEntry();
try
{
user.Invoke( "ChangePassword" new  object[] { opwd, npwd });
root.CommitChanges();
root.Close();
return  1;
}
catch
{
return  0;
}
}
///设置帐号密码,管理员可以通过它来修改指定帐号的密码。
///
///用户帐号
///用户新密码
public  int  SetPasswordByAccount(DirectoryEntry de,string sAMAccountName, string newPassword)
{
//try
//{
// DirectoryEntry de = GetDirectoryEntryByAccount(sAMAccountName);
// // 模拟超级管理员,以达到有权限修改用户密码
// IdentityImpersonation impersonate = new IdentityImpersonation(ADUser, ADPassword, DomainName);
// impersonate.BeginImpersonate();
// de.AuthenticationType = AuthenticationTypes.Secure;
// //de.Properties["userPassword"].Value = newPassword;
// de.Invoke("SetPassword", new object[] { newPassword });
// de.CommitChanges();
// impersonate.StopImpersonate();
// de.Close();
//}
//catch (Exception ex)
//{
// throw;
//}
int  flag = 0;
try
{
// DirectoryEntry de = new DirectoryEntry();
//DirectoryEntry de = GetDirectoryObject();
//de.Path = "";
//de.AuthenticationType = AuthenticationTypes.Secure;
DirectorySearcher deSearch =  new  DirectorySearcher(de);
deSearch.Filter =  "(&(objectClass=user) (SAMAccountName="  + sAMAccountName +  "))" ; //类型Type为user
SearchResultCollection results = deSearch.FindAll();
if  (results.Count == 1)
{
foreach (SearchResult OneSearchResult in results)
{
DirectoryEntry AlterUser = OneSearchResult.GetDirectoryEntry();
AlterUser.AuthenticationType = AuthenticationTypes.Secure;
AlterUser.Invoke( "SetPassword" , newPassword);
AlterUser.CommitChanges();
AlterUser.Close();
}
flag = 1;
}
}
catch  (Exception ex)
{
flag = 0;
}
return  flag;
}
///
///根据用户帐号称取得用户的 对象
///
///用户帐号名
///如果找到该用户,则返回用户的 对象;否则返回 null
public  static  DirectoryEntry GetDirectoryEntryByAccount(string sAMAccountName)
{
DirectoryEntry de = GetDirectoryObject();
DirectorySearcher deSearch =  new  DirectorySearcher(de);
deSearch.Filter =  "(&(&(objectCategory=person)(objectClass=user))(sAMAccountName="  + sAMAccountName +  "))" ;
deSearch.SearchScope = SearchScope.Subtree;
try
{
SearchResult result = deSearch.FindOne();
de =  new  DirectoryEntry(result.Path);
return  de;
}
catch
{
return  null;
}
}
///
///获得DirectoryEntry对象实例,以管理员登陆AD
///
///
private  static  DirectoryEntry GetDirectoryObject()
{
DirectoryEntry entry =  new  DirectoryEntry(ADPath, ADUser, ADPassword, AuthenticationTypes.Secure);
return  entry;
}
public  static  DirectoryEntry GetDirectoryObject(string userName, string password)
{
// userName = DomainName + "\\" + userName;
DirectoryEntry entry =  new  DirectoryEntry(ADPath, userName, password, AuthenticationTypes.Secure);
return  entry;
}
public  static  void  GetGroupUserList()
{
adminlist =  new  ArrayList();
DirectoryEntry entry =  new  DirectoryEntry(ADPath);
DirectorySearcher mySearcher =  new  DirectorySearcher(entry);
mySearcher.Filter =  "(&(&(objectCategory=group)(objectClass=group))(CN="  + ADGroupName +  "))" //("(objectClass=organizationalUnit)");
SearchResult results = mySearcher.FindOne();
string grouppath =  "" ;
if  (results != null)
{
grouppath = results.Path;
DirectoryEntry dirEntry =  new  DirectoryEntry(grouppath);
PropertyCollection propertyCollection = dirEntry.Properties;
int  count = propertyCollection[ "member" ].Count;
for  ( int  i = 0; i < count; i++)
{
string respath = results.Path;
string[] pathnavigate = respath.Split( "CN" .ToCharArray());
respath = pathnavigate[0];
string objpath = propertyCollection[ "member" ][i].ToString();
string cnuser = objpath.Split( ',' )[0].Split( '=' )[1];
if  (cnuser!=null)
{
adminlist.Add(cnuser);
}
//string path = respath + objpath;
//DirectoryEntry user = new DirectoryEntry(path, LDAPUser, LDAPPassword);
}
}
//return adminlist;
}
public  static  ArrayList GetGroupUserList(string groupname)
{
ArrayList adminlist =  new  ArrayList();
DirectoryEntry entry =  new  DirectoryEntry(ADPath);
DirectorySearcher mySearcher =  new  DirectorySearcher(entry);
mySearcher.Filter =  "(&(&(objectCategory=group)(objectClass=group))(CN="  + groupname +  "))" //("(objectClass=organizationalUnit)");
SearchResult results = mySearcher.FindOne();
string grouppath =  "" ;
if  (results != null)
{
grouppath = results.Path;
DirectoryEntry dirEntry =  new  DirectoryEntry(grouppath);
PropertyCollection propertyCollection = dirEntry.Properties;
int  count = propertyCollection[ "member" ].Count;
for  ( int  i = 0; i < count; i++)
{
string respath = results.Path;
string[] pathnavigate = respath.Split( "CN" .ToCharArray());
respath = pathnavigate[0];
string objpath = propertyCollection[ "member" ][i].ToString();
string cnuser = objpath.Split( ',' )[0].Split( '=' )[1];
adminlist.Add(cnuser);
string path = respath + objpath;
//DirectoryEntry user = new DirectoryEntry(path, LDAPUser, LDAPPassword);
}
}
return  adminlist;
}
public  int  ChangeUserPassword_error(string itcode, string opwd, string npwd)
{
//itcode = "iiosoft\\" + itcode;
DirectoryEntry rootUser =  new  DirectoryEntry(ADPath, ADUser, ADPassword, AuthenticationTypes.None);
try
{
//rootUser.Invoke("ChangePassword", new Object[] { opwd, npwd });
rootUser.Properties[ "userPassword" ].Value = npwd;
rootUser.CommitChanges();
rootUser.Close();
rootUser.Dispose();
rootUser = null;
return  1;
}
catch
{
rootUser.Close();
rootUser.Dispose();
rootUser = null;
return  0;
}
}
}
}

主要添加了以下代码:

1
2
3
4
5
6
public  static  DirectoryEntry GetDirectoryObject(string userName, string password)
{
// userName = DomainName + "\\" + userName;
DirectoryEntry entry =  new  DirectoryEntry(ADPath, userName, password, AuthenticationTypes.Secure);
return  entry;
}

clip_image006

同时添加以下参数;实现用户的权限分配;

该功能通过提取groupname内的用户进行验证,并且gourpname内的用户有权限对用户的密码有重置权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public  static  ArrayList GetGroupUserList(string groupname)
{
ArrayList adminlist =  new  ArrayList();
DirectoryEntry entry =  new  DirectoryEntry(ADPath);
DirectorySearcher mySearcher =  new  DirectorySearcher(entry);
mySearcher.Filter =  "(&(&(objectCategory=group)(objectClass=group))(CN="  + groupname +  "))" //("(objectClass=organizationalUnit)");
SearchResult results = mySearcher.FindOne();
string grouppath =  "" ;
if  (results !=  null )
{
grouppath = results.Path;
DirectoryEntry dirEntry =  new  DirectoryEntry(grouppath);
PropertyCollection propertyCollection = dirEntry.Properties;
int  count = propertyCollection[ "member" ].Count;
for  ( int  i =  0 ; i < count; i++)
{
string respath = results.Path;
string[] pathnavigate = respath.Split( "CN" .ToCharArray());
respath = pathnavigate[ 0 ];
string objpath = propertyCollection[ "member" ][i].ToString();
string cnuser = objpath.Split( ',' )[ 0 ].Split( '=' )[ 1 ];
adminlist.Add(cnuser);
string path = respath + objpath;
//DirectoryEntry user = new DirectoryEntry(path, LDAPUser, LDAPPassword);
}
}

clip_image008·再次通过变量来完成用户组的指定,方便操作。

clip_image010

用户组的变量在web.config配置文件中应用:

1
2
ADgroup=respwd这个用户组:
<add key= "ADGroupName"  value= "resetpwd"  />

并且对用户的操作通过log进行登记,log日志文件将放在d:\iis\changepwd\resetlog.txt下

1
<add key= "LogFile"  value= "d:\\IIS\\ChangPwd\\resetlog.txt"  />

clip_image012

然后在,homecontroller.cs文件下添加登陆名称:

添加登陆认证桌面窗口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public  void  LoginAutheration()
{
string Rs =  "" ;
string username = Request[ "username" ];
string password = Request[ "password" ];
if  (ADOperator.adminlist!= null  && ADOperator.adminlist.Contains(username))
{
try
{
DirectoryEntry de = ADOperator.GetDirectoryObject(@"iiosoft\" + username, password);
if  (de.Name !=  null )
{
// DirectoryEntry de = ADHelper.GetDirectoryObject(username, password);
//SetPasswordByAccount(de, "user01", "123456abc");
///changeDominoPwd("user01", "123456abc");
Session[ "admin" ] = de;
Rs =  "SU" ;
}
}
catch  (Exception)
{
Rs =  "CS" ;
}
}

clip_image014

登陆窗口设置;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@{
ViewBag.Title =  "Login" ;
Layout =  "~/Views/Shared/_LayoutView.cshtml" ;
}
@section head{
<script src= "@Url.Content(" ~/Scripts/home.js ")"  type= "text/javascript" ></script>
}
<div id= "contactArea" >
</div>
<div  class = "pcontent" >
<div  class = "pstep02" >
<b>登陆</b></div>
<!--div  class = "pstep03" >
Change your password</!--div>
<div  class = "pstep04" >
A strong password helps prevent</div-->
<ul  class = "ulstep" >
<li><b> Admin Account</b> </li>
<li>
<input name= ""  id= "username"  type= "text"  class = "a01input"  /></li>
<li  class = "liTOP"  style= "position: relative" ><b> password</b> </li>
<li>
<input name= ""  id= "password"  type= "text"  class = "a01input"  />
</li>
</ul>
<div  class = "topw" >
<input type= "button"  id= "adminLogin"  value= "Login"  class = "btnSave"  />&nbsp;&nbsp;&nbsp;&nbsp;<input type= "button"  id= "adminCancel"  value= "Cancel"  class = "btnCancel"  /></div>
<!--div id= "Loading3"  style= "display: none" >
<img src= "../img/grid-loading.gif"  /><span id= "sProcess3" >更新密码中,请稍后...</span>
</div-->
</div>

clip_image016

然后最后修改控制配置文件:

将会在本地的IIS2路径下生成userlog.txt文件,通过记录认证用户的重置记录;

格式显示年-月-日—时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public  void  SetPassword()
{
string Rs =  "" ;
string sItCode = Request[ "sItCode" ];
string sNewPwd = Request[ "sNewPwd" ];
ADOperator ao =  new  ADOperator();
int  y = ao.IsUserExistsByAccount(sItCode);
if  (y ==  1 )
{
DirectoryEntry de = (DirectoryEntry)Session[ "admin" ];
int  z = ao.SetPasswordByAccount(de,sItCode, sNewPwd);
if  (z ==  1 )
{
Rs =  "CS" ;
//调用Domino密码修改
changeDominoPwd(sItCode, sNewPwd);
string log = DateTime.Now.ToString( "yyyy-MM-dd HH:mm:ss" )+ " 管理员:"  + de.Username.Split( '\\' )[ 1 ] +  " 已重置用户密码: "  + sItCode;
Logger.CheckLog(log);
// System.IO.File.AppendAllText("d:\\IIS2\\userlog.txt", log, Encoding.Default);
}
else
{
Rs =  "FA" ;
}
}

clip_image018

现在开始测试,进行登陆测试;

clip_image020

重置密码前的管理员需要做验证。在此我通过user02验证。

clip_image022

验证成功后,管理员user02重置user01的密码:-----123456a

clip_image024

接下来就是测试域账户是否被重置,同时需要测试user02的domino的internet是否也被重置;通过远程桌面登陆是否重置成功

clip_image026

重置成功后,成功登陆

clip_image028

接下来测试user01的邮箱密码,再次通过telnet尝试登陆验证;

也通过验证,证明密码同时也被成功重置

clip_image030

接连下我们查看重置记录:

重置记录:2014-01-03 11:08:53 管理员:user02 已重置用户密码: user01

clip_image032

再次查看domino密码重置记录

clip_image034

如果需要源代码的可以联系我或者下载中心下载



本文转自 高文龙 51CTO博客,原文链接:http://blog.51cto.com/gaowenlong/1348071,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
Rust 前端开发 JavaScript
Tauri 开发实践 — Tauri 日志记录功能开发
本文介绍了如何为 Tauri 应用配置日志记录。Tauri 是一个利用 Web 技术构建桌面应用的框架。文章详细说明了如何在 Rust 和 JavaScript 代码中设置和集成日志记录,并控制日志输出。通过添加 `log` crate 和 Tauri 日志插件,可以轻松实现多平台日志记录,包括控制台输出、Webview 控制台和日志文件。文章还展示了如何调整日志级别以优化输出内容。配置完成后,日志记录功能将显著提升开发体验和程序稳定性。
92 1
Tauri 开发实践 — Tauri 日志记录功能开发
|
15天前
|
存储 运维 监控
API明细日志及运维统计日志全面提升API可运维性
在数字化转型的大潮中,数据已成为企业最宝贵的资产之一。而数据服务API可快速为数据应用提供数据接口。面对越来越多的API以及越来越多的应用调用,如何快速查看API的服务情况、异常情况及影响范围,以及查看API的调用详情,进行API的性能优化、错误排查变得越来越重要,本文将介绍如何配置和开通API运维统计及明细日志,以及如何查看日志进行介绍。
|
1天前
|
监控 应用服务中间件 定位技术
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
|
2月前
|
监控 网络协议 CDN
阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
|
3月前
|
存储 监控 数据可视化
SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
164 9
08-06-06>pe_xscan 精简log分析代码 速度提升一倍
08-06-06>pe_xscan 精简log分析代码 速度提升一倍
|
4月前
|
存储 监控 Serverless
函数计算发布功能问题之用户在使用主流函数计算产品的日志服务时可能会遇到使用成本的问题如何解决
函数计算发布功能问题之用户在使用主流函数计算产品的日志服务时可能会遇到使用成本的问题如何解决
|
4月前
|
监控 Serverless 开发者
函数计算发布功能问题之查看函数的调用日志的问题如何解决
函数计算发布功能问题之查看函数的调用日志的问题如何解决
|
3月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
129 0
|
4月前
|
消息中间件 Kubernetes Kafka
微服务从代码到k8s部署应有尽有系列(十一、日志收集)
微服务从代码到k8s部署应有尽有系列(十一、日志收集)