紧急求助,高手快来啊!

捷哥1999 2004-10-17 03:50:46
各位大侠:
小弟要实现一个用户输入检测程序,要能够知道最后一次用户输入(不管是鼠标还是键盘)的时间,我想用windows2000带的GetLastInputInfo API函数来解决,但是找了资料,只有VC的说明,小弟对VC不熟,现在要急用,希望哪位大哥能够帮忙,小弟急盼回复,不胜感激!
...全文
213 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
捷哥1999 2004-10-18
  • 打赏
  • 举报
回复
我发现错误了,原来if判断错误,GetLastInputInfo()调用成功是返回0,不成功返回非0,所以在定义的时候函数返回值不能是bool类型,应该是int型,修改程序如下:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;

namespace GetLastInputInfo
{
public class Form1 : System.Windows.Forms.Form
{
private System.Timers.Timer CheckTime;

public struct LASTINPUTINFO
{
public long cbSize;
public long dwTime;
}

[DllImport("user32.dll")]
public static extern int GetLastInputInfo(ref LASTINPUTINFO linputinfo);
[DllImport("Kernel32.dll")]
public static extern long GetTickCount();

private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Button button1;

private System.ComponentModel.Container components = null;

public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}



#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.CheckTime = new System.Timers.Timer();
this.textBox1 = new System.Windows.Forms.TextBox();
this.button1 = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.CheckTime)).BeginInit();
this.SuspendLayout();
//
// CheckTime
//
this.CheckTime.Enabled = true;
this.CheckTime.Interval = 5000;
this.CheckTime.SynchronizingObject = this;
this.CheckTime.Elapsed += new System.Timers.ElapsedEventHandler(this.CheckTime_Elapsed);
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(24, 56);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(304, 21);
this.textBox1.TabIndex = 0;
this.textBox1.Text = "";
//
// button1
//
this.button1.Location = new System.Drawing.Point(128, 160);
this.button1.Name = "button1";
this.button1.TabIndex = 1;
this.button1.Text = "Exit";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(352, 273);
this.Controls.Add(this.button1);
this.Controls.Add(this.textBox1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
((System.ComponentModel.ISupportInitialize)(this.CheckTime)).EndInit();
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void CheckTime_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
LASTINPUTINFO lif=new LASTINPUTINFO();
lif.cbSize=System.Runtime.InteropServices.Marshal.SizeOf(lif);
if(GetLastInputInfo(ref lif)==0)
{
//long diff=GetTickCount()-lif.dwTime;
//if(diff>10000)
//{
MessageBox.Show(Convert.ToDateTime(lif.dwTime).ToString());
this.textBox1.Text="系统最后一次动作时间"+lif.dwTime+"毫秒";
//}
}
else
{
MessageBox.Show("无法取得最后一次输入信息");
}
}
private void Form1_Load(object sender, System.EventArgs e)
{
this.CheckTime.Enabled=true;
}

private void button1_Click(object sender, System.EventArgs e)
{
this.Close();
}
}
}

但是为什么每一次取得的最后一次输入时间都是0啊,真是搞不明白,继续研究,希望哪位有经验的大哥,指导一二,谢谢
捷哥1999 2004-10-18
  • 打赏
  • 举报
回复
我现在将程序做了修改,编译能够通过了,但是还是无法得到预期的效果,调用函数GetLastInputInfo()无法成功返回,不知道是何原因,请各位大侠指点,不胜感激!
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;

