I want to change ip in vm when deploying it from the template(I used windows 2008R 64 bit template),so I planned to use the method customizeVM_Task() at first,but it failed for method chechCustomizationSpec() deny.
then I used method cloneVM_Task() with the param CustomzationSpec,it done! but after vm cloned,vm startup once ,no configuration customized. And about one minutes later ,vm reboot itself !! weird! With the customization startup. Then the error about "Microsoft-Windows-Shell_setup" come out!
helpful!! Is there anyone can tell me what's the problem ?
my code is following and the picture of the error is in the accessory :
CustomizationSpec cspec = new CustomizationSpec();
CustomizationGlobalIPSettings gIP = new CustomizationGlobalIPSettings();
cspec.setGlobalIPSettings(gIP);
// This is windows so choose the sysprep
CustomizationSysprep sprep = new CustomizationSysprep();
CustomizationGuiUnattended guiUnattended = new CustomizationGuiUnattended();
guiUnattended.setAutoLogon(false); // do not autoLogin on reboot for customization.
guiUnattended.setAutoLogonCount(0); // do not autologin on reboot..
guiUnattended.setTimeZone(4); // set to Eastern time.
sprep.setGuiUnattended(guiUnattended);
// add VM to WORKGROUP
CustomizationIdentification identification = new CustomizationIdentification();
identification.setJoinWorkgroup("WORKGROUP");
sprep.setIdentification(identification);
String productId = vm.getSummary().getConfig().getGuestId(); // only needed for windows os's
// setup UserData
CustomizationUserData userData = new CustomizationUserData();
CustomizationFixedName n = new CustomizationFixedName();
n.setName(name);
userData.setComputerName(n);
userData.setFullName("SomeName"); // This may change in the future
userData.setOrgName("SomeOrganization");
userData.setProductId(productId); // Product Serial (needed for Windows 2003 and 2008)
sprep.setUserData(userData);
cspec.setIdentity(sprep);
// NicSettingMap part
CustomizationAdapterMapping adaptorMap = new CustomizationAdapterMapping();
CustomizationIPSettings adapter = new CustomizationIPSettings();
CustomizationFixedIp fixedIp = new CustomizationFixedIp();
adapter.setDnsServerList(dnsList);
adapter.setGateway(gatewayList);
fixedIp.setIpAddress(ipAdd);
adapter.setIp(fixedIp);
adapter.setSubnetMask(subnetMask);
adaptorMap.setAdapter(adapter);
CustomizationAdapterMapping[] nicSettingMap = new CustomizationAdapterMapping[]{adaptorMap};
cspec.setNicSettingMap(nicSettingMap);
CustomizationWinOptions options = new CustomizationWinOptions();
options.setChangeSID(true);
options.setDeleteAccounts(false);
cspec.setOptions(options);
CustomizationSpecManager manager = si.getCustomizationSpecManager();
cspec.setEncryptionKey(manager.getEncryptionKey());
//clone vm from the template
VirtualMachineCloneSpec spec = new VirtualMachineCloneSpec();
spec.setCustomization(cspec);
VirtualMachineRelocateSpec relocSpec = new VirtualMachineRelocateSpec();
ManagedObjectReference rpMor = ManagedObject.buildManagedObjectReference(rpNode);
relocSpec.setPool(rpMor);
spec.setLocation(relocSpec);
spec.setPowerOn(false);
spec.setTemplate(false);
Task task = vm.cloneVM_Task(folder, name,
spec);
String result = task.waitForMe();
Hi,
It's very important to understand why checkCustomizationSpec() fails - it's our internal validation which normally provides some useful hints. Could you please provide more info (related vpxd logs, error details)?
With regards to "Microsoft-Windows-Shell_setup", it seems like sysprep is not happy with the unattend.xml. You mentioned that the template is 64 bit, is the "guest OS type" also set to 2008R 64 bit?
Or maybe sysprep doesn't like the product key - could you try with an empty one?
Any special characters in ComputerName/FullName/OrgName?
Does using CustomizationDhcpIpGenerator instead of CustomizationFixedIp change something?
Thanks,
Andrii
Hi,
Thanks for your help!
I found the source of the failure from method checkCustomizationSpec(). Before it, I test finding the failure is "invalidRequest". than I tried changing every params to test the source. finally,I found it : the productId is wrong in the CustomizationUserData param.(I found the productId is "00477-OEM-8400101-10502") Then I corrected it and tested again. the code debugged successfully,but the vSphere client hinted the another error : fault.NicSettingMismatch.summary. (vpxd logs).
NicSetting code is following :
{
// NicSettingMap part
CustomizationAdapterMapping adaptorMap = new CustomizationAdapterMapping();
CustomizationIPSettings adapter = new CustomizationIPSettings();
CustomizationFixedIp fixedIp = new CustomizationFixedIp();
adapter.setDnsServerList(new String[] {"192.168.2.1"});
adapter.setGateway(new String[] {"192.168.2.1"});
fixedIp.setIpAddress("192.168.2.123");
//CustomizationDhcpIpGenerator dhcpIp = new CustomizationDhcpIpGenerator();
adapter.setIp(fixedIp);
adapter.setSubnetMask("255.255.255.0");
adaptorMap.setAdapter(adapter);
CustomizationAdapterMapping[] nicSettingMap = new CustomizationAdapterMapping[]{adaptorMap};
cspec.setNicSettingMap(nicSettingMap);
}
I also followed your advice using CustomizationDhcpIpGenerator instead of CustomizationFixedIp, but the error also come out.
I also checked other you mentioned. "guest OS type" is windows7Server64Guest. the product key is empty. and the ComputerName/FullName/OrgName is made up of alphabet.
I found me as a pioneer in this solving problems of vsphere. But fortunately you help me and give me advice. thanks very much!
Hi,
You're very welcome. Thanks for your patience.
How many NICs does your VM have? You need to create CustomizationAdapterMapping per each NIC. NicSettingMismatch fault normally means that the actual vs spec counts differ.
Thanks,
Andrii