Azione di scrittura per ping ad ambito IPV6

Microsoft.Windows.DHCPServer.2012.R2.TestIPV6Scope.WA (ProbeActionModuleType)

Questa azione di scrittura implementa un ping IPV6 per testare di nuovo un IP di destinazione

Knowledge Base article:

Riepilogo

Questo modulo di tipo probe consente di eseguire un ping di test per l'ambito IPV6 nei membri del gruppo di server DHCP 2012 R2 denominato "Gruppo di server DHCP 2012 R2" con istanze di server che eseguono un sistema operativo Microsoft Windows Server 2012 e su cui è abilitata la funzionalità DHCP.

Configurazione

IP server: l'IP server da utilizzare per il ping.

Prefisso: il prefisso da utilizzare per il ping.

IP destinazione: l'IP destinazione da utilizzare per il ping.

Numero di tentativi: numero di tentativi per l'esecuzione del comando ping.

Element properties:

TypeProbeActionModuleType
IsolationAny
AccessibilityPublic
RunAsDefault
OutputTypeMicrosoft.Windows.SerializedObjectData

Member Modules:

ID Module Type TypeId RunAs 
PS ProbeAction Microsoft.Windows.PowerShellTriggerOnlyProbe Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
ServerIPstring$Config/ServerIP$IP server
Prefixstring$Config/Prefix$Prefisso
TargetIPstring$Config/TargetIP$IP destinazione
RetryTimesint$Config/RetryTimes$Numero di tentativi

Source Code:

<ProbeActionModuleType ID="Microsoft.Windows.DHCPServer.2012.R2.TestIPV6Scope.WA" Accessibility="Public" Batching="false" PassThrough="false">
<Configuration>
<xsd:element name="Type" type="xsd:string"/>
<xsd:element name="ServerIP" type="xsd:string"/>
<xsd:element name="Prefix" type="xsd:string"/>
<xsd:element name="TargetIP" type="xsd:string"/>
<xsd:element name="RetryTimes" type="xsd:integer"/>
<xsd:element name="TimeoutSeconds" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="ServerIP" Selector="$Config/ServerIP$" ParameterType="string"/>
<OverrideableParameter ID="Prefix" Selector="$Config/Prefix$" ParameterType="string"/>
<OverrideableParameter ID="TargetIP" Selector="$Config/TargetIP$" ParameterType="string"/>
<OverrideableParameter ID="RetryTimes" Selector="$Config/RetryTimes$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation>
<Composite>
<MemberModules>
<ProbeAction ID="PS" TypeID="Windows!Microsoft.Windows.PowerShellTriggerOnlyProbe">
<ScriptName>TestDHCPIPV6Scopes2012</ScriptName>
<ScriptBody><Script>
param ([String] $type, [String] $serverip, [string]$prefix, [String] $interfaceip, [Int] $retry)

$SCRIPT_NAME = "TestDHCPIPV6Scopes2012"
&lt;#
.SYNOPSIS
DHCP Ping tool for V6
.DESCRIPTION
A detailed description of the function.
.PARAMETER serverip
IPv6 Address of the server - An IPv6 Address
.PARAMETER prefix
Prefix(64 bit) denoting the scope. XXXX:XXXX:XXXX:XXXX
.PARAMETER type
Type of the message (INFO_REQ/SOLICIT/RELEASE/RENEW/FULLLEASE)
.PARAMETER duid
DUID of the client system XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX (14 bytes)
.PARAMETER duidserver
DUID of the server system XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX (14 bytes)
.PARAMETER iaid
IAID - (4bytes)
.PARAMETER iana
IPv6 Address to be renewed - An IPv6 Address
.PARAMETER interfaceip
IPv6 Address of the interface - An IPv6 Address
.PARAMETER retry
retry count
.EXAMPLE
PS C:\&gt; ./DHCPv6Ping.ps1 -type RENEW -duid 00-01-00-01-15-64-52-F3-00-15-5D-38-75-05 -iaid 234886493 -iana 2001::80c7:d5ef:8fb4:ccf3 -duidserver 00-01-00-00-4D-D2-9A-01-00-15-5D-38-75-03 -prefix 2001::0 -interfaceip 2001::80c7:d5ef:8fb4:ccf2
.NOTES
Additional information about the function goes here.
.LINK
about_functions_advanced
#&gt;

function Compile-Csharp ([string] $code, [string] $compilerOptions)
{
# Get an instance of the CSharp code provider
$cp = New-Object Microsoft.CSharp.CSharpCodeProvider
$refs = New-Object Collections.ArrayList
$refs.AddRange( @("${framework}System.dll"))
# Build up a compiler params object...
$cpar = New-Object System.CodeDom.Compiler.CompilerParameters
$cpar.GenerateInMemory = $true
$cpar.GenerateExecutable = $true
$cpar.IncludeDebugInformation = $false
$cpar.CompilerOptions = $compilerOptions
$cpar.ReferencedAssemblies.AddRange($refs)
$cr = $cp.CompileAssemblyFromSource($cpar, $code)
if ( $cr.Errors.Count)
{
$codeLines = $code.Split("`n");
foreach ($ce in $cr.Errors)
{
write-host "Error: $($codeLines[$($ce.Line - 1)])"
$ce | out-default
}
Throw "INVALID DATA: Errors encountered while compiling code"
}
}

