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

Archive for Февраль 2012

Q&A

1) Как установить/получить значение свойства EnableRemoteControl у пользователя?

EnableRemoteControl — Значение, указывающее, следует ли разрешить
удаленное наблюдение или удаленное управление
сеансом пользователя служб терминалов.

Disable 0 — Remote control is disabled.

EnableInputNotify 1 — The user of remote control has full control of
the user’s session, with the user’s permission.

EnableInputNoNotify 2 — The user of remote control has full control of
the user’s session; the user’s permission is not required.

EnableNoInputNotify 3 — The user of remote control can view the session
remotely, with the user’s permission; the remote user
cannot actively control the session.

EnableNoInputNoNotify 4 — The user of remote control can view the session
remotely, but not actively control the session;
the user’s permission is not required.

Для получения свойства EnableRemoteControl:

	$user = [ADSI]"LDAP://CN=UserName,DC=Contoso,DC=Com"
	$user.EnableRemoteControl

Для установки свойства EnableRemoteControl(для примера Disable — 0):

	$user = [ADSI]"LDAP://CN=UserName,DC=Contoso,DC=Com"
	$user.InvokeSet("EnableRemoteControl",0)
	$user.SetInfo()

2) Как отправить запрос SoAP и получить результат?

function Execute-SOAPRequest
{
	[CmdletBinding()]
	param(
		[Xml]    $SOAPRequest,
        [String] $URL,
		[String] $SOAPAction
	)

		Write-Verbose "Sending SOAP Request To Server: $URL"
        $soapWebRequest = [System.Net.WebRequest]::Create($URL)
        $soapWebRequest.Headers.Add("SOAPAction","`"$SOAPAction`"")

        $soapWebRequest.ContentType = "text/xml;charset=`"utf-8`""
        $soapWebRequest.Accept      = "text/xml"
        $soapWebRequest.Method      = "POST"

        Write-Verbose "Initiating Send."
        $requestStream = $soapWebRequest.GetRequestStream()
        $SOAPRequest.Save($requestStream)
        $requestStream.Close()

        Write-Verbose "Send Complete, Waiting For Response."
        $resp = $soapWebRequest.GetResponse()
        $responseStream = $resp.GetResponseStream()
        $soapReader = [System.IO.StreamReader]($responseStream)
        $ReturnXml = [Xml]$soapReader.ReadToEnd()
        $responseStream.Close()

        Write-Verbose "Response Received."

        $ReturnXml
}

Пример работы используя сервис Whois:

$SOAPAction = "http://www.webservicex.net/GetWhoIS"

$url = 'http://www.webservicex.net/whois.asmx'
$soap = [xml]@'
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetWhoIS xmlns="http://www.webservicex.net">
      <HostName>yandex.ru</HostName>
    </GetWhoIS>
  </soap:Body>
</soap:Envelope>
'@

$xml = Execute-SOAPRequest $soap $url $SOAPAction -Verbose

PS >  $xml.Envelope.OuterXml
#Вывод обрезан
domain:        YANDEX.RU
nserver:       ns1.yandex.ru. 213.180.193.1
nserver:       ns2.yandex.ru. 213.180.199.34
nserver:       ns4.yandex.ru. 77.88.19.60
nserver:       ns5.yandex.ru. 213.180.204.1
state:         REGISTERED, DELEGATED, VERIFIED
org:           YANDEX, LLC.
registrar:     RU-CENTER-REG-RIPN
admin-contact: https://www.nic.ru/whois
created:       1997.09.23
paid-till:     2012.10.01
free-date:     2012.11.01
source:        TCI

Last updated on 2012.02.26 22:40:46 MSK

3) Как сменить значение Apply To для пользователя для OU?

$user = "NT AUTHORITY\Authenticated Users"
$ou   = [ADSI]"LDAP://OU=OUNAMe,DC=Contoso,DC=Com"
$user = $ou.objectsecurity.access | where {$_.IdentityReference -eq $user}

$rule = New-Object System.DirectoryServices.ActiveDirectoryAccessRule(
		$user.IdentityReference,
		$user.ActiveDirectoryRights,
		$user.AccessControlType,
		$user.ObjectType,
		"All",
		$user.InheritedObjectType
		)

