Feeds:
Записи
Комментарии

Archive for Май 2012

Данный вопрос был задан на форуме OsZone, товарищем 19w85. Для решения задачи, нам потребуется функция RasSetCredentials и структура RASCREDENTIALS. Ошибки, которые возвращает функция можно посмотреть в статье «Routing and Remote Access Error Codes«, часть ошибок это winerror, которые можно посмотреть, через net helpmsg №.

Я сделал,лишь небольшую обвязку для данной функции.

Function Set-RasCredential
{
	<#
	http://msdn.microsoft.com/en-us/library/aa376730.aspx

	3 = 1 -bor 2 (UserName -bor Password)

	RASCM_UserName = 0x00000001,
	RASCM_Password = 0x00000002,
	RASCM_Domain = 0x00000004,
	RASCM_DefaultCreds = 0x00000008

	Примеры:

	1. Set-RasCredential

	Произойдет запрос у пользователя ввода имени соединения и учетных данных.

	2. Set-RasCredential -Name MyNet -Credential (Get-Credential)

	Сохранить учетные данные для соединения MyNet

	3. Set-RasCredential -Name MyNet -Credential (Get-Credential) -Domain

	Добавить домен,передача значения домена через Get-Credential(Domain\UserName)

	4. Set-RasCredential -Name MyNet -Clear

	Снять галочку сохранение пароля,значение Domain не удаляется

	5. Set-RasCredential -Name MyNet -Clear -Domain

	Снять галочку сохранение пароля,значение Domain удаляется
	#>

	[CmdletBinding(DefaultParameterSetName="Item")]
	Param(
		#Название соединения
		[parameter(Mandatory=$true)]
		[String]$Name,
		#Учетные данные
		[parameter(Mandatory=$true,ParameterSetName="Item")]
		[Management.Automation.PSCredential]$Credential,
		#Путь к PhoneBook
		$PhoneBook = "$env:APPDATA\Microsoft\Network\Connections\Pbk\rasphone.pbk",
		#По умолчанию UserName и PassWord are valid
		$Flag = 3,
		#Для указания домена,если включен пункт Include Windows logon domain
		[switch]$Domain,
		#Для удаления учетных данных соединения
		[parameter(ParameterSetName="Clear")]
		[switch]$Clear
	)

	$code = @"
	const int UNLEN = 256;
	const int PWLEN = 256;
	const int DNLEN = 15;

	[DllImport("Rasapi32.dll ", CharSet=CharSet.Auto, SetLastError=true)]
	public static extern uint RasSetCredentials(
	  [MarshalAs(UnmanagedType.LPWStr)]
	  string lpszPhonebook,
	  [MarshalAs(UnmanagedType.LPWStr)]
	  string lpszEntry,
	  LPRASCREDENTIALS lpCredentials,
	  bool fClearCredentials
	);

	[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
	public struct LPRASCREDENTIALS {
	  public uint dwSize;
	  public uint dwMask;
	  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = UNLEN + 1)]
	  public string szUserName;
	  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = PWLEN + 1)]
	  public string szPassword;
	  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = DNLEN + 1)]
	  public string szDomain;
	}
"@

	Add-Type -MemberDefinition $code -Namespace Ras -Name RasCred

	$StrCred = New-Object Ras.RasCred+LPRASCREDENTIALS

	$StrCred.dwMask = $Flag

	switch($pscmdlet.ParameterSetName){
		"Item"  {
			$Choice = $False
			$StrCred.szUserName = $Credential.GetNetworkCredential().UserName
			$StrCred.szPassword = $Credential.GetNetworkCredential().Password
			if($Domain){
				$StrCred.szDomain = $Credential.GetNetworkCredential().Domain
				$StrCred.dwMask = $Flag -bor 4
			}
		}
		"Clear" {
			$Choice = $True
			if($Domain){
				$StrCred.dwMask = $Flag -bor 4
			}
		}
	}

	$result = [Ras.RasCred]::RasSetCredentials($PhoneBook,$Name,$StrCred,$Choice)
	if($result -eq 0) {
		Write-Host "Success"
	}
	else {
		$MessageError = @"
		Return Code  - $result`r`n

		If the function fails, the return value is one of the following error codes
		or a value from Routing and Remote Access Error Codes or Winerror.h.`r`n

		Routing and Remote Access Error Codes - http://msdn.microsoft.com/en-us/library/bb530704.aspx`r`n

		Winerror - net helpmsg $result`r`n
"@
			Write-Host $MessageError
	}
}
Реклама

Read Full Post »