function call-DHCPMessage
{
$code = @'
namespace Dhcpv6Message
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Net.NetworkInformation;

public enum DHCPV6_MESSAGE_TYPE
{
DHCPV6_SOLICIT_MESSAGE = 1,
DHCPV6_ADVERTISE_MESSAGE = 2,
DHCPV6_REQUEST_MESSAGE = 3,
DHCPV6_CONFIRM_MESSAGE = 4,
DHCPV6_RENEW_MESSAGE = 5,
DHCPV6_REBIND_MESSAGE = 6,
DHCPV6_REPLY_MESSAGE = 7,
DHCPV6_RELEASE_MESSAGE = 8,
DHCPV6_DECLINE_MESSAGE = 9,
DHCPV6_RECONFIGURE_MESSAGE = 10,
DHCPV6_INFORMATION_REQUEST_MESSAGE = 11,
DHCPV6_RELAY_FORW_MESSAGE = 12,
DHCPV6_RELAY_REPL_MESSAGE = 13
}

public enum DHCP_MESSAGE_OPTION
{
OPTION_CLIENT_ID = 1,
OPTION_SERVER_ID = 2,
OPTION_IANA = 3,
OPTION_IA_TA = 4,
OPTION_IAADDR = 5,
OPTION_ORO = 6,
OPTION_PREFERENCE = 7,
OPTION_ELAPSED_TIME = 8,
OPTION_RELAY_MSG = 9,
OPTION_UNICAST = 12,
OPTION_STATUS_CODE = 13,
OPTION_RAPID_COMMIT = 14,
OPTION_USER_CLASS = 15,
OPTION_VENDOR_CLASS = 16,
OPTION_VENDOR_OPTS = 17,
OPTION_INTERFACE_ID = 18,
OPTION_RECONF_MSG = 19,
OPTION_RECONF_ACCEPT = 20,
OPTION_DNS_SERVERS = 23,
OPTION_DOMAIN_LIST = 24,
OPTION_IAPD = 25,
OPTION_IAPREFIX = 26,
OPTION_INFORMATION_REFRESH_TIME = 32,
OPTION_FQDN = 39
}

public struct DHCPV6_OPTION
{
public ushort OptionCode;
public ushort OptionLength;
public byte[] OptionVal;
}

public class Dhcpv6Object
{
public byte MsgType;
public byte[] TransactionID;

//If relay Packet
public byte RelayMsgType;
public byte HopCount;
public byte[] LinkAddr;
public byte[] PeerAddr;

public DHCPV6_OPTION Option;

public UInt32 IA_ID;

public bool useIAAddr;
public bool useRelayAgent;

public byte[] Dhcpv6SendMessageBuffer;
public int Dhcpv6SendMessageLength;
public byte[] Dhcpv6SendMessageOptionBuffer;
public int Dhcpv6SendMessageOptionLength;

public byte[][] Dhcpv6RecvMessageBuffer;
public int[] Dhcpv6RecvMessageLength;
public byte[][] Dhcpv6RecvMessageOptionBuffer;
public int[] Dhcpv6RecvMessageOptionLength;

public EndPoint[] RecvEndPoints;
public int NoRecvMessage;

DateTime sendTime;
DateTime[] recvTime;

public Dhcpv6Object(bool RA)
{
TransactionID = new byte[3];
useRelayAgent = RA;
if (RA)
{
RelayMsgType = (byte)Dhcpv6Message.DHCPV6_MESSAGE_TYPE.DHCPV6_RELAY_FORW_MESSAGE;
LinkAddr = new byte[16];
PeerAddr = new byte[16];
}
IA_ID = 0;
Option = new DHCPV6_OPTION();
useIAAddr = false;
Dhcpv6SendMessageLength = 0;
Dhcpv6SendMessageOptionLength = 0;
Dhcpv6RecvMessageBuffer = new byte[12][];
Dhcpv6RecvMessageLength = new int[12];
Dhcpv6RecvMessageOptionBuffer = new byte[12][];
Dhcpv6RecvMessageOptionLength = new int[12];
RecvEndPoints = new IPEndPoint[12];
NoRecvMessage = 0;
sendTime = new DateTime();
recvTime = new DateTime[12];
}
public void SetSendTime()
{
sendTime = DateTime.Now;
}
public void SetRecvTime(int pos)
{
recvTime[pos] = DateTime.Now;
}
public double FindTimeDifference(int pos)
{
TimeSpan tmp = recvTime[pos].Subtract(sendTime);
return tmp.TotalMilliseconds;
}

internal void AddMessageType(byte p)
{
MsgType = p;
}

internal void SetHopCount(byte HopCnt)
{
HopCount = HopCnt;
}

public void CreateNewTransactionID()
{
Random rnd = new Random();
rnd.NextBytes(TransactionID);
}

internal ushort convertLittletoBig(ushort value)
{
byte[] tmpByte = new byte[4];
tmpByte = BitConverter.GetBytes(value);
Array.Reverse(tmpByte);
value = BitConverter.ToUInt16(tmpByte, 0);
return value;
}

internal void SetElapsedTime(UInt16 ElapsedTime)
{
Option.OptionCode = (ushort)DHCP_MESSAGE_OPTION.OPTION_ELAPSED_TIME;
Option.OptionLength = 2;
Option.OptionVal = new byte[Option.OptionLength];
Option.OptionVal = BitConverter.GetBytes(ElapsedTime);
WriteOptionToBuffer(Option);
}

internal byte[] GetHWAddress(NetworkInterfaceType cardType)
{
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
String hwaddr = "";
byte[] HardwareAddress = new byte[6];
for (int i = 0; i &lt; nics.Length; i++)
{
if (nics[i].NetworkInterfaceType == cardType)
{
hwaddr = nics[i].GetPhysicalAddress().ToString();
break;
}
}
hwaddr.Replace(":", "");
for (int index = 0; index &lt; hwaddr.Length; index += 2)
{
String str = new String(hwaddr.ToCharArray(), index, 2);
HardwareAddress[index / 2] = (byte)Convert.ToInt16(str, 16);
}
return HardwareAddress;
}

public void SetClientID(String duid)
{
int index = 0;
Option.OptionCode = (ushort)DHCP_MESSAGE_OPTION.OPTION_CLIENT_ID;
Option.OptionLength = 14;
Option.OptionVal = new byte[Option.OptionLength];

duid = duid.Replace("-", "");
for (int i = 0; i &lt; duid.Length; i += 2)
{
String str = new String(duid.ToCharArray(), i, 2);
Option.OptionVal[i / 2] = (byte)Convert.ToInt16(str, 16);
}

WriteOptionToBuffer(Option);
}

public void SetServerID(String duid)
{
int index = 0;
Option.OptionCode = (ushort)DHCP_MESSAGE_OPTION.OPTION_SERVER_ID;
Option.OptionLength = 14;
Option.OptionVal = new byte[Option.OptionLength];

duid = duid.Replace("-", "");
for (int i = 0; i &lt; duid.Length; i += 2)
{
String str = new String(duid.ToCharArray(), i, 2);
Option.OptionVal[i / 2] = (byte)Convert.ToInt16(str, 16);
}
WriteOptionToBuffer(Option);
}
public void SetServerIDbyByte(byte[] duid)
{
int index = 0;
Option.OptionCode = (ushort)DHCP_MESSAGE_OPTION.OPTION_SERVER_ID;
Option.OptionLength = 14;
Option.OptionVal = new byte[Option.OptionLength];
for (int i = 0; i &lt; duid.Length; i++)
{
Option.OptionVal[i] = duid[i];
}
WriteOptionToBuffer(Option);
}

public void SetIAID(UInt32 iaid)
{
IA_ID = iaid;
}
public UInt32 GetIAID()
{
return IA_ID;
}
public void SetIANAOptionbyByte(byte[] IAAddr)
{
Option.OptionCode = (ushort)DHCP_MESSAGE_OPTION.OPTION_IANA;
Option.OptionLength = (ushort)IAAddr.Length;
Option.OptionVal = new byte[Option.OptionLength];
for (int i = 0; i &lt; IAAddr.Length; i++)
{
Option.OptionVal[i] = IAAddr[i];
}
WriteOptionToBuffer(Option);
}
public void SetIANAOption(String IAAddr)
{
int index = 0;
Option.OptionCode = (ushort)DHCP_MESSAGE_OPTION.OPTION_IANA;
if (useIAAddr)
Option.OptionLength = 40;
else
Option.OptionLength = 12;
Option.OptionVal = new byte[Option.OptionLength];
byte[] IAID = new byte[4];
if (IA_ID == 0)
{
Random rnd = new Random();
rnd.NextBytes(IAID);
}
else
{
IAID = BitConverter.GetBytes(IA_ID);
Array.Reverse(IAID);
}
foreach (byte byteVal in IAID)
Option.OptionVal[index++] = byteVal;

byte[] tmpByte = BitConverter.GetBytes(((UInt32)345600));
Array.Reverse(tmpByte);
foreach (byte byteVal in tmpByte)
Option.OptionVal[index++] = byteVal;

tmpByte = BitConverter.GetBytes(((UInt32)552960));
Array.Reverse(tmpByte);
foreach (byte byteVal in tmpByte)
Option.OptionVal[index++] = byteVal;
if (useIAAddr)
{
tmpByte = new byte[2];
tmpByte = BitConverter.GetBytes(((UInt16)5));
Array.Reverse(tmpByte);
foreach (byte byteVal in tmpByte)
Option.OptionVal[index++] = byteVal;

tmpByte = BitConverter.GetBytes(((UInt16)24));
Array.Reverse(tmpByte);
foreach (byte byteVal in tmpByte)
Option.OptionVal[index++] = byteVal;

String[] tmpIAAddr = new String[8];
tmpIAAddr = GetIPv6Formatted(IAAddr);
foreach (String str in tmpIAAddr)
{
String str1 = new String(str.ToCharArray(), 0, 2);
Option.OptionVal[index++] = (byte)Convert.ToUInt16(str1, 16);
str1 = new String(str.ToCharArray(), 2, 2);
Option.OptionVal[index++] = (byte)Convert.ToUInt16(str1, 16);
}
byte[] time = new byte[8];
Random rnd = new Random();
rnd.NextBytes(time);
foreach (byte byteVal in time)
Option.OptionVal[index++] = byteVal;
}
WriteOptionToBuffer(Option);
}

internal void SetClientFQDN()
{
int index = 0;
byte flag = 0;
Option.OptionCode = (ushort)Dhcpv6Message.DHCP_MESSAGE_OPTION.OPTION_FQDN;
Option.OptionLength = (ushort)(Dns.GetHostName().Length + 2);
Option.OptionVal = new byte[Option.OptionLength];
Option.OptionVal[index++] = flag;
Option.OptionVal[index++] = 0x0F;
char[] charValue = Dns.GetHostName().ToCharArray();
foreach (char Character in charValue)
Option.OptionVal[index++] = (byte)Character;
WriteOptionToBuffer(Option);
}

internal void SetVendorSpecificInfo()
{
Option.OptionCode = (ushort)Dhcpv6Message.DHCP_MESSAGE_OPTION.OPTION_VENDOR_OPTS;
Option.OptionLength = (ushort)8;
Option.OptionVal = new byte[] { 0x00, 0x00, 0x01, 0x37, 0x00, 0x5E, 0x00, 0x00 };
WriteOptionToBuffer(Option);
}
internal void SetVendorClass()
{
Option.OptionCode = (ushort)Dhcpv6Message.DHCP_MESSAGE_OPTION.OPTION_VENDOR_CLASS;
Option.OptionLength = (ushort)14;
Option.OptionVal = new byte[] { 0x00, 0x00, 0x01, 0x37, 0x00, 0x08, 0x4D, 0x53, 0x46, 0x54, 0x20, 0x35, 0x2E, 0x30 };
WriteOptionToBuffer(Option);
}

internal void SetOptionRequest()
{
Option.OptionCode = (ushort)Dhcpv6Message.DHCP_MESSAGE_OPTION.OPTION_ORO;
Option.OptionLength = (ushort)8;
Option.OptionVal = new byte[] { 0x00, 0x18, 0x00, 0x17, 0x00, 0x11, 0x00, 0x27};
WriteOptionToBuffer(Option);
}

internal String[] GetIPv6Formatted(String IPv6Addr)
{
if (IPv6Addr.Contains("%"))
{
IPv6Addr = IPv6Addr.Remove(IPv6Addr.IndexOf('%'), IPv6Addr.Length - IPv6Addr.IndexOf('%'));
}
IPv6Addr = IPAddress.Parse(IPv6Addr).ToString();
int length = 8;
char[] splitChar = { ':' };
int index = 0, i = 0;
String[] tmpAddr = new String[8];
String[] tempStr = IPv6Addr.Split(splitChar, 8);
for (index = 0; index &lt; tempStr.Length; index++)
tempStr[index] = tempStr[index].PadLeft(4, '0');
if (tempStr[tempStr.Length - 1].Length &gt; 4)
{
length = 7;
}
index = 0;
if (tempStr.Length != 8)
{
while (!tempStr[index].Equals("0000"))
{
tmpAddr[index++] = tempStr[i++];
}
for (; index &lt; length - tempStr.Length + i + 1; index++)
{
tmpAddr[index] = "0000";
}
i++;
for (; index &lt; length; index++)
{
tmpAddr[index] = tempStr[i++];
}
}
if (length == 7)
{
String str = tempStr[tempStr.Length - 1];

tempStr = str.Split('.');
tmpAddr[6] = String.Concat(Convert.ToString(Convert.ToByte(tempStr[0], 10), 16), Convert.ToString(Convert.ToByte(tempStr[1], 10), 16));
tmpAddr[7] = String.Concat(Convert.ToString(Convert.ToByte(tempStr[2], 10), 16), Convert.ToString(Convert.ToByte(tempStr[3], 10), 16));

}
return tmpAddr;
}

internal String[] GetIPv6PrefixFormatted(String IPv6Addr)
{
char[] splitChar = { ':' };
int index = 0, i = 0;
int length = 4;
String[] tmpAddr = new String[4];
String[] tempStr = IPv6Addr.Split(splitChar, 4);
for (index = 0; index &lt; tempStr.Length; index++)
tempStr[index] = tempStr[index].PadLeft(4, '0');
index = 0;

if (tempStr.Length != 4)
{
while (!tempStr[index].Equals("0000"))
{
tmpAddr[index++] = tempStr[i++];
}
for (; index &lt; length - tempStr.Length + i + 1; index++)
{
tmpAddr[index] = "0000";
}
i++;
for (; index &lt; length; index++)
{
tmpAddr[index] = tempStr[i++];
}
}
else
{
for (; index &lt; length; index++)
{
tmpAddr[index] = tempStr[i++];
}
}
return tmpAddr;
}
public void SetLinkAddress(String LinkAddr)
{
String[] tmpLinkAddr = new String[4];
tmpLinkAddr = GetIPv6PrefixFormatted(LinkAddr);
int index = 0;
foreach (String str in tmpLinkAddr)
{
String str1 = new String(str.ToCharArray(), 0, 2);
this.LinkAddr[index++] = (byte)Convert.ToUInt16(str1, 16);
str1 = new String(str.ToCharArray(), 2, 2);
this.LinkAddr[index++] = (byte)Convert.ToUInt16(str1, 16);
}
for(;index&lt;16;index++)
this.LinkAddr[index] = 0;
}
public void ActasRelayAgent(String PeerAddr)
{
int index = 0;
String[] tmpPeerAddr = new String[8];
tmpPeerAddr = GetIPv6Formatted(PeerAddr);
index = 0;
foreach (String str in tmpPeerAddr)
{
String str1 = new String(str.ToCharArray(), 0, 2);
this.PeerAddr[index++] = (byte)Convert.ToUInt16(str1, 16);
str1 = new String(str.ToCharArray(), 2, 2);
this.PeerAddr[index++] = (byte)Convert.ToUInt16(str1, 16);
}
}
public String GetDuidserver(byte[] duid)
{
String duidserver = "";
duidserver = BitConverter.ToString(duid);
return duidserver;
}
private void WriteOptionToBuffer(DHCPV6_OPTION Option)
{
byte[] tmpOptionBuffer = new byte[Option.OptionLength + 4];
byte[] tmpByte = new byte[2];
int index = 0;
tmpByte = BitConverter.GetBytes(Option.OptionCode);
Array.Reverse(tmpByte);
foreach (byte byteVal in tmpByte)
tmpOptionBuffer[index++] = byteVal;
tmpByte = BitConverter.GetBytes(Option.OptionLength);
Array.Reverse(tmpByte);
foreach (byte byteVal in tmpByte)
tmpOptionBuffer[index++] = byteVal;
foreach (byte byteVal in Option.OptionVal)
tmpOptionBuffer[index++] = byteVal;
tmpByte = null;
index = 0;
if (null != Dhcpv6SendMessageOptionBuffer)
{
tmpByte = new byte[Dhcpv6SendMessageOptionLength];
foreach (byte byteValue in Dhcpv6SendMessageOptionBuffer)
tmpByte[index++] = byteValue;
}
Dhcpv6SendMessageOptionBuffer = new byte[Dhcpv6SendMessageOptionLength + Option.OptionLength + 4];

index = 0;
if (null != tmpByte)
{
foreach (byte byteValue in tmpByte)
Dhcpv6SendMessageOptionBuffer[index++] = byteValue;
}
foreach (byte byteValue in tmpOptionBuffer)
Dhcpv6SendMessageOptionBuffer[index++] = byteValue;
Dhcpv6SendMessageOptionLength = Dhcpv6SendMessageOptionLength + Option.OptionLength + 4;
}

public int PackDhcpDataandOption()
{
int index = 0;
Dhcpv6SendMessageBuffer = new byte[4 + Dhcpv6SendMessageOptionLength];
Dhcpv6SendMessageBuffer[index++] = MsgType;
foreach (byte byteValue in TransactionID)
Dhcpv6SendMessageBuffer[index++] = byteValue;
foreach (byte byteValue in this.Dhcpv6SendMessageOptionBuffer)
Dhcpv6SendMessageBuffer[index++] = byteValue;
Dhcpv6SendMessageLength = index;
return (Dhcpv6SendMessageLength);
}
public void PackRelay()
{
int index = 0;
byte[] tmpSendMsgBuffer = new byte[Dhcpv6SendMessageLength];
foreach (byte byteVAl in Dhcpv6SendMessageBuffer)
tmpSendMsgBuffer[index++] = byteVAl;
Dhcpv6SendMessageBuffer = new byte[38 + Dhcpv6SendMessageLength];
index = 0;

Dhcpv6SendMessageBuffer[index++] = RelayMsgType;
Dhcpv6SendMessageBuffer[index++] = HopCount;
foreach (byte byteVal in LinkAddr)
Dhcpv6SendMessageBuffer[index++] = byteVal;
foreach (byte byteVal in PeerAddr)
Dhcpv6SendMessageBuffer[index++] = byteVal;

byte[] tmpByte = BitConverter.GetBytes(((UInt16)9));
Array.Reverse(tmpByte);
foreach (byte byteVal in tmpByte)
Dhcpv6SendMessageBuffer[index++] = byteVal;
tmpByte = BitConverter.GetBytes(((UInt16)Dhcpv6SendMessageLength));
Array.Reverse(tmpByte);
foreach (byte byteVal in tmpByte)
Dhcpv6SendMessageBuffer[index++] = byteVal;

foreach (byte byteVal in tmpSendMsgBuffer)
Dhcpv6SendMessageBuffer[index++] = byteVal;
Dhcpv6SendMessageLength += 38;
}
public void UnPackRelay(int p, int pos)
{
byte[] tmpBuf = new byte[Dhcpv6RecvMessageBuffer[pos].Length];
int index = 0, i = 0;

foreach (byte byteVal in Dhcpv6RecvMessageBuffer[pos])
tmpBuf[index++] = byteVal;
index = 1;
//RelayMsgType = Dhcpv6RecvMessageBuffer[pos][index++];
HopCount = Dhcpv6RecvMessageBuffer[pos][index++];

for (i = 0; i &lt; 16; i++)
LinkAddr[i] = Dhcpv6RecvMessageBuffer[pos][index++];
for (i = 0; i &lt; 16; i++)
PeerAddr[i] = Dhcpv6RecvMessageBuffer[pos][index++];
index += 2;
UInt16 msgLen = BitConverter.ToUInt16(Dhcpv6RecvMessageBuffer[pos], index);
msgLen = convertLittletoBig(msgLen);
index += 2;
Dhcpv6RecvMessageBuffer[pos] = new byte[msgLen];
for (i = 0; i &lt; msgLen; i++)
Dhcpv6RecvMessageBuffer[pos][i] = tmpBuf[index++];
Dhcpv6RecvMessageLength[pos] = i;
}
public void UnPackDataandOptions(int PacketLength, int pos)
{
int index = 0, i = 0;
MsgType = Dhcpv6RecvMessageBuffer[pos][index++];
for (i = 0; i &lt; 3; i++)
TransactionID[i] = Dhcpv6RecvMessageBuffer[pos][index++];

Dhcpv6RecvMessageOptionBuffer[pos] = new byte[4096];
for (i = 0; index &lt; PacketLength; i++, index++)
{
Dhcpv6RecvMessageOptionBuffer[pos][i] = Dhcpv6RecvMessageBuffer[pos][index];
}
Dhcpv6RecvMessageOptionLength[pos] = i;
}
public byte[] GetRecvMessageOption(byte OptionType, int pos)
{
byte[] OptionByteValue = null;
int index = 0;
while (index &lt; Dhcpv6RecvMessageOptionLength[pos])
{
UInt16 optionCode = BitConverter.ToUInt16(Dhcpv6RecvMessageOptionBuffer[pos], index);
optionCode = convertLittletoBig(optionCode);
if (optionCode == OptionType)
{
index += 2;
UInt16 optionLen = BitConverter.ToUInt16(Dhcpv6RecvMessageOptionBuffer[pos], index);
optionLen = convertLittletoBig(optionLen);
OptionByteValue = new byte[optionLen];
index += 2;
for (int i = 0; i &lt; optionLen; i++)
{
OptionByteValue[i] = Dhcpv6RecvMessageOptionBuffer[pos][index++];

}
break;
}
else
{
UInt16 optionLen = BitConverter.ToUInt16(Dhcpv6RecvMessageOptionBuffer[pos], index + 2);
optionLen = convertLittletoBig(optionLen);
index = index + optionLen + 4;
}
}
return OptionByteValue;
}

public String GetIAAddr(byte[] option)
{
int index = 16;
byte[] IAAddr = new byte[16];
for (int i = 0; i &lt; 16; i++)
IAAddr[i] = option[index++];
String IAAddress = ParseIPv6(IAAddr);
return IAAddress;
}

public String GetDNS(byte[] option)
{
int index = 0;
byte[] IAAddr = new byte[16];
for (int i = 0; i &lt; 16; i++)
IAAddr[i] = option[index++];
String IAAddress = ParseIPv6(IAAddr);
return IAAddress;
}

private string ParseIPv6(byte[] Addr)
{
String IPAddr = "";
for (int i = 0; i &lt; 16; i += 2)
{
String str = String.Concat(Convert.ToString(Addr[i], 16).PadLeft(2, '0'), Convert.ToString(Addr[i + 1], 16).PadLeft(2, '0'));
IPAddr = String.Concat(IPAddr, str, ":");
}
IPAddr = IPAddr.Remove(IPAddr.Length - 1, 1);
IPAddress ip = IPAddress.Parse(IPAddr);
return ip.ToString();
}
}
}