$return = $false
$ou.objectsecurity.ModifyAccessRule("Add",$rule,[ref]$return)
if ($return)
{
	$ou.CommitChanges()
}

4) Как найти значение ip адреса компьютера используя DNS?

$filter = "(&(objectClass=organizationalunit)(name=*servers*))"
$searcher = [adsisearcher]$filter
$ous = $searcher.FindAll() | Foreach {$_.GetDirectoryEntry()}
$result = @()

foreach($ou in $ous)
{
	$ou.Children | Where {$_.SchemaClassName -eq "computer"} | Foreach {
		$comp = $_
		$ip = $null
		if ($comp.dnshostname)
		{
			try {
				$ip = [System.Net.Dns]::GetHostEntry(
					[string]$comp.dnshostname).AddressList -join ","
			}
			catch
			{
				$ip = "Not found"
			}
		}

		$result += New-Object PsObject -Property @{
						Name = [string]$comp.name
						dNSHostName = [string]$comp.dnshostname
						Ip = $ip
			}
	}
}

5) Прочитать файл,как массив символов?

В версии PowerShell V3 у комадлета Get-Content добавился параметр Raw,который
позволяет читать читать файл,как одну строку. В версии PowerShell V2 комадандлет
Get-Content возвращает массив строк.

# V3
Get-Content file.txt -Raw

В версии V2,мы можем использовать .Net метод класса Io.File — ReadAllText.
Разница между методами ReadAllText и ReadAllLines,ReadAllText — возвращает
одну строку,а метод ReadAllLines — возвращает массив строк.

# V2
[IO.File]::ReadAllText(«FullPatName»)

6) Как определить разрядность приложения 32-bit or 64-bit?

Готовую функцию можно взять на сайте:
http://www.pinvoke.net/default.aspx/kernel32.getbinarytype

7) Как узнать размер файла перед скачиванием?

$wc = new-object System.Net.WebClient
$url = "http://www.bartdesmet.net/download/ps.txt"
$wc.OpenRead($url) | Out-Null
$wc.ResponseHeaders["Content-Length"]
$url = "http://www.bartdesmet.net/download/ps.txt"
$wc = [System.Net.WebRequest]::Create($url)
$resp = $wc.GetResponse()
$resp.ContentLength

8) Есть ли Portable версия PowerShell?

Portable версию PowerShell можно бесплатно скачать на сайте:
http://site.shelltools.net/Applications/Portable_PowerShell

9) Как сконвертировать скрипт PowerShell в Exe?

Одна из целей это немного затруднить чтение вашего кода. Существует достаточно
много wrapper’s,но приведу два бесплатных решения. У всех решений большой
недостаток,требуется наличие PowerShell.

http://ps2exe.codeplex.com/
http://rkeithhill.wordpress.com/2010/09/21/make-ps1exewrapper/

10) Как управлять привязкой сетевых компонентов?

Для этого можно воспользоваться утилитой nvspbind,которую можно скачать на
сайте — http://archive.msdn.microsoft.com/nvspbind

11) Как получить массив строк после возврата от выполнения метода
DownloadString?

$str.split(«`n») или $str -split «`n»

12) Как найти события в интервале дат используя Xpath?

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

#Получить значение в миллисекуднах между датами
[int](new-timespan ([datetime]::Today) (get-date)).TotalMilliseconds

$filter = "*[System[TimeCreated[timediff(@SystemTime) >= 10000000] and TimeCreated[timediff(@SystemTime) <= 86400000]]]"
Get-WinEvent -FilterXPath $filter -LogName application

13) Как найти все слова в тексте начинающиеся с гласной?

[regex]::Matches($text,"(?i)\b[аеиоуыэюя]\S*") | ft value
Реклама

Read Full Post »

Q&A

1) Как установить пользователю 'Deny this use permissions to logon 
    to a Remote Desktop Session Host Server'?

0 - для установки флажка
1 - для снятия флажка

$user = [ADSI]"LDAP://CN=UserName,OU=Clients,DC=contoso,DC=com"
$user.InvokeSet("AllowLogon",1)
$user.CommitChanges()

2) Как найти все пустые группы в Active Directory?

    ([adsisearcher]"(&(objectCategory=group)(!member=*))").FindAll()
    
3) Как найти все события с определенный LogonType в журнале Security?