namespace GetLastInputInfo
{
public class Form1 : System.Windows.Forms.Form
{
private System.Timers.Timer CheckTime;

public struct LASTINPUTINFO
{
public long cbSize;
public long dwTime;
}

[DllImport("user32.dll")]
public static extern bool GetLastInputInfo(ref LASTINPUTINFO linputinfo);
[DllImport("Kernel32.dll")]
public static extern long GetTickCount();

private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Button button1;

private System.ComponentModel.Container components = null;

public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}



#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.CheckTime = new System.Timers.Timer();
this.textBox1 = new System.Windows.Forms.TextBox();
this.button1 = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.CheckTime)).BeginInit();
this.SuspendLayout();
//
// CheckTime
//
this.CheckTime.Enabled = true;
this.CheckTime.Interval = 1000;
this.CheckTime.SynchronizingObject = this;
this.CheckTime.Elapsed += new System.Timers.ElapsedEventHandler(this.CheckTime_Elapsed);
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(24, 56);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(304, 21);
this.textBox1.TabIndex = 0;
this.textBox1.Text = "";
//
// button1
//
this.button1.Location = new System.Drawing.Point(128, 160);
this.button1.Name = "button1";
this.button1.TabIndex = 1;
this.button1.Text = "Exit";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(352, 273);
this.Controls.Add(this.button1);
this.Controls.Add(this.textBox1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
((System.ComponentModel.ISupportInitialize)(this.CheckTime)).EndInit();
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void CheckTime_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
LASTINPUTINFO lif=new LASTINPUTINFO();
//lif.cbSize=sizeof(long)*2;
lif.cbSize=System.Runtime.InteropServices.Marshal.SizeOf(lif);
if(GetLastInputInfo(ref lif))
{
long diff=GetTickCount()-lif.dwTime;
if(diff>2000)
{
this.textBox1.Text="系统未动作时间"+diff.ToString()+"毫秒";
}
}
}
private void Form1_Load(object sender, System.EventArgs e)
{
this.CheckTime.Enabled=true;
}

private void button1_Click(object sender, System.EventArgs e)
{
this.Close();
}
}
}
捷哥1999 2004-10-18
  • 打赏
  • 举报
回复
怎么都没有人给答复一下啊,是不是大家都在忙啊
bflovesnow 2004-10-17
  • 打赏
  • 举报
回复
mark
捷哥1999 2004-10-17
  • 打赏
  • 举报
回复
我这么写,可是就是不行啊,在函数GetLastInput()里面就是无法取道时间值啊,望高手再加以指点,谢谢!
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace GetLastInputInfo
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
///
public struct LASTINPUTINFO
{
long cbSize;
long dwTime;
public LASTINPUTINFO(long size,long time)
{
this.cbSize=size;
this.dwTime=time;
}
}

public long lastime;

[DllImport("user32.dll")]
public static extern bool GetLastInputInfo(LASTINPUTINFO linf);

private System.ComponentModel.Container components = null;

public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300,300);
this.Text = "Form1";
}
#endregion

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private bool GetLastInput()
{
long s=len(LASTINPUTINFO);
LASTINPUTINFO lastinput=new LASTINPUTINFO(s,0);
if (GetLastInputInfo(lastinput))
{
lastinput.?
return true;
}
}
}
}
winxieddd 2004-10-17
  • 打赏
  • 举报
回复
HANDLE System.IntPtr 32 位
BYTE System.Byte 8 位
SHORT System.Int16 16 位
WORD System.UInt16 16 位
INT System.Int32 32 位
UINT System.UInt32 32 位
LONG System.Int32 32 位
BOOL System.Int32 32 位
DWORD System.UInt32 32 位
ULONG System.UInt32 32 位
CHAR System.Char 用 ANSI 修饰。
LPSTR System.String 或 System.StringBuilder 用 ANSI 修饰。
LPCSTR System.String 或 System.StringBuilder 用 ANSI 修饰。
LPWSTR System.String 或 System.StringBuilder 用 Unicode 修
LPCWSTR System.String 或 System.StringBuilder 用 Unicode 修
FLOAT System.Single 32 位
DOUBLE System.Double 64 位
winxieddd 2004-10-17
  • 打赏
  • 举报
回复

[C#]
using System;
using System.Runtime.InteropServices;

public delegate bool CallBack(int hwnd, int lParam);

public class EnumReportApp {

[DllImport("user32")]
public static extern int EnumWindows(CallBack x, int y);

public static void Main()
{
CallBack myCallBack = new CallBack(EnumReportApp.Report);
EnumWindows(myCallBack, 0);
}

public static bool Report(int hwnd, int lParam) {
Console.Write("窗口句柄为");
Console.WriteLine(hwnd);
return true;
}
}



指针类型参数传递:
 在Windows API函数调用时,大部分函数采用指针传递参数,对一个结构变量指针,我们除了使用上面的类和结构方法传递参数之外,我们有时还可以采用数组传递参数。

 下面这个函数通过调用GetUserName获得用户名
BOOL GetUserName(
LPTSTR lpBuffer, // 用户名缓冲区
LPDWORD nSize // 存放缓冲区大小的地址指针
);
 
[DllImport("Advapi32.dll",
EntryPoint="GetComputerName",
ExactSpelling=false,
SetLastError=true)]
static extern bool GetComputerName (
[MarshalAs(UnmanagedType.LPArray)] byte[] lpBuffer,
  [MarshalAs(UnmanagedType.LPArray)] Int32[] nSize );
 这个函数接受两个参数,char * 和int *,因为你必须分配一个字符串缓冲区以接受字符串指针,你可以使用String类代替这个参数类型,当然你还可以声明一个字节数组传递ANSI字符串,同样你也可以声明一个只有一个元素的长整型数组,使用数组名作为第二个参数。上面的函数可以调用如下:

byte[] str=new byte[20];
Int32[] len=new Int32[1];
len[0]=20;
GetComputerName (str,len);
MessageBox.Show(System.Text.Encoding.ASCII.GetString(str));
 最后需要提醒的是,每一种方法使用前必须在文件头加上:
 using System.Runtime.InteropServices;

winxieddd 2004-10-17
  • 打赏
  • 举报
回复
Api函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提供的底层函数都间接或直接地调用了Windows API函数,同时为了实现功能扩展,一般也都提供了调用WindowsAPI函数的接口, 也就是说具备调用动态连接库的能力。Visual C#和其它开发工具一样也能够调用动态链接库的API函数。.NET框架本身提供了这样一种服务,允许受管辖的代码调用动态链接库中实现的非受管辖函数,包括操作系统提供的Windows API函数。它能够定位和调用输出函数,根据需要,组织其各个参数(整型、字符串类型、数组、和结构等等)跨越互操作边界。

下面以C#为例简单介绍调用API的基本过程:
动态链接库函数的声明
 动态链接库函数使用前必须声明,相对于VB,C#函数声明显得更加罗嗦,前者通过 Api Viewer粘贴以后,可以直接使用,而后者则需要对参数作些额外的变化工作。

 动态链接库函数声明部分一般由下列两部分组成,一是函数名或索引号,二是动态链接库的文件名。
  譬如,你想调用User32.DLL中的MessageBox函数,我们必须指明函数的名字MessageBoxA或MessageBoxW,以及库名字User32.dll,我们知道Win32 API对每一个涉及字符串和字符的函数一般都存在两个版本,单字节字符的ANSI版本和双字节字符的UNICODE版本。

 下面是一个调用API函数的例子:
[DllImport("KERNEL32.DLL", EntryPoint="MoveFileW", SetLastError=true,
CharSet=CharSet.Unicode, ExactSpelling=true,
CallingConvention=CallingConvention.StdCall)]
public static extern bool MoveFile(String src, String dst);

 其中入口点EntryPoint标识函数在动态链接库的入口位置,在一个受管辖的工程中,目标函数的原始名字和序号入口点不仅标识一个跨越互操作界限的函数。而且,你还可以把这个入口点映射为一个不同的名字,也就是对函数进行重命名。重命名可以给调用函数带来种种便利,通过重命名,一方面我们不用为函数的大小写伤透脑筋,同时它也可以保证与已有的命名规则保持一致,允许带有不同参数类型的函数共存,更重要的是它简化了对ANSI和Unicode版本的调用。CharSet用于标识函数调用所采用的是Unicode或是ANSI版本,ExactSpelling=false将告诉编译器,让编译器决定使用Unicode或者是Ansi版本。其它的参数请参考MSDN在线帮助.

 在C#中,你可以在EntryPoint域通过名字和序号声明一个动态链接库函数,如果在方法定义中使用的函数名与DLL入口点相同,你不需要在EntryPoint域显示声明函数。否则,你必须使用下列属性格式指示一个名字和序号。

[DllImport("dllname", EntryPoint="Functionname")]
[DllImport("dllname", EntryPoint="#123")]
值得注意的是,你必须在数字序号前加“#”
下面是一个用MsgBox替换MessageBox名字的例子:
[C#]
using System.Runtime.InteropServices;

public class Win32 {
[DllImport("user32.dll", EntryPoint="MessageBox")]
public static extern int MsgBox(int hWnd, String text, String caption, uint type);
}
许多受管辖的动态链接库函数期望你能够传递一个复杂的参数类型给函数,譬如一个用户定义的结构类型成员或者受管辖代码定义的一个类成员,这时你必须提供额外的信息格式化这个类型,以保持参数原有的布局和对齐。

C#提供了一个StructLayoutAttribute类,通过它你可以定义自己的格式化类型,在受管辖代码中,格式化类型是一个用StructLayoutAttribute说明的结构或类成员,通过它能够保证其内部成员预期的布局信息。布局的选项共有三种:

布局选项
描述
LayoutKind.Automatic
为了提高效率允许运行态对类型成员重新排序。
注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
LayoutKind.Explicit
对每个域按照FieldOffset属性对类型成员排序
LayoutKind.Sequential
对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
传递结构成员
下面的例子说明如何在受管辖代码中定义一个点和矩形类型,并作为一个参数传递给User32.dll库中的PtInRect函数,
函数的不受管辖原型声明如下:
BOOL PtInRect(const RECT *lprc, POINT pt);
注意你必须通过引用传递Rect结构参数,因为函数需要一个Rect的结构指针。
[C#]
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public struct Point {
public int x;
public int y;
}

[StructLayout(LayoutKind.Explicit]
public struct Rect {
[FieldOffset(0)] public int left;
[FieldOffset(4)] public int top;
[FieldOffset(8)] public int right;
[FieldOffset(12)] public int bottom;
}

class Win32API {
[DllImport("User32.dll")]
public static extern Bool PtInRect(ref Rect r, Point p);
}
类似你可以调用GetSystemInfo函数获得系统信息:
? using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct SYSTEM_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;
}




[DllImport("kernel32")]
static extern void GetSystemInfo(ref SYSTEM_INFO pSI);

SYSTEM_INFO pSI = new SYSTEM_INFO();
GetSystemInfo(ref pSI);

类成员的传递
同样只要类具有一个固定的类成员布局,你也可以传递一个类成员给一个不受管辖的动态链接库函数,下面的例子主要说明如何传递一个sequential顺序定义的MySystemTime类给User32.dll的GetSystemTime函数, 函数用C/C++调用规范如下:

void GetSystemTime(SYSTEMTIME* SystemTime);
不像传值类型,类总是通过引用传递参数.
[C#]
[StructLayout(LayoutKind.Sequential)]
public class MySystemTime {
public ushort wYear;
public ushort wMonth;
public ushort wDayOfWeek;
public ushort wDay;
public ushort wHour;
public ushort wMinute;
public ushort wSecond;
public ushort wMilliseconds;
}
class Win32API {
[DllImport("User32.dll")]
public static extern void GetSystemTime(MySystemTime st);
}
回调函数的传递:
从受管辖的代码中调用大多数动态链接库函数,你只需创建一个受管辖的函数定义,然后调用它即可,这个过程非常直接。
如果一个动态链接库函数需要一个函数指针作为参数,你还需要做以下几步:
首先,你必须参考有关这个函数的文档,确定这个函数是否需要一个回调;第二,你必须在受管辖代码中创建一个回调函数;最后,你可以把指向这个函数的指针作为一个参数创递给DLL函数,.

回调函数及其实现:
回调函数经常用在任务需要重复执行的场合,譬如用于枚举函数,譬如Win32 API 中的EnumFontFamilies(字体枚举), EnumPrinters(打印机), EnumWindows (窗口枚举)函数. 下面以窗口枚举为例,谈谈如何通过调用EnumWindow 函数遍历系统中存在的所有窗口

分下面几个步骤:
1. 在实现调用前先参考函数的声明
BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARMAM IParam)
显然这个函数需要一个回调函数地址作为参数.
2. 创建一个受管辖的回调函数,这个例子声明为代表类型(delegate),也就是我们所说的回调,它带有两个参数hwnd和lparam,第一个参数是一个窗口句柄,第二个参数由应用程序定义,两个参数均为整形。

  当这个回调函数返回一个非零值时,标示执行成功,零则暗示失败,这个例子总是返回True值,以便持续枚举。
3. 最后创建以代表对象(delegate),并把它作为一个参数传递给EnumWindows 函数,平台会自动地 把代表转化成函数能够识别的回调格式。
张海霖 2004-10-17
  • 打赏
  • 举报
回复
private struct LASTINPUTINFO
{
string cbSize;
string dwTime;
}

张海霖 2004-10-17
  • 打赏
  • 举报
回复

调用函数GetLastInputInfo()以后, 结构成员lpi.dwTime 中的值便是自上次输入事件发生以后的毫秒数。这个值也就是键盘、鼠标处于空闲状态的时间。

Option Explicit
Private Declare Function GetLastInputInfo Lib "user32" (plii As LASTINPUTINFO) As Boolean
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Type LASTINPUTINFO
cbSize As Long
dwTime As Long
End Type
Private Sub Command1_Click()
Dim lii As LASTINPUTINFO
lii.cbSize = Len(lii)
If GetLastInputInfo(lii) Then
MsgBox "输入空闲时间:" & GetTickCount - lii.dwTime & "ms"
End If
End Sub
Private Sub Timer1_Timer()
Call Command1_Click
End Sub
张海霖 2004-10-17
  • 打赏
  • 举报
回复
GetLastInputInfo(),这个函数使用结构 LASTINPUTINFO 作为参数:

LASTINPUTINFO lpi;
lpi.cbSize = sizeof(lpi);
GetLastInputInfo(&lpi);

调用函数GetLastInputInfo()以后, 结构成员lpi.dwTime 中的值便是自上次输入事件发生以后的毫秒数。这个值也就是键盘、鼠标处于空闲状态的时间。
不过这个函数在Win9X/NT4下都没有,对于这些系统恐怕只能用钩子了。
1,项目功能:     系统总体上划分为五个模块:接处警模块、预案管理模块、事件处置模块、资源管理模块、案例管理模块。具体业务流程如下:(1)根据突发疾控事件的级别和紧急情况,级别较低的突发疾控事件由接处警模块处置,级别较高或较为紧急的事件由事件处置模块处置。(2)当突发疾控事件发生时,依据接警员提交的事件信息调用相应的预案,并完善相应的信息,包括资源的配置和指定相关责任单位。(3)接受到任务的相关责任单位根据任务内容和实际情况进行突发疾控事件的处置。(4)任务的相关责任单位在处置过程中将事件处置的进展情况及时的进行反馈,跟踪事件处置的情况。(5)事件处置相关单位根据事件反馈情况合理调整任务,保证事件处置的准确性和效率。(6)当突发疾控事件得到控制或者解除紧急状态后,可以结案,事件处置的所有工作结束后,进入案例管理模块。(7)案例管理对突发疾控事件应急管理系统处置的所有重大或特别重大的事件的处置过程以及基本信息进行记录,便于统计和查询。(8)领导和专家可以对案例和事件处置报告进行评估和总结,以便完善预案模板的管理,提高处置相似或者相同突发疾控事件的效率。     适合做毕业设计参考项目。2,涉及技术:SSM框架,Tomcat3,开发环境:IDEA,MySQL数据库4,讲解方式:从环境安装,项目搭建,以及项目介绍等进行讲解5,包含资料:项目源码(含数据库文件),环境安装包,项目文档。
《企业级 VMware vSphere 6.7虚拟化技术配置与管理》课程共分为“上集”和“下集”两部分,本套视频为“下集”部分,“上集”部分已经对VMware vSphere 6.7的计算资源、网络资源、存储资源、虚拟机配置与管理等进行了详细讲解,“下集”部分以“上集”为基础进行技术延伸,全面对vMotion、DRS、HA、FT、性能监控、VDP备份等特性进行理论讲解和实战配置。 通过本课程学习,可以全面掌握vMotion、资源池、DRS、HA、FT、VDP、监控等高可用性运维技能。 《企业级 VMware vSphere虚拟化技术配置与管理》下集部分具体课程章节如下。 第1章 《VMware vSphere 6.7 vMotion配置与管理》主要内容本章我们详细介绍了冷迁移、通过 vMotion 迁移、通过 Storage vMotion 迁移、CPU 兼容性和 EVC、在 vSphere Client中迁移已关闭电源或已挂起的虚拟机、将开机状态的虚拟机迁移至新计算资源和存储、关于迁移兼容性检查等内容。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 第2章 《VMware vSphere 6.7 资源和DRS配置与管理》主要内容本章我们主要讲解了CPU虚拟化资源管理知识、内存虚拟化资源管理知识、存储虚拟化资源管理知识、资源池、DRS群集、Storage I/O Control、科学合理的进行资源分配相关理论和操作。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 第3章 《VMware vSphere 6.7 HA配置与管理》主要内容本章我们主要讲解了业务连续性和最小化停机时间、vSphere HA 的工作原理、vSphere HA 准入控制、vSphere HA 互操作性等知识。通过实践操作,可以掌握创建 vSphere HA 群集,配置 vSphere HA群集,配置 Proactive HA。为了提高vCenter Server的高可用性,讲解了vCenter High Availability知识。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 第4章 《VMware vSphere 6.7 FT配置与管理》主要内容本章我们从理论上讲解了Fault Tolerance 的工作原理、Fault Tolerance工作用例、Fault Tolerance 环境要求、限制和许可、Fault Tolerance 互操作性。以理论为基础,实践了打开Fault Tolerance功能、测试Fault Tolerance故障切换、迁移辅助虚拟机、挂起Fault Tolerance、恢复Fault Tolerance、关闭Fault Tolerance等内容。最后总结了使用Fault Tolerance的科学做法、Fault Tolerance的故障排除方法。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 第5章 《VMware vSphere Data Protection(VDP)》 主要内容本章我们从理论上讲解vSphere Data Protection的基本功能、体系架构。演示了VDP的安装和配置,讲解了怎样正确使用VDP以及使用VDP进行管理备份,自动备份验证,管理恢复,复制作业,文件级恢复,紧急恢复,VDP代理等相关功能,最后针对VDP常见故障进行了总结分析。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 第6章 《VMware vSphere 6.7 监控和性能》 主要内容本章我们从理论上讲解了vSphere监控、性能、日志等相关基本知识。实践操作了使用性能图表监控清单对象、监控事件和警报、系统日志文件的配置。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 企业级 VMware vSphere 6.7虚拟化技术配置与管理(上集)视频课程:https://edu.csdn.net/course/detail/35162企业级 VMware vSphere 6.7虚拟化技术配置与管理(下集)视频课程:https://edu.csdn.net/course/detail/35171

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