namespace Dhcpv6Packet
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Net.NetworkInformation;

public class Dhcpv6Package
{
public void ConstructMessage(ref Dhcpv6Message.Dhcpv6Object Dhcpv6Obj, short Msg_Type)
{
switch (Msg_Type)
{
case (short)Dhcpv6Message.DHCPV6_MESSAGE_TYPE.DHCPV6_SOLICIT_MESSAGE:
Dhcpv6Obj.AddMessageType((byte)Dhcpv6Message.DHCPV6_MESSAGE_TYPE.DHCPV6_SOLICIT_MESSAGE);
Dhcpv6Obj.CreateNewTransactionID();
Dhcpv6Obj.SetElapsedTime(0);
Dhcpv6Obj.SetClientFQDN();
Dhcpv6Obj.SetOptionRequest();
break;
case (short)Dhcpv6Message.DHCPV6_MESSAGE_TYPE.DHCPV6_INFORMATION_REQUEST_MESSAGE:
Dhcpv6Obj.AddMessageType((byte)Dhcpv6Message.DHCPV6_MESSAGE_TYPE.DHCPV6_INFORMATION_REQUEST_MESSAGE);
Dhcpv6Obj.CreateNewTransactionID();
Dhcpv6Obj.SetVendorSpecificInfo();
Dhcpv6Obj.SetOptionRequest();
Dhcpv6Obj.SetElapsedTime(0);
break;
case (short)Dhcpv6Message.DHCPV6_MESSAGE_TYPE.DHCPV6_RENEW_MESSAGE:
Dhcpv6Obj.AddMessageType((byte)Dhcpv6Message.DHCPV6_MESSAGE_TYPE.DHCPV6_RENEW_MESSAGE);
Dhcpv6Obj.CreateNewTransactionID();
Dhcpv6Obj.SetElapsedTime(0);
Dhcpv6Obj.SetClientFQDN();
Dhcpv6Obj.SetOptionRequest();
Dhcpv6Obj.SetVendorClass();
break;
case (short)Dhcpv6Message.DHCPV6_MESSAGE_TYPE.DHCPV6_REQUEST_MESSAGE:
Dhcpv6Obj.AddMessageType((byte)Dhcpv6Message.DHCPV6_MESSAGE_TYPE.DHCPV6_REQUEST_MESSAGE);
Dhcpv6Obj.SetElapsedTime(0);
Dhcpv6Obj.SetClientFQDN();
Dhcpv6Obj.SetOptionRequest();
Dhcpv6Obj.SetVendorClass();
break;
case (short)Dhcpv6Message.DHCPV6_MESSAGE_TYPE.DHCPV6_RELEASE_MESSAGE:
Dhcpv6Obj.AddMessageType((byte)Dhcpv6Message.DHCPV6_MESSAGE_TYPE.DHCPV6_RELEASE_MESSAGE);
Dhcpv6Obj.CreateNewTransactionID();
Dhcpv6Obj.SetElapsedTime(0);
Dhcpv6Obj.SetVendorClass();
break;
}
}
}
}

