IPv6 범위에 Ping을 실행할 쓰기 작업

Microsoft.Windows.DHCPServer.10.0.TestIPV6Scope.WA (ProbeActionModuleType)

이 쓰기 작업은 대상 IP를 다시 테스트하기 위해 IPv6 ping을 구현합니다.

Knowledge Base article:

요약

이 프로브 모듈은 Microsoft Windows Server 2016 및 1709 이상의 운영 체제를 실행 중이며 DHCP 기능이 활성화된 서버 인스턴스를 포함하는 DHCP 2016 및 1709 이상의 서버 그룹 구성원 "DHCP 2016 및 1709 이상의 서버 그룹"에서 IPv6 범위에 대한 테스트 Ping을 실행합니다.

구성

서버 IP: Ping에 사용할 서버 IP입니다.

접두사: Ping에 사용할 접두사입니다.

대상 IP: Ping에 사용할 대상 IP입니다.

다시 시도 횟수: 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
Prefixstring$Config/Prefix$접두사
TargetIPstring$Config/TargetIP$대상 IP
RetryTimesint$Config/RetryTimes$다시 시도 횟수

Source Code:

<ProbeActionModuleType ID="Microsoft.Windows.DHCPServer.10.0.TestIPV6Scope.WA" Accessibility="Public" Batching="false" PassThrough="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Type" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="ServerIP" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Prefix" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="TargetIP" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="RetryTimes" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" 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>TestDHCPIPV6Scopes.10.0.ps1</ScriptName>
<ScriptBody><Script>

param ([String] $type, [String] $serverip, [string]$prefix, [String] $interfaceip, [Int] $retry)

$SCRIPT_NAME = "TestDHCPIPV6Scopes.10.0"
&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>