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

Archive for Январь 2012

Q&A

1) Как найти строку в которой присутствует два слова?

"Вы заглянули в Интернет-магазин кормов для собак и кошек" -match "(?=.+кошек)(?=.+собак)"

Более подробно про регулярные выражения,Вы можете прочитать в блоге Василия Гусева — http://xaegr.wordpress.com/category/regular-expressions/

2) Как получить удаленный доступ к 64-x реестру из 32-x битного процесса?
Для этого требуется,чтобы на компьюетер был установлен .Net 4.0.

Скрипт «Access 64bit registry values from 32bit powershell» — использует Com объекты(не требует .Net 4.0, но и сложен).

Shay Levy написал два модуля для V3 и V2:
V2 — http://archive.msdn.microsoft.com/PSRemoteRegistry
V3 — http://psrr.codeplex.com/

3) Как установить изображение учетной записи?

$code = @"
[DllImport("shell32.dll", EntryPoint = "#262", CharSet = CharSet.Unicode, PreserveSig = false)]  
public static extern void SetUserTile(string username, int notneeded, string picturefilename);
"@

Add-Type -MemberDefinition $code -Name UserTile -Namespace System

#Применение
[UserTile]::SetUserTile("domain\username","picturefilename.jpg")

4) Как установить максимальный строк действия пароля неограничен?

Set-ADDefaultDomainPasswordPolicy contoso.com -MaxPasswordAge ([timespan]::MinValue)

5) Как экранировать символ \ в фильтре командлетов Active Directory ?

Для экранирования символа \ — используйте escape-последовательность \5c. Про остальные символы — можно прочитать в стандартной справке — about_ActiveDirectory_Filter

Как пример,найти всех пользователей у которых профайл хранится на определенной общей папке:

Get-ADUser -Filter "ProfilePath -like '\5c\5ceserver1\5cProfiles$\5c*'" -Properties profilepath

6) Как очистить корзину для конкретного пользователя или для всех?

#xp/2003
$shell = New-Object –ComObject Shell.Application
$rb = $shell.NameSpace(0xA).Self
$rb.InvokeVerb("Empty Recycle &Bin")

#Vista и выше
$shell = New-Object –ComObject Shell.Application
$shell.NameSpace(0xA).Items() | Remove-Item -Recurse

#Для всех пользователей
#Recycle - Xp/2003/Vista
#$Recycle.Bin - 7
$disks = Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3"

foreach ($disk in $disks)
{
	$rbpathold = "$($disk.DeviceID)\Recycle"
	$rbpathnew = "$($disk.DeviceID)\`$Recycle.Bin"
	
	if (Test-Path $rbpathold)
	{
		Remove-Item $rbpathold -Force -Recurse
	}
	
	if (Test-Path $rbpathnew)
	{
		Remove-Item $rbpathnew -Force -Recurse 
	}
}

7) Как установить значение параметров во вкладе «Совместимость» для приложения?

Для управления параметрами воспользуемся реестром.

#Для конкретного пользователя,путь в реестре 
"HKCU:\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"

#Для всех пользователей,путь в реестре
"HKLM:\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"

Name - путь к приложению
Type - REG_SZ
Value - параметры(через пробел)

Run in 256 colors - 256COLOR
Run in 640 x 480 screen resolution - 640X480
Disable visual themes - DISABLETHEMES
Disable Desktop composition - DISABLEDWM 
Disable display scaling on hight DPI settings - HIGHDPIAWARE
Run this  program run as an administrator - RUNASADMIN

Установить для приложения все эти параметры - "256COLOR 640X480 DISABLETHEMES DISABLEDWM HIGHDPIAWARE RUNASADMIN" 
Set-ItemProperty -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" -Name "C:\Program\calcX.exe" -Value "256COLOR 640X480 DISABLETHEMES DISABLEDWM HIGHDPIAWARE RUNASADMIN" 

Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" -Name "C:\Program\calcX.exe" -Value "256COLOR 640X480 DISABLETHEMES DISABLEDWM HIGHDPIAWARE RUNASADMIN" 

Чтобы параметры вступили в силу требуется перезагрузка или рестарт explorer.

8) Как установить свойство AutomaticManagedPage у класса Win32_ComputerSystem?

Для установки AutomaticManagedPage, требуется ,чтобы PowerShell был запущен в режиме STA и с правами администратора.

Start-Process powershell -Arg "-STA" -Verb RunAs

$System = Get-WmiObject Win32_ComputerSystem 
$System.AutomaticManagedPagefile = $False
$System.Put()

Реклама

Read Full Post »

Q&A

1) Как программно отключить монитор?

$signature = @"
    [DllImport("User32.DLL")]
    public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);
"@

$type = Add-Type -MemberDefinition $signature -Name Win32 -Namespace SendMessage -PassThru
$type::SendMessage(0xFFFF,0x0112,0xF170,2)

2) Какие ярлыки соответствуют данному exe?

Get-WmiObject Win32_ShortcutFile  -Filter "Target='C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe'"

3) Какой класс использовать для работы с большими целыми числами?

В .Net 4.0 есть структура BigInteger Structure для работы с большими числами. По умолчанию в PowerShell V2 не включена поддержка .Net 4.0, для включение — http://tfl09.blogspot.com/2010/08/using-newer-versions-of-net-with.html

4) Как сделать побитовый сдвиг?

V2 : Используйте скрипт http://huddledmasses.org/powershell-needs-shift-operators/

V3 : Появились встроенные операторы для побитового сдвига, -shl и -shr

5) Как просто сгенерировать пароль?

Function Get-Password {
        param($number=1,$length=10)
        $rand = New-Object System.Random
        for($i=0;$i -lt $number;$i++)
        {
                -join (1..$length | ForEach { [char]$rand.next(33,127) })
        }
}

PS > Get-Password -number 5 -length 15
1'K[jc_K8fLV4V:
,Y;u*r)u!9-,lr$
v$m6@`-I:gpY0yG
4~YC1MNlMe)0KB]
XrX4oIh|7X~0".9

6) Как работать с путями больше 256 символов?

Модуль — http://huddledmasses.org/long-path-module-experimental-io/

Также можно использовать часть возможностей cmd.exe используя префикс \\?\ — подробнее можно узнать в статье Naming Files, Paths, and Namespaces.

7) Как преобразовать пароль в Base64 для использование в атрибуте unicodepwd?

VBS — http://www.rlmueller.net/Programs/PwdToBase64.txt
Вручную — http://www.oszone.net/13669/Active-Directory-UnicodePwd-AD-LDS

И в одну строчку на PowerShell, двойные кавычки обязательные.

[convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes(‘»xZy$132#q!»‘))

Read Full Post »

1)      Использование ComObject — WMPlayer.OCX.7

$cds = (New-Object -ComObject "WMPlayer.OCX.7").cdromcollection
#Количество cd-rom's в системе
$cds.count
#Какой букве,соответсвует номер в коллекции
0..($cds.count-1) | select @{n="ItemCount";e={$_}},@{n="driveSpecifier";e={$cds.item($_).driveSpecifier}}
#Извлечь первый в номере коллекции
$cds.item(0).eject()
#Для закрытия 
$cds.item(0).eject()
#Извлечь по букве
$cds.getByDriveSpecifier("X").Eject()
#Для закрытия
$cds.getByDriveSpecifier("X").Eject()


Пример вывода
PS >  0..($cds.count-1) | select @{n="ItemCount";e={$_}},@{n="driveSpecifier";e={$cds.item($_).driveSpecifier}}

                                                 ItemCount driveSpecifier
                                                 --------- --------------
                                                         0 D:
                                                         1 I:

PS >  $cds.item(1).eject()
PS >  $cds.getByDriveSpecifier("I").Eject()

2)      Использование ComObject — Shell.Application

Данная библиотека хорошо документирована , подробнее можно прочитать на сайте — http://msdn.microsoft.com/en-us/library/bb774094(v=vs.85).aspx

Константы можно также посмотреть на сайте — ShellSpecialFolderConstants enumeration, нам потребуется только одна константа:

ssfDRIVES

0x11 (17). My Computer—the virtual folder that contains everything on the local computer: storage devices, printers, and Control Panel. This folder can also contain mapped network drives.

PS. Глагола для закрытия CD-ROM’a я не нашел.

$shellapp = New-Object -comObject Shell.Application
#Количество cd-rom's в системе
$shellapp.Namespace(17).Items() | Where {$_.Type -eq "CD Drive"}
#Какие действия можно выполнять над объектом,используя Verb
#Основная проблема,что зависит от локализации системы
$shellapp.Namespace(17).ParseName("X:").Verbs()
#Для англоязычной Windows - глагол Eject
$shellapp.Namespace(17).ParseName("X:").InvokeVerb("Eject")

Пример вывода:

PS > $shellapp.Namespace(17).Items() | Where {$_.Type -eq "CD Drive"}
Application  : System.__ComObject
Parent       : System.__ComObject
Name         : BD-ROM Drive (D:)
Path         : D:\
GetLink      : 
GetFolder    : System.__ComObject
IsLink       : False
IsFolder     : True
IsFileSystem : True
IsBrowsable  : False
ModifyDate   : 30.12.1899 0:00:00
Size         : 0
Type         : CD Drive

Application  : System.__ComObject
Parent       : System.__ComObject
Name         : DVD RW Drive (I:)
Path         : I:\
GetLink      : 
GetFolder    : System.__ComObject
IsLink       : False
IsFolder     : True
IsFileSystem : True
IsBrowsable  : False
ModifyDate   : 30.12.1899 0:00:00
Size         : 0
Type         : CD Drive


PS >  $shellapp.Namespace(17).ParseName("I:")


Application  : System.__ComObject
Parent       : System.__ComObject
Name         : DVD RW Drive (I:)
Path         : I:\
GetLink      :
GetFolder    : System.__ComObject
IsLink       : False
IsFolder     : True
IsFileSystem : True
IsBrowsable  : False
ModifyDate   : 30.12.1899 0:00:00
Size         : 0
Type         : CD Drive

PS > $shellapp.Namespace(17).ParseName("I:").Verbs() | Select Name

Name
----
&Open

Burn &to disc
Scan selected files with Anti&Vir
Form&at...
E&ject
&Copy
Create &shortcut
P&roperties

PS > $shellapp.Namespace(17).ParseName("I:").InvokeVerb("Eject")

3)      Использование WinAPI – mciSendString

Документация по функции, можно посмотреть на msdn — mciSendString , определение данной функции для C#, можно посмотреть на pInvoke — mciSendString.

#Количество cd-rom's в системе
Get-WmiObject Win32_CDROMDrive

$code = @"
[DllImport("winmm.dll")]
public static extern Int32 mciSendString(String command, StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);
"@
$cdrom = Add-Type -MemberDefinition $code -Name System -Namespace CDROM -UsingNamespace System.Text -PassThru 
#OPEN
$cdrom::mciSendString("open X: type CDAudio alias driveX", $null, 0, [IntPtr]::Zero)
$cdrom::mciSendString("set driveX door open", $null, 0, [IntPtr]::Zero)
#CLOSE
$cdrom::mciSendString("open X: type CDAudio alias driveI", $null, 0, [IntPtr]::Zero)
$cdrom::mciSendString("set driveX door closed", $null, 0, [IntPtr]::Zero)


Пример вывода:

PS > Get-WmiObject Win32_CDROMDrive | Select Caption,Drive

Caption                                                     Drive
-------                                                     -----
Optiarc DVD RW AD-7203A ATA Device                          I:
WDKVYZW YJ85M3OT SCSI CdRom Device                          D:

PS > $drive = "I"
PS > $string = "open $drive`: type CDAudio alias drive$drive"
PS > $cdrom::mciSendString($string, $null, 0, [IntPtr]::Zero)
0
PS > $setstring = "set drive$drive door open"
PS > $cdrom::mciSendString($setstring, $null, 0, [IntPtr]::Zero)
0
PS > $clsstring = "set drive$drive door closed"
PS > $cdrom::mciSendString($clsstring, $null, 0, [IntPtr]::Zero)
0

4)      Использование других WinAPi функций

Пример класса для C# был взят с сайта — http://stackoverflow.com/questions/1449410/programatically-ejecting-and-retracting-the-cd-drive-in-vb-net-or-c-sharp за авторством C# гуру Jon Skeet. Здесь лишь небольшая косметическая правка и адаптировано для PowerShell.

$code = @"
using System; 
using System.IO; 
using System.Runtime.InteropServices; 

namespace  System
{
	public class CDROM
	{ 
	    const int OPEN_EXISTING = 3; 
	    const uint GENERIC_READ = 0x80000000; 
	    const uint GENERIC_WRITE = 0x40000000; 
	    const uint IOCTL_STORAGE_EJECT_MEDIA = 2967560; 
	 
	    [DllImport("kernel32")] 
	    private static extern IntPtr CreateFile 
	        (string filename, uint desiredAccess,  
	         uint shareMode, IntPtr securityAttributes, 
	         int creationDisposition, int flagsAndAttributes,  
	         IntPtr templateFile); 
	 
	    [DllImport("kernel32")] 
	    private static extern int DeviceIoControl 
	        (IntPtr deviceHandle, uint ioControlCode,  
	         IntPtr inBuffer, int inBufferSize, 
	         IntPtr outBuffer, int outBufferSize,  
	         ref int bytesReturned, IntPtr overlapped); 
	 
	    [DllImport("kernel32")] 
	    private static extern int CloseHandle(IntPtr handle); 
	 
	    public static void EjectMedia(char driveLetter) 
	    { 
	        string path = "\\\\.\\" + driveLetter + ":"; 
	        IntPtr handle = CreateFile(path, GENERIC_READ | GENERIC_WRITE, 0,  
	                                   IntPtr.Zero, OPEN_EXISTING, 0, 
	                                   IntPtr.Zero); 
	        if ((long) handle == -1) 
	        { 
	            throw new IOException("Unable to open drive " + driveLetter); 
	        } 
	        int dummy = 0; 
	        DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, IntPtr.Zero, 0,  
	                        IntPtr.Zero, 0, ref dummy, IntPtr.Zero); 
	        CloseHandle(handle); 
	    } 
	}
}
"@
Add-Type -TypeDefinition $code 

Пример вывода:

PS > Get-WmiObject Win32_CDROMDrive | Select Caption,Drive

Caption                                                     Drive
-------                                                     -----
Optiarc DVD RW AD-7203A ATA Device                          I:
WDKVYZW YJ85M3OT SCSI CdRom Device                          D:

PS >  [CDROM]::EjectMedia("I")

Read Full Post »