namespace Dhcpv6Socket
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Net.NetworkInformation;

public enum PORTS
{
DHCPV6_SERVER_PORT = 547,
DHCPV6_CLIENT_PORT = 546
}

public class Dhcpv6Socket
{
Socket socket;
public int LocalPort, DestPort;
public IPAddress LocalIPAddr, DestIPAddr;
IPEndPoint IPEnd;
public int RetryCount;

public Dhcpv6Socket()
{
RetryCount = 1;
}
public void InitWinSock(String MachineType)
{
socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
socket.SetSocketOption(SocketOptionLevel.Udp, SocketOptionName.NoDelay, true);
switch (MachineType)
{
case "CLIENT":
SetLocalandDestPorts(PORTS.DHCPV6_CLIENT_PORT, PORTS.DHCPV6_SERVER_PORT);
break;
case "RELAY_AGENT":
SetLocalandDestPorts(PORTS.DHCPV6_SERVER_PORT, PORTS.DHCPV6_SERVER_PORT);
break;
}
IPEnd = new IPEndPoint(LocalIPAddr, LocalPort);
socket.Bind(IPEnd);
}

private void SetLocalandDestPorts(PORTS lport, PORTS dport)
{
LocalPort = (int)lport;
DestPort = (int)dport;
}
public String GetIPv6LinkLocalAddress()
{
String IPAddr = "";
IPHostEntry host;
host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetworkV6 &amp;&amp; ip.IsIPv6LinkLocal)
{
IPAddr = ip.ToString();
}
}
return IPAddr;
}
public String GetIPv6Address()
{
String IPAddr = "";
IPHostEntry host;
host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetworkV6 &amp;&amp; !ip.IsIPv6LinkLocal)
{
IPAddr = ip.ToString();
}
}
return IPAddr;
}