Значения Logon Type можно посмотреть на сайте - 
    http://technet.microsoft.com/en-us/library/cc787567(v=ws.10).aspx
    
    $filter = "*[EventData[Data[@Name='LogonType']=5]]"
    Get-WinEvent -FilterXPath $filter -LogName Security
    
    #Найдем все события с опеределенным значением Logon Type и EventID
    $filter = "*[System[EventID=4624] 
        and EventData[Data[@Name='LogonType']=5]]"
    Get-WinEvent -FilterXPath $filter -LogName Security
    
    #Найдем все события с опеределенным значением Logon Type и EventID за
    #последние сутки
$time = [int](New-TimeSpan ([datetime]::Today) (get-date)).TotalMilliseconds
    $filter = "*[System[TimeCreated[timediff(@SystemTime) < $time] and 
        EventID=4624] and EventData[Data[@Name='LogonType']=5]]"
    Get-WinEvent -FilterXPath $filter -LogName Security 

Командлет Get-WinEvent работает только в системах Vista и выше,но дает 
преимущество,т.к не зависит от языка операционной системы.

4) Как создать диалог InputBox?

Пример был взят с сайта(C#) - http://www.csharp-examples.net/inputbox/ 

Function Show-InputBox($title, $promptText)
{
  $form = New-Object Windows.Forms.Form
  $label = New-Object Windows.Forms.Label
  $textBox = New-Object Windows.Forms.TextBox
  $buttonOk = New-Object Windows.Forms.Button
  $buttonCancel = New-Object Windows.Forms.Button

  $form.Text = $title
  $label.Text = $promptText

  $buttonOk.Enabled = $false
  $buttonOk.Text = "OK"
  $buttonCancel.Text = "Cancel"
  $buttonOk.DialogResult = [Windows.Forms.DialogResult]::OK
  $buttonCancel.DialogResult = [Windows.Forms.DialogResult]::Cancel

  $label.SetBounds(9, 20, 372, 13)
  $textBox.SetBounds(12, 36, 372, 20)
  $buttonOk.SetBounds(228, 72, 75, 23)
  $buttonCancel.SetBounds(309, 72, 75, 23)

  $label.AutoSize = $true
  $textBox.Anchor = $textBox.Anchor -bor [Windows.Forms.AnchorStyles]::Right
  $buttonOk.Anchor = [Windows.Forms.AnchorStyles]::Bottom -bor [Windows.Forms.AnchorStyles]::Right
  $buttonCancel.Anchor = [Windows.Forms.AnchorStyles]::Bottom -bor [Windows.Forms.AnchorStyles]::Right
  
  $textBox.Add_TextChanged({
    if($this.Text){
        $buttonOk.Enabled = $true
    }
    else {
        $buttonOk.Enabled = $false
        }
    })
  $form.ClientSize = New-Object Drawing.Size(396, 107)
  $form.Controls.Add($label)
  $form.Controls.Add($textBox)
  $form.Controls.Add($buttonOk)
  $form.Controls.Add($buttonCancel)
  $form.ClientSize = New-Object Drawing.Size([Math]::Max(300, $label.Right + 10), $form.ClientSize.Height)
  $form.FormBorderStyle = [Windows.Forms.FormBorderStyle]::FixedDialog
  $form.StartPosition = [Windows.Forms.FormStartPosition]::CenterScreen
  $form.MinimizeBox = $false
  $form.MaximizeBox = $false
  $form.AcceptButton = $buttonOk
  $form.CancelButton = $buttonCancel

  $dialogResult = $form.ShowDialog()
  New-Object PsObject -Property @{
          Value = $textBox.Text
         DialogResult =  $dialogResult
    }
}

Еще пару вариантов:
Creating a Custom Input Box - 
    http://technet.microsoft.com/en-us/library/ff730941.aspx

An Easy InputBox - http://bit.ly/xyfKSe

5) Как проверить учетные данные пользователя при подключении 
    к Active Directory?

    #Требуется минимальная версия .Net 3.5
    $domain = "contoso.com"
    $cred = Get-Credential
$pc = New-Object DirectoryServices.AccountManagement.PrincipalContext(
            "Domain", $domain) 
$isValid = $pc.ValidateCredentials(
    ($cred.UserName -replace "^\\"), $cred.GetNetworkCredential().Password)
    
    #Вариант для младших версий
    $domain = "DC=Contoso,DC=Com"
    $cred = Get-Credential

    try
    {
        New-Object System.DirectoryServices.DirectoryEntry(
            "LDAP://$domain",
            ($cred.UserName -replace "^\\"), 
            $cred.GetNetworkCredential().Password) | Out-String
    }
    catch {
        Write-Host -ForegroundColor Yellow $_
    }
    
6) Как найти индекс указанного элемента в массиве?
    
Для этого нам понадобится статическое свойство IndexOf класса Array.
    
    #V2
    $array = 1..10
    [array]::IndexOf($array,5)
    
    #V3
    #В версии V3 появилось нововведение и теперь мы можем использовать 
    #статические методы класса из экземпляра объекта
    $array = 1..10
    $array.IndexOf(5)
    
7) Как отправить пользователю сообщения на удаленный компьютер?
    
    Invoke-WmiMethod -Path Win32_Process -Name Create `
    -ArgumentList "msg * Hello" -ComputerName UserPc

8) Почему при запуске powershell параметры -file и -command 
            должны быть последними?

Данный баг был зарегистрирован на сайте http://bit.ly/xONJpz,
    особо неприятный момент,что - "Closed as Won't Fix".

9) Получаю ошибку "Unable to index into an object of type 
    System.Management.ManagementObjectCollection" ?

Ошибка возникает,что данный класс не содержит индексатора и мы не можем,
обращаться к элементам по индексу.
    
    #Пример ошибки
    $disks = gwmi win32_diskdrive
    $d = $disks[0]
    $p = $d.getrelated("win32_diskpartition")
    $p[0]
    Unable to index into an object of type 
        System.Management.ManagementObjectCollection.
    
    #Решение: привести явно к типу массив объектов
    1) @($p)[0]
    2) @($P).get(0)
    3) $p | select -f 1
    4) [array]$p = $d.getrelated("win32_diskpartition")
       $p[0]

Решения и вопрос из темы на форуме Technet(автор темы JRich, 
    I wish to thank the author of the question Justin).:

indexing problem -  http://bit.ly/yT4o2f

Также советую почитать его полезный блог,где можно подчерпнуть для себя 
много нового, jrich - http://jrich523.wordpress.com .


10) Какие потоки существуют в PowerShell?
    
    #V2
    0 - stdin
    1 - stdout
    2 - stderr
    
    #V3
    0 - stdin
    1 - stdout
    2 - stderr
    3 - warning 
    4 - verbose     
    5 - debug     
    
11) Как удалить запрещающее правило из ключа реестра?

Представим,что мы хотим удалить ключ реестра,но у него есть 
запрещающее правило, которое не позволяет нам удалить этот ключ,
но права у нас есть на изменение правил доступа.
    
    PS >  Get-Acl HKCU:\Test
    Get-Acl : Requested registry access is not allowed.
    
В этом случае нам поможет WMI  и метод SetSecurityDescriptor,который 
доступен только начиная с Vista и выше.
    
    $hkey = 2147483649 #HKCU
    $hsubkey = "Test"
    $reg = [wmiclass]"root\default:StdRegProv"
    $ace = $reg.GetSecurityDescriptor($hkey,$hsubkey).Descriptor.DACL

    $reg.psbase.Scope.Options.EnablePrivileges = $true
    $sd = ([WMIClass] "Win32_SecurityDescriptor").CreateInstance()
    $sd.ControlFlags = 0x0004
    
    #AceType=1 - Deny
    for($i=0;$i -lt $ace.length;$i++)
    {
        if($ace[$i].AceType -ne 1)
        {
            $SD.dacl += $ace[$i] 
        }
    }
    $reg.SetSecurityDescriptor($hkey,$hsubkey,$sd)
    

    #Когда мы удалили запрещаюищее правило,мы снова можем посмотреть ACL
    PS  >  Get-Acl HKCU:\Test | Out-String -Width 80

Path                       Owner                      Access
----                       -----                      ------
Microsoft.PowerShell.Co... WINPC\Александр            WINPC\Александр Allow

PS. Но лучше использовать для этого утилиты SubInAcl,SetAcl.











    
    

Read Full Post »