標籤: Powershell

Powershell : 印表機服務重啟

Powershell : 印表機服務重啟

有些時候,要排除印表機的問題,例如:無法列印、列印工作卡住。
下面的Script需要有管理員權限,他會停止列印服務,清除列印中的工作,然後啟用列印服務。


1
2
3
Stop-Service -Name Spooler -Force
Remove-Item -Path "$env:SystemRoot\System32\spool\PRINTERS\*.*"
Start-Service -Name Spooler
Please follow and like us:
讀取資料夾權限並列表為CSV

讀取資料夾權限並列表為CSV

經歷過很多年代的檔案伺服器是最不容易管理的。
尤其裡面很多資料夾有的有繼承權限有的沒有,一個一個進去點開來看十分痛苦也浪費時間。所幸透過Powershell可以一次把Folder下面所有的資料夾全權一次蒐集出來匯出的CSV,這樣就可以透過Excel來打開看了。
當然Excel有資料筆數限制,所以如果大到打不開請勤勞一點拆分子資料夾蒐集。

下面是Powershell程式碼:請自行替換變數$path和$reportpath


1
2
3
4
$path = "F:\XXXX\AA" #define path to the shared folder
$reportpath ="F:\temp\XXXX_AA_ACL.csv" #define path to export permissions report
#script scans for directories under shared folder and gets acl(permissions) for all of them
dir -Recurse $path | where { $_.PsIsContainer } | % { $path1 = $_.fullname; Get-Acl $_.Fullname | % { $_.access | Add-Member -MemberType NoteProperty '.\Application Data' -Value $path1 -passthru }} | Export-Csv $reportpath

下面就會列出資料夾下所有的ACL,這樣是不是很方便稽核呢!

Please follow and like us:
Powershell:與Batch讀取txt檔內容作為變數

Powershell:與Batch讀取txt檔內容作為變數

如果你寫了很多Powershell或批次檔是放在Fileserver/ShareFolder給大家用,
那麼FileServer搬家對你來說肯定是個痛苦,因為如果當初你的路徑是寫死的,髂麼肯定是很痛苦的。

最早,我都是在Powershell/Batch檔頭做變數宣告,例如:


1
2
3
Dos command / Batch
%Srv_A% = \\1.2.3.4
%Srv_B% = \\5.6.7.8

1
2
3
Powershell
$Srv_A = \\1.2.3.4
$Srv_B = \\5.6.7.8

但是如果這類的Script越來越多,某一天Share Folder搬家的時候也是改得很痛苦。所以我就萌生了如何可以一次改好的方式。把路徑的變數放在某個TXT檔案,需要的時候去讀出來就好了。

下面是文字檔的部分,我自己命名為GlobalVar.txt


1
2
FSRV_A=\\1.2.3.4
FSRV_B=\\5.6.7.8

Dos Command / Batch讀取方式,在檔頭放這一行利用 %~dp0的方式來讀取同目錄的txt檔案


1
for /f "delims== tokens=1,2" %%G in (%~dp0GlobalVar.txt) do set %%G=%%H

Powershell讀取方式,在檔頭放這一行,利用$PSScriptRoot來讀取同目錄txt檔案。


1
2
3
4
Get-Content $PSScriptRoot\GlobalVar.txt | Foreach-Object{
   $var = $_.Split('=')
   New-Variable -Name $var[0] -Value $var[1]
}

如果你沒有把Script放的太多目錄,這樣應該可以減少你Share Folder搬家時的困擾。

Please follow and like us:
Powershell : Run as Administrator from command.

Powershell : Run as Administrator from command.

如果你想要從Command(命令提示字元)直接執行Powershell然後使用管理員模式,你必須使用下列方式執行Command (命令提示字元) 。

下方的命令是打在Dos Command裡。


1
Powershell -Command Start-Process powershell -ArgumentList '-File C:\ABC.ps1' -Verb runAs