public void SetLocalandDestAddr(String localIPAddr, String destIPAddr)
{
LocalIPAddr = IPAddress.Parse(localIPAddr);
DestIPAddr = IPAddress.Parse(destIPAddr);
}

public void SendPacket(byte[] p, int PacketLength)
{
try{
IPEnd = new IPEndPoint(DestIPAddr, DestPort);
//socket.SendBufferSize = 4096;
socket.SendTo(p, IPEnd);
}
catch(SocketException)
{
Console.WriteLine("Not an appropriate server");
}
}
public void RecvPacket(ref Dhcpv6Message.Dhcpv6Object Dhcpv6Obj)
{
int index = 0;
EndPoint EP = new IPEndPoint(IPAddress.IPv6Any, 0);

ArrayList listenlist = new ArrayList();
listenlist.Add(socket);
Socket.Select(listenlist, null, null, 10000);
if (null == listenlist)
Console.WriteLine("Error");
socket.ReceiveTimeout = 1000;
do
{
try
{
Dhcpv6Obj.Dhcpv6RecvMessageBuffer[index] = new byte[4096];
for(int j = 0; j &lt; RetryCount; j++)
{
Dhcpv6Obj.Dhcpv6RecvMessageLength[index] = socket.ReceiveFrom(Dhcpv6Obj.Dhcpv6RecvMessageBuffer[index], ref EP);
if(Dhcpv6Obj.Dhcpv6RecvMessageLength[index] != 0)
break;
}
if(Dhcpv6Obj.Dhcpv6RecvMessageBuffer[index][0] == 0x0C)
continue;
Dhcpv6Obj.RecvEndPoints[index] = EP;
Dhcpv6Obj.SetRecvTime(index);
Dhcpv6Obj.NoRecvMessage++;
index++;
}
catch (SocketException)
{
socket.Close();
break;
}
} while (index &lt; 12);
}
}
}
namespace Dhcpv6ReturnObject
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
public class Dhcpv6ReturnObject
{
public String ServerIP;
public double Time;
public String YourIPAddress;
public String DNS;
public int ExitCode;
public String DUIDServer;

public Dhcpv6ReturnObject()
{
ServerIP = "ff02::1:2";
Time = 0.0F;
YourIPAddress = "";
DNS = "";
ExitCode = 0;
DUIDServer = "";
}

public void SetServerIP(String serveraddr)
{
ServerIP = serveraddr;
}
public void SetTime(double time)
{
Time = time;
}
public void SetYourIPAddress(String youraddr)
{
YourIPAddress = youraddr;
}
public void SetDNS(String dns)
{
DNS = dns;
}
public void SetDuidServer(String duidserver)
{
DUIDServer = duidserver;
}
public void CleanUp()
{
ServerIP = "";
Time = 0.0F;
YourIPAddress = "";
DNS = "";
ExitCode = 1;
DUIDServer = "";
}
}
}
'@
Compile-Csharp $code "/target:library"
}

