728x90
728x90

download : https://learn.microsoft.com/en-us/windows-server/opbuildpdf/administration/windows-commands/toc.pdf?branch=live

 

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

728x90
728x90

Function Copy-WithProgress
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true,
            ValueFromPipelineByPropertyName=$true,
            Position=0)]
        $Source,
        [Parameter(Mandatory=$true,
            ValueFromPipelineByPropertyName=$true,
            Position=0)]
        $Destination
    )

    $Source=$Source.tolower()
#    $Filelist=Get-Childitem "$Source" –Recurse   -- 대상 폴더안의 파일 및 폴더 전체를 리스트함.
    $Filelist=Get-Childitem 파일명
    $Total=$Filelist.count
    $Position=0


    foreach ($File in $Filelist)
    {
        $Filename=$File.Fullname.tolower().replace($Source,'')
        #$Filename= 파일명
        $DestinationFile=($Destination+$Filename)
        Write-Progress -Activity "Copying data from '$source' to '$Destination'" -Status "Copying File $Filename" -PercentComplete (($Position/$total)*100)
        Copy-Item $File.FullName -Destination $DestinationFile
        $Position++
    }
}

$src="c:\temp"
$dest="C:\Temp\download"

Copy-WithProgress -Source $src -Destination $dest

#복사 완료 후 제거 
Remove-Item c:\temp\sw_dvd5_office_professional_plus_2016_64bit_korean_mlf.iso -Force  

728x90
728x90

$UserName = '도메인명\계정'
$Password = "비밀번호"
$Domain = $env:USERDOMAIN

Add-Type -AssemblyName System.DirectoryServices.AccountManagement
$ct = [System.DirectoryServices.AccountManagement.ContextType]::Domain
$pc = New-Object System.DirectoryServices.AccountManagement.PrincipalContext $ct,$Domain
$pc.ValidateCredentials($UserName,$Password)

 

결과값(암호가 맞을 경우)

True

결과값(암호가 틀릴 경우)

False

728x90
728x90

Column Width

If it’s just a column width problem, the fix is simple enough: just pipe to out-string and add the width parameter.

PS > Get-CsAnalogDevice | ft Identity,RegistrarPool | out-string -Width 160

 

 

Collections / Arrays

… but what if that doesn’t fix it?

It might be that the object you’re looking at is an array (a “collection”), and PowerShell is only showing the first few entries in that array, rather than the lot.

Here, the fix is to change the $FormatEnumerationLimit value. If you type it on its own into PowerShell the current value – probably 3 – will be returned. If you set a new value of -1, it’ll output ALL entries in your collection.

PS > $FormatEnumerationLimit
3
PS > $FormatEnumerationLimit=-1

 

참고 - https://greiginsydney.com/viewing-truncated-powershell-output/

 

Viewing Truncated PowerShell Output | greiginsydney.com

Sometimes PowerShell truncates output, and if you don’t realise what’s going on, you’ll never get it to show. Where you’re expecting potentially lots more text, PowerShell replaces it with a single lousy ellipsis, cruelly taunting you. Column Width If it’s

greiginsydney.com

    

728x90
728x90

$Searcher = New-Object -ComObject Microsoft.Update.Searcher
$SearchResult = $Searcher.Search($Criteria).Updates
$SearchResult.count

 

 

결과

PS C:\Users\iadmin> $Searcher = New-Object -ComObject Microsoft.Update.Searcher

PS C:\Users\iadmin> $SearchResult = $Searcher.Search($Criteria).Updates

PS C:\Users\iadmin> $SearchResult.count

0

PS C:\Users\iadmin>

728x90
728x90

ClientNetworkProtocol Client 의 네트워크 접속 프로토콜의 정의와 우선순위를 결정하는 클래스입니다.

지난번과 같이 WMIObject ClientNetworkProtocol 클래스를 가져와 볼까요

Get-WmiObject -namespace root\Microsoft\SqlServer\ComputerManagement10 -class ClientNetworkProtocol | Select-Object ProtocolName, ProtocolDisplayName, ProtocolOrder




저 같은 경우 로컬에 SQL이 깔려있기 때문에 우선순위 첫번째가 메모리로 나오네요
원격인 경우 TCP 1 로 보입니다. 참고로 ProtocolOrder 0은 비사용중임을 나타냅니다.

 


이 클래스의 메소드들은..

Get-WmiObject -namespace root\Microsoft\SqlServer\ComputerManagement10 -class ClientNetworkProtocol |
Get-Member -memberType Method | Select-Object Name

 


이와 같이 프로토콜의 사용여부와 우선순위를 설정하는 메소드들입니다.



위에 메소드를 이용한 아래의 간단한 스크립트는 Named Pipes 를 비사용으로 바꾸는 역할을 합니다.

$WClientNetProtol=Get-WmiObject –namespace root\Microsoft\SqlServer\ComputerManagement10 -class ClientNetworkProtocol -filter "ProtocolName='np'"
$WClientNetProtol.SetDisable()



Named Pipes가 비사용중으로 바뀌었네요



ClientNetworkProtocol의 속성 변경을 원할 경우 ClientNetworkProtocolProperty 클래스를 이용하시면 됩니다.

살짝 살펴보면 ..

Get-WmiObject -namespace root\Microsoft\SqlServer\ComputerManagement10 -class

ClientNetworkProtocolProperty | Select-Object PropertyName, PropertyNumVal, PropertyStrVal,ProtocolName

 


기본접속 포트가 1433으로 설정되어 있네요


아래는 TCP/IP 프로토콜의 기본접속 포트를 1433에서 15886로 변경하는 스크립트입니다.

$WClientNetProto=Get-WmiObject –namespace root\Microsoft\SqlServer\ComputerManagement10 –class
ClientNetworkProtocolProperty -filter "PropertyName='Default Port'"

$ WClientNetProto.SetNumericalValue(15886)


참고: SQL Server Administration with Windows PowerShell

원본: http://vstarmanv.tistory.com/entry/MSSQLWMI-for-SQL-Management2

728x90
728x90

PowerShell 을 이용해서 대량의 파일을 대상으로 내부 내용을 변경 하는 방법을 찾아 보았습니다.

PowerShell 에는 -replace 연산자가 존재하는데, 마치 리눅스의 sed 명령어 처럼 쓸 수 있습니다.

"wow nice olleh" | %{$_ -Replace ("nice","OLLEH")}

 




이 연산자를 사용해서 대량의 파일을 대상으로 내용을 변경 하는 것도 가능 한데요, 아래의 구조로 된 폴더를 예로 들겠습니다.



폴더의 내부에 존재하는 각 파일의 내용에는 nice 라는 문자열이 존재합니다.



만약, "MyDocument" 디렉터리및 하위 디렉터리의 모든 *.txt 파일을 대상으로 파일 내용 중 "nice" 를 "OLLEH" 라고 바꾸고 싶다면, 아래 명령어를 사용하면 됩니다.

dir -Path MyDocument -Include *.txt -Recurse | %{$tmp = Get-Content $_; $tmp=$tmp -Replace ("nice","OLLEH"); Set-Content $_ $tmp}

 


파일의 내용 중 nice 가 모두 OLLEH 로 변경 된 것을 확인 할 수 있습니다.

대량 변경 작업시에 유용하게 사용 할 수 있을 것 같네요. ^^



<참고 URL>
http://www.myitforum.com/articles/40/view.asp?id=11843
http://blogs.msdn.com/b/zainnab/archive/2007/07/09/grep-and-sed-with-powershell.aspx

<참고 도움말>
about_Comparison_Operators

감사합니다.

출처: https://svrstudy.tistory.com/81?category=352377 [Windows Server 공부방]

728x90
728x90

$sqlConnection = New-Object system.data.sqlclient.sqlconnection "server=서버명또는IP;database=DatabaseName;user=계정;비밀번호;trusted_connection=true"
$sqlConnection.Open()
$sqlCommand = $sqlConnection.CreateCommand()
$sqlCommand.CommandText = "Select ResourceId, UserAtHost cnt FROM Resource"
$sqlReader = $sqlCommand.ExecuteReader()
while($sqlReader.Read())
{
$sqlReader["ResourceId"]
$sqlReader["UserAtHost"]
}
$sqlConnection.Close()

728x90
728x90

https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-powershell-1.0/ee177028(v=technet.10)

 

Using the Where-Object Cmdlet

Filtering Returned Data

The Where-Object cmdlet provides a way for you to filter data returned by other cmdlets. For example, by default the Get-Process cmdlet returns information about all the processes currently running on your computer. However, suppose you’re interested in only those processes using more than 200 handles. (We’re not sure why you’d be interested in that, but ….) To get back only that subset of processes, call Get-Process and then pipe the results through Where-Object:

Get-Process | Where-Object {$_.handles -gt 200}

Take careful note of the syntax. To begin, the where clause is enclosed within curly braces; in addition, the $_ notation is used to represent the default object (that is, the object being transferred across the pipeline). Last, but surely not least, notice the comparison operator being used to indicate greater than: it’s -gt as opposed to >. Windows PowerShell does not use the standard arithmetic comparison operators; instead, it uses operators such as these:

  • -lt -- Less than

  • -le -- Less than or equal to

  • -gt -- Greater than

  • -ge -- Greater than or equal to

  • -eq -- Equal to

  • -ne -- Not equal to

  • -like - Like; uses wildcards for pattern matching

In other words, if we were looking for processes where handles were greater than or equal to 200 we’d use this command:

Get-Process | Where-Object {$_.handles -ge 200}

You can also use the -and and -or parameters to create even-more finitely targeted datasets. For example, suppose you’d like to return all the instances of the svchost process that are using more than 200 handles. All you have to do is include both criterion in your where clause, separating the two by using -and:

Get-Process | Where-Object {$_.handles -gt 200 -and $_.name -eq "svchost"}

Likewise, suppose you wanted a list of all the process that are using more than 200 handles or that have the name svchost (in other words, all processes using more than 200 handles as well as all the svchost processes, regardless of the number of handles they might be using). In that case, use the -or parameter to join the two parts of your where clause:

Get-Process | Where-Object {$_.handles -gt 200 -or $_.name -eq "svchost"}

Here’s another example; this one (using the Get-ChildItem cmdlet) shows you only the files in the folder C:\Scripts that are larger than 100,000 bytes:

Get-ChildItem c:\scripts | Where-Object {$_.length -gt 100000}

And let’s not forget the -like operator. This command returns all of the files in C:\Scripts that include the string test in the file name. Note the use of the two asterisks as wildcard characters:

Get-ChildItem c:\scripts | Where-Object {$_.name -like "*test*"}

Here’s the kind of data you can expect to get back:

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---          5/6/2006  10:24 PM      34198 test.csv
-a---         5/19/2006   9:11 AM       5918 test.htm
-a---         5/19/2006   8:16 AM      34226 test.log
-a---         5/19/2006   1:20 PM         65 test.ps1
-a---         5/20/2006   9:52 AM        150 test.psc1
-a---         5/20/2006   9:52 AM        150 test.psc1e.psc1
-a---         5/19/2006   1:27 PM        565 test.txt
-a---         4/17/2006   6:41 PM      24064 test.txt.doc
-a---         5/19/2006   1:45 PM       1971 test.vbs
-a---         5/17/2006   1:41 PM       9248 test.xls
-a---         5/19/2006   1:20 PM     628234 Test.xml
-a---          4/6/2006  10:26 PM        205 test_NODUPL.txt
Where-Object Aliases
  • where

728x90
728x90

Powershell – Remoting (원격 접속)

원격지에 있는 Powershell 에 접속이 가능하다 정확히는 Session 을 만들수 있는데 이 Session을 이용하여 원격지에 있는 Powershell 과 상호작용이 가능한것이다.
자주쓰게 되는 기능인데 물어보는 분들이 많아 정리 해 둔다.
자세한 규칙이나 프로토콜, 원리등을 설명하면 20페이지정도 문서가 나올꺼 같지만 여기선 필요한 과정들에 대한 설명만 기록한다.

바쁜사람들은 아래를 보고 따라하자.

A 가 B 에 원격 접속 하고 싶을 때.

초간단 설정

정말 바쁘거나 세부내용을 알기 싫고 모르겠으면 A와 B 양쪽에 아래 명령을 입력하고 “사용하기” 로 넘어가자.

A 측에 할 작업

Enable-PSRemoting

다음과 같은 셋팅을 한꺼번에 하려고 한단다.

그뒤 SDDL 별로 Set-PSSessionConfiguration 을 수행 하면서 질문을 하는데, 필요한것 것들에 대해 Y를 눌려 수행한다. (잘 모르겠으면 A – Yes to All)



이해가 잘 안가거나 다 Yes 하고 싶으면 -Force 옵션을 붙히자.

A 와 B 에 모두 할 작업

WSMan:localhostClientTrustedHosts 설정

Powershell 원격제어를 하는 Protocol 은 상호간에 TrustedHost 가 설정 되어 있어야 한다.
다음 명령으로 현재 값을 확이해 보면 Value 가 공란으로 있을 것이다.

이 값을 상대방의 ComputerName, IP, Domain 등으로 설정하면된다.
값은 ,로 구분해 Array로 넣을 수 있고 * 를 사용할 수 있다.

예를 들어.

모든 대상에 대해서 허용.

컴퓨터 이름이 Alpha, Beta 인 두 대상을 허용.

IP 가 192.168.0.10 인 대상을 허용.


역시 잘 모르겠으면 다음을 입력하자.

사용 하기

ssh 나 telnet 처럼 원격으로 접속하여 사용하길 원하면 다음 명령을 이용한다.


명령하나를 원격지에 수행하고 싶다면 Invoke-Command 를 이용한다.

ComputerName 대신 미리 New-PSSession 명령을 이용해 Session 을 만들어 그것을 사용할 수도 있다. 말그대로 같은Session에서 수행 되기 때문에 연속적인 작업을 나누어 할수 있고 여러번 수행할때 속도도 빠르다.



728x90

+ Recent posts