原理上是透過命提示字元(一般身分)先呼叫Powershell.exe(一般身分)去執行Powershell(管理員身分)來跑 ABC.PS1程序
圖解大概是這樣子:
Command > Powershell.exe > Powershell – file ABC.ps1

以前搞不懂怎麼弄的時候常常要用一個Bat + PS1 + PS1(Admin)三個檔案來湊成一組功能,也比較不好維護,現在這方式可以把中繼的PS1拿掉,只要Bat+PS1(Admin)就可以完成任務了。

Please follow and like us:
PowerShell : 印表機管理(增/刪/設定)

PowerShell : 印表機管理(增/刪/設定)

在以前的批次檔年代,實在太難利用它來做印表機的管理了。
有了PowerShell,想一次利用PS來大量佈署重複的印表機,或是一次想增刪多部印表機真的方便又快速。在這裡稍微說明一下。

印表機的安裝大致上分成:驅動程式>Port>印表機。
利用PowerShell新增印表機,一定要按照上面的順序做
pnputil.exe – 驅動程式
Add-PrinterDriver – 驅動程式
Add-PrinterPort – Port
Add-Printer – 印表機
所以,在辦公室要用指令安裝印表機大致上會非常兩種
1.透過印表機伺服器來安裝/列印
2.電腦直連印表機(USB/Ethernet)

無論你是透過哪一種方式使用印表機,你想用PS來新增印表機之前,你的電腦都必要先有驅動程式。它分為兩階段。我以HP Universal Printing PCL 6 為例
Driver Name必須要一字不差用””包起來。Driver可以從印表機的伺服器內印表機的伺服器內容裡看到。(前提是你要有裝過)

要新增Driver分兩階段。
第一階段是把印表機驅動新增到Windows Driver Store裡面。用的是pnputil.exe 的程式。後面下參數/add-driver和驅動程式路徑、/install,即可新增並安裝。


1
pnputil /add-driver "D:\Tools\HPUPD6.6.5\pcl6-x64-6.6.5.23510\*.inf" /install

第二階段是把剛剛新增驅動程式新增到印表機的伺服器驅動程式裡方便使用


1
Add-PrinterDriver -Name "HP Universal Printing PCL 6 (v6.6.5)"

驅動程式作業完成之後,就可以來新增印表機了。
如前述,先講第一種透過印表機伺服器的方式來安裝印表機
直接使用Add-Printer 加上ConnectionName即可。如果Server上的驅動和你已經安裝過的驅動相同就會直接套用你現有的。


1
Add-Printer -ConnectionName "\\10.0.0.1\HPLaserJet C300DN"

如果有錯誤找不到驅動,請自行加上 -DriverName參數


1
Add-Printer -ConnectionName "\\10.0.0.1\HPLaserJet M607" -DriverName "HP Universal Printing PCL 6 (v6.6.5)"

這種效果就如同你透過網路找到印表機伺服器之後直接點兩下來安裝印表機

再來就是透過Local Port或是TCP/IP的方式來安裝印表機。這種則必須先建立好PrinterPort再新增印表機,Add-PrinterPort需要Name參數指定名稱,-PrinterHostAddress指定印表機IP位址是直連印表機的。


1
Add-PrinterPort -Name "ABC001" -PrinterHostAddress "10.0.0.10"

再來就是利用Add-Printer來新增印表機,使用Name印表機名稱、PortName指定剛剛新增的Port、DriverName指定前面剛剛新增的驅動程式、Comment則可有可無,裡面可以放註解說明


1
Add-Printer -Name "HP LaserJet M607" -PortName ABC001 -DriverName "HP Universal Printing PCL 6 (v6.6.5)" -Comment "ABC001"

如此一來就可以透過PowerShell來一次新增很多印表機(例如Server上)

不過如果你有指定印表機的紙匣/顏色/紙張Size還是必須透過圖形介面去調整。
我猜測也可以透過變更機碼方式來直接修改,不過那個比較複雜下次再研究吧!