function validate-HardwareAddress
{
if($args[0] -match "(\b(\d|[A-F])(\d|[A-F])-(\d|[A-F])(\d|[A-F])-(\d|[A-F])(\d|[A-F])-(\d|[A-F])(\d|[A-F])-(\d|[A-F])(\d|[A-F])-(\d|[A-F])(\d|[A-F])\b)")
{
return $true
}
else
{
return $false
}
}

function validate-IPv6Address
{
$ip1 = $null
if([System.Net.IPAddress]::TryParse($args[0],[ref] $ip1))
{
return $true
}
else
{
return $false
}
}

$LinkAddr = ""
$PeerAddr = ""

$LocalAddr = ""
$ServerAddr = ""

$RA = $false
call-DHCPMessage

$Dhcpv6Packer = New-Object Dhcpv6Packet.Dhcpv6Package
$Dhcpv6Connector = New-Object Dhcpv6Socket.Dhcpv6Socket
$Dhcpv6RetObj = New-Object Dhcpv6ReturnObject.Dhcpv6ReturnObject


if($retry -ne 0)
{
$DhcpV6Connector.RetryCount = $retry
}

if($prefix -ne [System.String]::Empty)
{
$prefixip = $prefix + ":0:0:0:0"
$res = validate-IPv6Address $prefixip
if($res -eq $false)
{
Write-Host "$prefix is a invalid ip address"
exit
}
$LinkAddr = $prefix
$RA = $true
}
$Dhcpv6Obj = New-Object Dhcpv6Message.Dhcpv6Object($RA)
if($iaid -ne 0)
{
$Dhcpv6Obj.SetIAID([UInt32]$iaid)
}
if($duid -ne [System.String]::Empty)
{
#$res = validate-HardwareAddress $duid
#if($res -eq $false)
#{
# Write-Host "$duid is a invalid hardware address"
# exit
#}
$Dhcpv6Obj.SetClientID($duid)
}
else
{
exit
}

if($duidserver -ne [System.String]::Empty)
{
#$res = validate-HardwareAddress $duid
#if($res -eq $false)
#{
# Write-Host "$duid is a invalid hardware address"
# exit
#}

}
elseif ($duidserver -eq [System.String]::Empty -and ($type -eq "SOLICIT" -or $type -eq "FULLLEASE" -or $type -eq "INFO_REQ"))
{
}
else
{
exit
}

if($serverip -ne [System.String]::Empty)
{
$res = validate-IPv6Address $serverip
if($res -eq $false)
{
Write-Host "$serverip is a invalid ip address"
exit
}
$serveraddr = $serverip
}
else
{
$serveraddr = "ff02::1:2"
}

if($iana -ne [System.String]::Empty)
{
$res = validate-IPv6Address $iana
if($res -eq $false)
{
Write-Host "$IANA is a invalid ip address"
exit
}
}
else
{
$iana = $Dhcpv6Connector.GetIPv6Address()
}
if($interfaceip -ne [System.String]::Empty)
{
$res = validate-IPv6Address $interfaceip
if($res -eq $false)
{
Write-Host "$interfaceip is a invalid ip address"
exit
}
}
else
{
$interfaceip = $Dhcpv6Connector.GetIPv6Address()
}

if($type -eq "SOLICIT" -or $type -eq "FULLLEASE")
{
$Dhcpv6Packer.ConstructMessage(([ref]$Dhcpv6Obj), [Dhcpv6Message.DHCPV6_MESSAGE_TYPE]::DHCPV6_SOLICIT_MESSAGE);
$LocalAddr = $interfaceip
$Dhcpv6Obj.useIAAddr = $false;
$Dhcpv6Obj.SetIANAOption($iana);
}
elseif($type -eq "INFO_REQ")
{
$Dhcpv6Packer.ConstructMessage(([ref]$Dhcpv6Obj), [Dhcpv6Message.DHCPV6_MESSAGE_TYPE]::DHCPV6_INFORMATION_REQUEST_MESSAGE);
$LocalAddr = $interfaceip
}
elseif($type -eq "RELEASE")
{
$Dhcpv6Packer.ConstructMessage(([ref]$Dhcpv6Obj), [Dhcpv6Message.DHCPV6_MESSAGE_TYPE]::DHCPV6_RELEASE_MESSAGE);
$LocalAddr = $interfaceip
$Dhcpv6Obj.useIAAddr = $true;
$Dhcpv6Obj.SetIANAOption($iana);
$Dhcpv6Obj.SetServerID($duidserver);
}
elseif($type -eq "RENEW")
{
$Dhcpv6Packer.ConstructMessage(([ref]$Dhcpv6Obj), [Dhcpv6Message.DHCPV6_MESSAGE_TYPE]::DHCPV6_RENEW_MESSAGE);
$LocalAddr = $interfaceip
$Dhcpv6Obj.useIAAddr = $true;
$Dhcpv6Obj.SetIANAOption($iana);
$Dhcpv6Obj.SetServerID($duidserver);
}
else
{
write-host "The message" $msg "is not valid."
exit
}

