您是否曾想过用 Java 主机配置您的 AMT 系统?现在可以了





0/5 (0投票)
本文介绍了如何使用 Java 为 Intel® vPro™ 技术创建基于主机的配置解决方案。查看示例代码并学习如何操作。就是这么简单

我经常被问到“Intel® WS-Management Java 客户端库是否可以用于基于主机配置 AMT 系统?” 答案是肯定的。当然,这个答案之后通常会跟着“你能演示一下吗?”。因此,在本文中,我将演示如何从 Java 执行基于主机的设置。设置 AMT 系统需要发送至少一个(可能更多)WsMan 命令。这可以通过纯 Java 通过 TCP/IP 完成,没有问题。但是,根据使用的激活方法,可能需要一些非 Java 代码或进程来建立与 AMT 驱动程序的安全性。一旦与 AMT 驱动程序建立了初始安全性,那么所有的设置逻辑都可以完全通过 Java 通过 TCP/IP 完成。
基本上有两种以编程方式激活 AMT 的方法。一种是从 AMT 客户端的主机操作系统激活(基于主机的配置)。另一种是从单独的机器远程激活(远程配置)。两者都可以使用我们的 Java 客户端完成,在本文中,我将重点介绍最简单的方法,即基于主机的方法。我将在另一篇博客中展示远程方法。
应该注意的是,基于主机的方法从 AMT 6.2/7.0 及以上版本开始可用。因此,如果您在较旧的系统上尝试这种方法,它将不起作用。但是,我稍后将在博客中介绍的远程配置方法在所有 AMT 系统上都可用。
基于主机的配置需要什么?首先,您需要一台支持 AMT 6.2 或 7.0 及以上版本的机器。其次,您需要安装 AMT 驱动程序。安装驱动程序后,您可以从 Java 客户端通过 TCP/IP 设置 AMT。但是,如前所述,安全性不会使它那么容易。基本上,除非您知道初始设置密码,否则您无法发送任何 Wsman 命令来激活 AMT。什么是设置密码?如果我在这里的博客中提供它,那将不是很安全,对吧?出于安全考虑,AMT 在每次启动时都会生成一个随机设置密码。那么,我们如何获取这个随机生成的密码来设置 AMT 系统?这就是我们需要某种进程来发出驱动程序命令并获取它的地方。因为它是驱动程序命令,所以您还需要以“以管理员身份运行”并具有提升的权限。这些权限与任何安装程序程序配置系统所需的权限相同。
现在让我们谈谈示例。原则上,该示例只是调用 IPS_HostBasedSetupService.Setup()
方法。但是,正如我们将看到的,该代码看起来比这更复杂一些,这主要是由于涉及的一些安全性。
首先,示例需要从 AMT 驱动程序获取设置凭据。记住在您的 Java 命令行或 IDE 上使用“以管理员身份运行”,以便此代码具有权限。这是通过 MeDevice()
类完成的(需要 JNI 调用才能从 AMT 驱动程序获取设置密码)。
接下来,示例将为 AMT 定义一个新的管理密码。此密码需要使用用户名、AMT 摘要领域进行 MD5 哈希处理,然后转换为八位字节字符串。有一些混乱的代码来执行此操作,但所有这些都是相当标准的。
最后,有了新哈希的 AMT 密码,我们可以调用 IPS_HostSetupService.Setup()
并激活我们的 AMT 机器!
您可以在此处下载并运行示例。
您可以在下面查看示例中的代码,了解从 Java 进行主机设置所涉及的内容。
import java.security.*; import intel.management.wsman.*; import intel.management.mei.*; /** * * @author Intel */ public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { //MeDevice uses IntelAmtJNI.DLL to get the Http/Digest creds MeDevice me = new intel.management.mei.MeDevice(); WsmanConnection connection = me.GetLocalConnection(); //We need to set the new Admin Password to activate AMT //In order hash the Admin Password we need the Digest realm String amtUser="admin"; String amtPassword = "P@ssw0rd"; //new AMT password String amtRealm; try { //The DigestRealm is use to generate a password Hash //Using JavaLib to get AMT_GeneralSettings.DigestRealm ManagedReference ref = connection.newReference("AMT_GeneralSettings"); ManagedInstance inst = ref.get(); amtRealm=inst.getProperty("DigestRealm").toString(); String hashString = amtUser+":"+amtRealm+":"+amtPassword; //using java.security.MessageDigests to hash the password MessageDigest md=MessageDigest.getInstance("MD5"); byte[] mdData=md.digest(hashString.getBytes()); // the MD5 hash needs to be converted to an Octet String StringBuilder octBuilder = new StringBuilder(); for (int i=0;i<mdData.length;i++) { int temp = 0xFF & mdData[i]; String h = Integer.toHexString(temp); if (h.length()<2) octBuilder.append("0"); octBuilder.append(h.toUpperCase()); } //now invoke IPS_HostBasedSetupService.Setup(amtPassword) ref = connection.newReference("IPS_HostBasedSetupService"); inst = ref.get(); ManagedInstance input = ref.createMethodInput("Setup"); input.setProperty("NetAdminPassEncryptionType", "2");//2=HTTP-MD5 input.setProperty("NetworkAdminPassword", octBuilder.toString()); ManagedInstance output = ref.invoke(input); // the output ReturnValue should be zero on success System.out.println(WsmanUtils.getXML(output)); if (output.getProperty("ReturnValue").toString().equals("0")) { System.out.println("Setup worked!"); } } catch (WsmanException wsmanException) { System.out.println(WsmanUtils.getXML(wsmanException)); throw new RuntimeException(wsmanException.fillInStackTrace()); } catch (java.security.NoSuchAlgorithmException nsaException) { System.out.println(nsaException.toString()); } } //end main() function } // end class Main
在此文章上分享您的评论,并与其他开发者互动