如果印表機變更IP,也很容易可以快速替換。首先要確定印表機沒有列印工作正在執行。依照下面的順序來執行,新增Printer Port,修改Printer裡面PrinterPort的設定,然後把舊的PrinterPort移除。


1
2
3
Add-PrinterPort -Name XYZ001 -PrintHostAddress "10.0.0.100"
Set-Printer -Name "HP LaserJet M607" -PortName XYZ001
Remove-PrinterPort -Name ABC001

最後是移除印表機的部分,順序與安裝印表機相反。
如果是移除連線到透過伺服器的連線的印表機下面的方式就可以直接移除。


1
Remove-Printer -Name \\10.0.0.1\ABC001

如果想連驅動程式一併移除 。執行下面的也可一併移除


1
Remove-PrinterDriver -Name "HP Universal Printing PCL 6 (v6.6.5)"

再來是說明移除直連的印表機
想移除的很乾淨,就是先移除Printer,移除PrinterPort,移除印表機驅動程式


1
2
3
Remove-Printer -Name "HP LaserJet M607"
Remove-PrinterPort -Name XYZ001
Remove-PrinterDriver -Name "HP Universal Printing PCL 6 (v6.6.5)"

最後說明,可以透過下面指令查詢目前的狀態


1
2
3
Get-Printer #查詢目前印表機
Get-PrinterPort #查詢所有安裝的印表機Port
Get-PrinterDriver #查詢所安裝的印表機驅動程式
Please follow and like us:
Using Powershell list File in Folder – exclude subfolder

Using Powershell list File in Folder – exclude subfolder

檔案清單-排除特定子目錄。

用的是Get-ChildItem指令,搭配自訂function。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$rootFolderPath = 'D:\Docs'
$excludeDirectories = ("Test1","Script");