$Dhcpv6Connector.SetLocalandDestAddr($LocalAddr, $ServerAddr);
$PacketLength = $Dhcpv6Obj.PackDhcpDataandOption();
if($RA -eq $true)
{
$Dhcpv6Obj.ActasRelayAgent($interfaceip);
$Dhcpv6Obj.SetLinkAddress($LinkAddr);
$Dhcpv6Obj.PackRelay();
$Dhcpv6Connector.InitWinSock("RELAY_AGENT");
}
else
{
$Dhcpv6Connector.InitWinSock("CLIENT");
}
$Dhcpv6Connector.SendPacket($Dhcpv6Obj.Dhcpv6SendMessageBuffer, $PacketLength);
$Dhcpv6Obj.SetSendTime();
$Dhcpv6Connector.RecvPacket(([ref]$Dhcpv6Obj));
if($Dhcpv6Obj.NoRecvMessage -ge 1)
{
if($type -eq "SOLICIT" -or $type -eq "FULLLEASE")
{
for($pos = 0; $pos -lt $Dhcpv6Obj.NoRecvMessage; $pos++)
{
if($RA)
{
$Dhcpv6Obj.UnPackRelay($Dhcpv6Obj.Dhcpv6RecvMessageLength[$pos], $pos);
}
$Dhcpv6Obj.UnPackDataandOptions($Dhcpv6Obj.Dhcpv6RecvMessageLength[$pos], $pos);
$Dhcpv6RetObj.SetServerIP(([System.Net.IPEndPoint]$Dhcpv6Obj.RecvEndPoints[$pos]).Address);
$Dhcpv6RetObj.SetTime($Dhcpv6Obj.FindTimeDifference($pos));
$option = $Dhcpv6Obj.GetRecvMessageOption([Dhcpv6Message.DHCP_MESSAGE_OPTION]::OPTION_IANA, $pos);
$Dhcpv6RetObj.SetYourIPAddress($Dhcpv6Obj.GetIAAddr($option));
$option = $Dhcpv6Obj.GetRecvMessageOption([Dhcpv6Message.DHCP_MESSAGE_OPTION]::OPTION_SERVER_ID, $pos);
if($option -ne $null)
{
$Dhcpv6RetObj.SetDuidServer($Dhcpv6Obj.GetDuidserver($option))
}
$option = $Dhcpv6Obj.GetRecvMessageOption([Dhcpv6Message.DHCP_MESSAGE_OPTION]::OPTION_DNS_SERVERS, $pos);
if($option -ne $null)
{
$Dhcpv6RetObj.SetDNS($Dhcpv6Obj.GetDNS($option));
}
$Dhcpv6RetObj | Format-List
}
}
elseif($type -eq "INFO_REQ")
{
$pos = 0
if($RA)
{
$Dhcpv6Obj.UnPackRelay($Dhcpv6Obj.Dhcpv6RecvMessageLength[$pos], $pos);
}
$Dhcpv6Obj.UnPackDataandOptions($Dhcpv6Obj.Dhcpv6RecvMessageLength[$pos], $pos);
$Dhcpv6RetObj.SetServerIP(([System.Net.IPEndPoint]$Dhcpv6Obj.RecvEndPoints[$pos]).Address);
$Dhcpv6RetObj.SetTime($Dhcpv6Obj.FindTimeDifference($pos));
$option = $Dhcpv6Obj.GetRecvMessageOption([Dhcpv6Message.DHCP_MESSAGE_OPTION]::OPTION_DNS_SERVERS, $pos);
if($option -ne $null)
{
$Dhcpv6RetObj.SetDNS($Dhcpv6Obj.GetDNS($option));
}
$Dhcpv6RetObj | Format-List
}
elseif($type -eq "RELEASE")
{
$pos = 0
if($RA)
{
$Dhcpv6Obj.UnPackRelay($Dhcpv6Obj.Dhcpv6RecvMessageLength[$pos], $pos);
}
$Dhcpv6Obj.UnPackDataandOptions($Dhcpv6Obj.Dhcpv6RecvMessageLength[$pos], $pos);
$Dhcpv6RetObj.SetServerIP(([System.Net.IPEndPoint]$Dhcpv6Obj.RecvEndPoints[$pos]).Address);
$Dhcpv6RetObj.SetTime($Dhcpv6Obj.FindTimeDifference($pos));
$option = $Dhcpv6Obj.GetRecvMessageOption([Dhcpv6Message.DHCP_MESSAGE_OPTION]::OPTION_IANA, $pos);
$Dhcpv6RetObj.SetYourIPAddress($Dhcpv6Obj.GetIAAddr($option));
$option = $Dhcpv6Obj.GetRecvMessageOption([Dhcpv6Message.DHCP_MESSAGE_OPTION]::OPTION_DNS_SERVERS, $pos);
if($option -ne $null)
{
$Dhcpv6RetObj.SetDNS($Dhcpv6Obj.GetDNS($option));
}
$Dhcpv6RetObj | Format-List
}
elseif($type -eq "RENEW")
{
$pos = 0
if($RA)
{
$Dhcpv6Obj.UnPackRelay($Dhcpv6Obj.Dhcpv6RecvMessageLength[$pos], $pos);
}
$Dhcpv6Obj.UnPackDataandOptions($Dhcpv6Obj.Dhcpv6RecvMessageLength[$pos], $pos);
$Dhcpv6RetObj.SetServerIP(([System.Net.IPEndPoint]$Dhcpv6Obj.RecvEndPoints[$pos]).Address);
$Dhcpv6RetObj.SetTime($Dhcpv6Obj.FindTimeDifference($pos));
$option = $Dhcpv6Obj.GetRecvMessageOption([Dhcpv6Message.DHCP_MESSAGE_OPTION]::OPTION_IANA, $pos);
$Dhcpv6RetObj.SetYourIPAddress($Dhcpv6Obj.GetIAAddr($option));
$option = $Dhcpv6Obj.GetRecvMessageOption([Dhcpv6Message.DHCP_MESSAGE_OPTION]::OPTION_DNS_SERVERS, $pos);
if($option -ne $null)
{
$Dhcpv6RetObj.SetDNS($Dhcpv6Obj.GetDNS($option));
}
$Dhcpv6RetObj | Format-List
}

if($type -eq "FULLLEASE")
{
if($serverip -ne [System.String]::Empty)
{
$pos = 0
}
else
{
$pos = Read-Host -Prompt "Select a server"
}
$serveroption = $Dhcpv6Obj.GetRecvMessageOption([Dhcpv6Message.DHCP_MESSAGE_OPTION]::OPTION_SERVER_ID, $pos);
$ianaoption = $Dhcpv6Obj.GetRecvMessageOption([Dhcpv6Message.DHCP_MESSAGE_OPTION]::OPTION_IANA, $pos);
$Dhcpv6Obj.Dhcpv6SendMessageOptionBuffer = $null
$Dhcpv6Obj.Dhcpv6SendMessageOptionLength = 0
$Dhcpv6Obj.NoRecvMessage = 0
$Dhcpv6Packer.ConstructMessage(([ref]$Dhcpv6Obj), [Dhcpv6Message.DHCPV6_MESSAGE_TYPE]::DHCPV6_REQUEST_MESSAGE);
$LocalAddr = $interfaceip
$Dhcpv6Obj.useIAAddr = $true;
$Dhcpv6Obj.SetIANAOptionbyByte($ianaoption);
$Dhcpv6Connector.SetLocalandDestAddr($LocalAddr, $ServerAddr);
if($duid -ne [System.String]::Empty)
{
$Dhcpv6Obj.SetClientID($duid)
}
$Dhcpv6Obj.SetServerIDbyByte($serveroption);

$PacketLength = $Dhcpv6Obj.PackDhcpDataandOption();
if($RA -eq $true)
{
$Dhcpv6Obj.ActasRelayAgent($interfaceip);
$Dhcpv6Obj.SetLinkAddress($LinkAddr);
$Dhcpv6Obj.PackRelay();
$Dhcpv6Connector.InitWinSock("RELAY_AGENT");
}
else
{
$Dhcpv6Connector.InitWinSock("CLIENT");
}

$Dhcpv6Connector.SendPacket($Dhcpv6Obj.Dhcpv6SendMessageBuffer, $PacketLength);
$Dhcpv6Obj.SetSendTime();
$Dhcpv6Connector.RecvPacket(([ref]$Dhcpv6Obj));
if($Dhcpv6Obj.NoRecvMessage -ge 1)
{
$pos = 0;

if($RA)
{
$Dhcpv6Obj.UnPackRelay($Dhcpv6Obj.Dhcpv6RecvMessageLength[$pos], $pos);
}
$Dhcpv6Obj.UnPackDataandOptions($Dhcpv6Obj.Dhcpv6RecvMessageLength[$pos], $pos);
$Dhcpv6RetObj.SetServerIP(([System.Net.IPEndPoint]$Dhcpv6Obj.RecvEndPoints[$pos]).Address);
$Dhcpv6RetObj.SetTime($Dhcpv6Obj.FindTimeDifference($pos));
$option = $Dhcpv6Obj.GetRecvMessageOption([Dhcpv6Message.DHCP_MESSAGE_OPTION]::OPTION_DNS_SERVERS, $pos);
if($option -ne $null)
{
$Dhcpv6RetObj.SetDNS($Dhcpv6Obj.GetDNS($option));
}
$Dhcpv6RetObj | Format-List
}
else
{
$Dhcpv6RetObj.CleanUp();
$Dhcpv6RetObj | Format-List
}
}
}
else
{
$Dhcpv6RetObj.CleanUp();
$Dhcpv6RetObj | Format-List
}
</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>type</Name>
<Value>$Config/Type$</Value>
</Parameter>
<Parameter>
<Name>serverip</Name>
<Value>$Config/ServerIP$</Value>
</Parameter>
<Parameter>
<Name>prefix</Name>
<Value>$Config/Prefix$</Value>
</Parameter>
<Parameter>
<Name>interfaceip</Name>
<Value>$Config/TargetIP$</Value>
</Parameter>
<Parameter>
<Name>retry</Name>
<Value>$Config/RetryTimes$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</ProbeAction>
</MemberModules>
<Composition>
<Node ID="PS"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>Windows!Microsoft.Windows.SerializedObjectData</OutputType>
<TriggerOnly>true</TriggerOnly>
</ProbeActionModuleType>