function Exclude-Directories
{
    process
    {
        $allowThrough = $true
        foreach ($directoryToExclude in $excludeDirectories)
        {
            $directoryText = "*" + $directoryToExclude
            $childText = "*" + $directoryToExclude + "\*"
            if (($_.FullName -Like $directoryText -And $_.PsIsContainer) `
                -Or $_.FullName -Like $childText)
            {
                $allowThrough = $false
                break
            }
        }
        if ($allowThrough)
        {
            return $_
        }
    }
}

Clear-Host

Get-ChildItem $rootFolderPath -Recurse | Exclude-Directories

如此一來要List File的時候,就可以排除特定子目錄了

Please follow and like us:
Powershell Execution Policy

Powershell Execution Policy

當已經習慣使用Powershell來管理或設定電腦時,很容易卡到Powershell腳本執行原則的設定。

Powershell有下面數種Policy可以設定
Unrestricted——-任何腳本皆可以執行,但是網路下載的會出現警示。
RemoteSigned—-本機撰寫的可以執行,網際網路下載來的需要經過簽署。
AllSigned———–只允許受信任的發行的腳本可以執行
Restricted———-關閉腳本執行功能。這是預設值
Default
Bypass
Undefined

下面的指令可以查看現在的Powershell執行原則


1
Get-ExecutionPolicy

下面的指令可以設定執行原則(需要管理員權限)


1
Set-ExecutionPolicy RemoteSigned

先說一下問題來源,因為Windows 預設就是關閉腳本執行預設值,所以你把Set-ExecutionPolicy RemoteSigned寫成Powershell腳本檔然後直接執行是行不通的。因為系統就不准你執行。同時,這一段指令也是必須要系統管理員權限才能執行。所以如果我今天是在一般使用者環境更可不能直接執行。另外Powershell也因為安全策略問題,所以他也不太能從Share Folder直接執行,大部分的情況下都會被拒絕。

先前一直沒有時間仔細去思考簡化這一段,導致每台電腦設定之前還要手打這一段指令,今天突然想到搭配Command批次檔來一起處理不能用一鍵設定好執行原則的問題。

這一個小小的設定一共需要3個檔案,1個bat檔、2個PS1檔案
我的情境是,三個檔案都放在網路分享資料夾上。

由Bat檔做導入,下面的批次會從Share Folder複製需要的PS1檔案到本機來,並且執行PSexec.ps1,執行完成之後再刪除檔案,不要留垃圾在User電腦


1
2
3
4
5
6
REM==========PSExec.bat====================
copy \\192.168.1.1\share\psexec.ps1 c:\tools /Y
copy \\192.168.1.1\share\psexec_sub.ps1 c:\tools /Y
powershell c:\tools\PSexec.ps1
del c:\tools\psexec.ps1 /F
del c:\tools\psexec_sub.ps1 /F

執行子層的PS1檔案PSExec_sub.ps1加上後面的參數
-Verb runas >> 這是為了讓powershell跳出提升權限的輸入帳號密碼的視窗
-Wait >> 這是要讓Powershell等候這一行執行完成關閉後才能繼續往下執行,
因為如果跑太快會回到前面的Bat檔案接續執行把需要的PS1檔案都刪掉。


1
2
#============PSExec.ps1=================
Start-Process powershell C:\tools\PSExec_sub.ps1 -Verb runas -Wait

再來才是核心重點,設定腳本執行權限


1
2
#============PSExec_sub.ps1==============
Set-ExecutionPolicy RemoteSigned

雖然只是一個很簡單的設定指令,但是由於微軟為安全性設下的重重關卡,所以只好靠點小技巧去簡化它,讓我可以用滑鼠雙擊就完成要打一串指令的麻煩。

======更新======
經過測試,在完全沒有手動執行過指令的,無法使用這個方式來變更Policy
第一次,至少必須用管理員執行Powershell,輸入


1
Set-ExecutionPolicy RemoteSigned

之後才能用script做調整設定。
如果還有找到新方式我會在此更新。

Please follow and like us:
經由指令方式使用相容模式來執行應用程式

經由指令方式使用相容模式來執行應用程式

這篇會出現的原因,是因為Skype v7 即將於2018/9/1終止支援。我們公司目前在Win7/10裝的都是Skype 7 Classic的版本。

誠如早先之前文章所說,公司使用Windows 10 2016 LTSB版本(無Microsoft Store),這版本正常來說要安裝在Windows 10是必須經由Microsoft Store來下載及安裝。

但是之前發現經由管理員帳號調整相容模式至Windows 8就能夠安裝了。所以我必須更動我的裝機批次。

研究之後,在盡可能減少人為操作之下,我必須在機碼裡面新增該執行的位置以及指定相容模式的參數。

這邊我說明一下,一般的方式都是在執行檔內容裡面修改相容性。如下圖

所以只要透過指令碼(Batch or PowerShell)把機把加進去即可

如果是全域使用者HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

如果是個別使用者HKCU:\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

 

所以我的方式是使用PowerShell加入機碼位於全域使用者。

New-ItemProperty -Path “HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers” -Name “XXXXXXX\SkypeSetupFull.exe” -Value “WIN8RTM” -PropertyType “String” -Force

執行完安裝程式之後,不要在機碼留垃圾。刪除之

Remove-ItemProperty -Path “HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers” -Name “XXXXXXX\Skype_All\SkypeSetupFull.exe”

這樣就可以順利達成我的目的地了

下面增列參數,相容系統模式

描述
Windows 8 WIN8RTM
Windows 7 WIN7RTM
Windows Vista SP2 VISTASP2
Windows Vista SP1 VISTASP1
Windows Vista VISTARTM
Windows XP SP3 WINXPSP3
Windows XP SP2 WINXPSP2
Windows 98 WIN98
Windows 95 WIN95

顯示設定

描述
8-bit (256) Color Mode 256COLOR
16-bit (65536) Color Mode 16BITCOLOR
640 x 480 Screen Resolution 640X480
Disable Display Scaling on High DPI Settings HIGHDPIAWARE

系統管理員執行

描述
Run Program as Administrator RUNASADMIN
Please follow and like us: