Hyper-v Tips

1.Hyper-v 中虚拟机可用的几个动作(actions)的区别

    • Pause (暂停)这个动作不会释放VM内存,但是会释放VM的对Processor的使用
    • save (保存)同时释放Vm内存和CPU占用,把当前状态写入到磁盘,并停止虚拟机

2.Hyper-v 从VM中导入虚拟机时(通过Vmdk2vhd工具),注意如果Vm中使用的是SCSI格式的硬盘在Hyper-v中启动不了,而且会蓝屏,原因在于Hyper-v中不支持从Scsi硬盘中启动,老外有篇文章说在从Vmdk2VHD工具转换之前,现在VM的虚拟机中加入一个IDE的硬盘,这个硬盘可以很小,然后启动该虚拟机,在设备管理器中initial 下这个磁盘,然后关闭虚拟机,删除这个IDE磁盘,再转换成VHD就不会,可惜我这里没有成功过。

3.Hyper-v 可以使用powershell 来通过WMI来对虚拟机进行操作,因此对于测试人员,以及可能需要自动化虚拟机的人员来说,这是个好消息,目前http://pshyperv.codeplex.com 有一个比较成熟的的Hyper-v 通过powershell 管理的Library,试用了下不错。

发表在 未分类 | 留下评论

Hello world!

Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!

发表在 未分类 | 一条评论

如何批量导出Powerpoint To PDF 文件 How to export all ppt files in a folder to pdf by powershell

最近有个需要要导出很多PPT,PPTx文件为PDF,因为我的手机不支持查看ppt,但是查看PDF很方面,可以进行PDF上的文字搜索等等。但是手动另存为PDF也是一个很累人的活,为了图方便,查阅了相应文档,写出了下面一个简单的powershell script

关于导出类型,导出PDF的值常量为32,其他导出类型见下面MSDN http://msdn.microsoft.com/en-us/library/bb251061(office.12).aspx

param(
    [string]$folder=$(throw("Input the path of folder which contains ppt to export to pdf "))
)

function ExportToPDF($path){
    $newname=$path -replace "\.[^.]*$",".pdf"
    "exporting $path to $newname "
    if(-not (Test-Path $newname)){
        $b= $a.Presentations.open($path)
        $b.SaveAs($newname,32)
        $b.close()
    }
}

while( -not (Test-Path $folder)){
    $folder=Read-Host -Prompt "input folder path:"
}

    Add-type -AssemblyName office
    Add-Type -AssemblyName microsoft.office.interop.powerpoint
    $a= New-Object -ComObject powerpoint.application
    $a.Visible=[Microsoft.Office.Core.MsoTriState]::msoTrue
    Get-ChildItem -Path $folder  -Include "*.ppt", "*.pptx" -Recurse |%{
        exporttopdf $_.fullname
    }

$a.quit()
$a = $null
$b= $null
Remove-Variable "a" -Force
Remove-Variable "b" -Force
[gc]::collect()
[gc]::WaitForPendingFinalizers()

发表在 powershell | 留下评论

IE 新开窗口最大化终极解决方法。 The end way to maximize Internet Explorer On Opening

 

下载该文件解决此问题:

最近收到一位朋友的抱怨,问我知道如何让IE打开后都是最大化的,我说简单啊,建立个快捷方式,设置快捷方式的打开窗口模式为最大化就可以了,结果人家说的不是这个意思,人家的意思是不但第一次打开IE窗口是最大化的,从IE窗口中的网页链接打开也要最大化的,我当时想这个IE窗口不是记忆最后一次窗口打开的尺寸么,难道这个新开的链接的窗口模式跟其他的不同,结果在自己机器上一实验确实存在这个问题,于是找IE的组策略设置,希望能够发现有用的东西,却发现找不到这样的设定,而通过搜索引擎搜索的结果,大部分都是玄乎的东西,什么先重置Window_placement 注册表的值,再打开IE调整窗口大小,还要按住什么ALT+Close按钮,我操作了很多次,发现虽然有时可以调整新打开的IE窗口的大小,但是要看运气的…所以我想还是自力更生吧,windows 的东西基本都是注册表的配置嘛,首先同步了下live.sysinternals.com 的tools,拿出procmon开始监视注册表,说真的这个IE的注册表改动多啊,监视了半天还是把最后的注意力放在了window_placement这个注册表上面,我的直觉发现,这个东东的不同数值控制了IE窗口的显示。

经过长达4-5个小时的努力,还有不停的实验,还有方便实用的powershell的分析,包括十六进制十进制互转,字符串操作,终于让我找到了window_placement的工作方式,我们可以只通过一个注册表导入,即可解决IE窗口的这个问题。

1.首先来看看我的终极注册表

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main]

"Window_Placement"=hex:2c,00,00,00,02,00,00,00,03,00,00,00,ff,ff,ff,ff,ff,ff,\
  ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,00,00,00,00,00,00,00,00,00,09,00,00,00,07,00,\
  00

参考了http://msdn.microsoft.com/en-us/library/ms632611(VS.85).aspx

typedef struct tagWINDOWPLACEMENT {
  UINT  length;
  UINT  flags;
  UINT  showCmd;
  POINT ptMinPosition;
  POINT ptMaxPosition;
  RECT  rcNormalPosition;
} WINDOWPLACEMENT, *PWINDOWPLACEMENT, *LPWINDOWPLACEMENT;

FLAGS有三种:
WPF_ASYNCWINDOWPLACEMENT    0x0004
WPF_RESTORETOMAXIMIZED        0x0002
WPF_SETMINPOSITION        0x0001
showCmd 有下面几种:
SW_HIDE 0    Hides the window and activates another window.
SW_MAXIMIZE 3    Maximizes the specified window
SW_MINIMIZE 6    Minimizes the specified window and activates the next top-level window in the z-order
SW_RESTORE  9    Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when restoring a minimized window     
SW_SHOW     5    Activates the window and displays it in its current size and position
SW_SHOWMAXIMIZED 3    Activates the window and displays it as a maximized window
SW_SHOWMINIMIZED 2    Activates the window and displays it as a minimized window
SW_SHOWMINNOACTIVE 7    Displays the window as a minimized window. This value is similar to SW_SHOWMINIMIZED,
except the window is not activated.
SW_SHOWNA 8
SW_SHOWNOACTIVATE 4
SW_SHOWNORMAL 1       
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Window_Placement 的键值的秘密:

window_placement的十六进制数值每四位代表一个数据,而且数据的顺序是反向的,如2c,00,00,00 代表0x0000002c ,十进制就是44,
44是什么意思呢,代表这个windows_Placement的长度是44,不信你可以数数有多个逗号分隔的数据。

因此我们这里可以分析出,前四位2c,00,00,00 这个数一直是不变的,也就是数据位数一直都是44
接下来的02,00,00,00 是一个数据,这个十六进制是0x00000002 十进制是2,应该代表上面结构中的flags ,值2 代表WPF_RESTORETOMAXIMIZED   
再接下来的03,00,00,00 是一个数据,十六进制是0x00000003 十进制是3,代表whowcmd 值3代表SW_MAXIMIZE
接下来的所有ff代表分隔符,没有意义的。
接下来的数据也是每四位代表一个数据
第一个00,00,00,00 十六进制0x00000000 代表打开的新窗口的左上角x坐标是0
第二个00,00,00,00 十六进制0x00000000 代表打开的新窗口的左上角y坐标是0
第三个00,05,00,00 十六进制0x00000500 代表打开的新窗口的右下角x坐标是1280
第四个20,30,00,00 十六进制0x00000320 代表打开的新窗口的右下角y坐标是800

最后两个坐标位置跟自己的显示器分辨率对应,当然实际上你设置此值之后,因为IE最大化的时候,还有任务栏窗口占了一个位置,所以右下角的坐标位置其实不一定等于我们的分辨率值,一般会小,这个你设置注册表后,打开IE后,其会自动调整这个值为合适的大小。

总结上面的经验我们有二个经验总结:

  1. IE新开窗口最大化实际上由计算机的分辨率大小决定,特别是最后的四个坐标值,其中前两个左上角点的坐标值我们只需取0.0即可,但是后面两个坐标值的取值要根据屏幕分辨率大小和桌面工作栏窗口的大小决定,所以这是一个难点。
  2. 我后来发现,如果你设置最后两个坐标值的数值超过你的分辨率大小或者说IE最大化时,窗口右下角的坐标位置数值的时候,WIndows 会自动调整这个数值为一个最合适的值(这个动作在你打开新的IE窗口时完成)

有了上面二个经验,我们的IE窗口最大化的解决方法就明确了

1.构建一个分辨率超大的数值的来填写window_placement的注册表值,关闭所有IE窗口,然后导入该注册表(反正windows 会自动调整)

2.再次打开IE,这个时候顺便检查下注册表是否起了作用,关闭IE(其实我们的真实目的是借此机会,让windows 在注册表里自动修改调整坐标位置)

发表在 疑难杂症 | 留下评论

IE 新开窗口最大化终极解决方法。 The end way to maximize Internet Explorer On Opening

 

下载该文件解决此问题:

最近收到一位朋友的抱怨,问我知道如何让IE打开后都是最大化的,我说简单啊,建立个快捷方式,设置快捷方式的打开窗口模式为最大化就可以了,结果人家说的不是这个意思,人家的意思是不但第一次打开IE窗口是最大化的,从IE窗口中的网页链接打开也要最大化的,我当时想这个IE窗口不是记忆最后一次窗口打开的尺寸么,难道这个新开的链接的窗口模式跟其他的不同,结果在自己机器上一实验确实存在这个问题,于是找IE的组策略设置,希望能够发现有用的东西,却发现找不到这样的设定,而通过搜索引擎搜索的结果,大部分都是玄乎的东西,什么先重置Window_placement 注册表的值,再打开IE调整窗口大小,还要按住什么ALT+Close按钮,我操作了很多次,发现虽然有时可以调整新打开的IE窗口的大小,但是要看运气的…所以我想还是自力更生吧,windows 的东西基本都是注册表的配置嘛,首先同步了下live.sysinternals.com 的tools,拿出procmon开始监视注册表,说真的这个IE的注册表改动多啊,监视了半天还是把最后的注意力放在了window_placement这个注册表上面,我的直觉发现,这个东东的不同数值控制了IE窗口的显示。

经过长达4-5个小时的努力,还有不停的实验,还有方便实用的powershell的分析,包括十六进制十进制互转,字符串操作,终于让我找到了window_placement的工作方式,我们可以只通过一个注册表导入,即可解决IE窗口的这个问题。

1.首先来看看我的终极注册表

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main]

"Window_Placement"=hex:2c,00,00,00,02,00,00,00,03,00,00,00,ff,ff,ff,ff,ff,ff,\
  ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,00,00,00,00,00,00,00,00,00,09,00,00,00,07,00,\
  00

参考了http://msdn.microsoft.com/en-us/library/ms632611(VS.85).aspx

typedef struct tagWINDOWPLACEMENT {
  UINT  length;
  UINT  flags;
  UINT  showCmd;
  POINT ptMinPosition;
  POINT ptMaxPosition;
  RECT  rcNormalPosition;
} WINDOWPLACEMENT, *PWINDOWPLACEMENT, *LPWINDOWPLACEMENT;

FLAGS有三种:
WPF_ASYNCWINDOWPLACEMENT    0x0004
WPF_RESTORETOMAXIMIZED        0x0002
WPF_SETMINPOSITION        0x0001
showCmd 有下面几种:
SW_HIDE 0    Hides the window and activates another window.
SW_MAXIMIZE 3    Maximizes the specified window
SW_MINIMIZE 6    Minimizes the specified window and activates the next top-level window in the z-order
SW_RESTORE  9    Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when restoring a minimized window     
SW_SHOW     5    Activates the window and displays it in its current size and position
SW_SHOWMAXIMIZED 3    Activates the window and displays it as a maximized window
SW_SHOWMINIMIZED 2    Activates the window and displays it as a minimized window
SW_SHOWMINNOACTIVE 7    Displays the window as a minimized window. This value is similar to SW_SHOWMINIMIZED,
except the window is not activated.
SW_SHOWNA 8
SW_SHOWNOACTIVATE 4
SW_SHOWNORMAL 1       
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Window_Placement 的键值的秘密:

window_placement的十六进制数值每四位代表一个数据,而且数据的顺序是反向的,如2c,00,00,00 代表0x0000002c ,十进制就是44,
44是什么意思呢,代表这个windows_Placement的长度是44,不信你可以数数有多个逗号分隔的数据。

因此我们这里可以分析出,前四位2c,00,00,00 这个数一直是不变的,也就是数据位数一直都是44
接下来的02,00,00,00 是一个数据,这个十六进制是0x00000002 十进制是2,应该代表上面结构中的flags ,值2 代表WPF_RESTORETOMAXIMIZED   
再接下来的03,00,00,00 是一个数据,十六进制是0x00000003 十进制是3,代表whowcmd 值3代表SW_MAXIMIZE
接下来的所有ff代表分隔符,没有意义的。
接下来的数据也是每四位代表一个数据
第一个00,00,00,00 十六进制0x00000000 代表打开的新窗口的左上角x坐标是0
第二个00,00,00,00 十六进制0x00000000 代表打开的新窗口的左上角y坐标是0
第三个00,05,00,00 十六进制0x00000500 代表打开的新窗口的右下角x坐标是1280
第四个20,30,00,00 十六进制0x00000320 代表打开的新窗口的右下角y坐标是800

最后两个坐标位置跟自己的显示器分辨率对应,当然实际上你设置此值之后,因为IE最大化的时候,还有任务栏窗口占了一个位置,所以右下角的坐标位置其实不一定等于我们的分辨率值,一般会小,这个你设置注册表后,打开IE后,其会自动调整这个值为合适的大小。

总结上面的经验我们有二个经验总结:

  1. IE新开窗口最大化实际上由计算机的分辨率大小决定,特别是最后的四个坐标值,其中前两个左上角点的坐标值我们只需取0.0即可,但是后面两个坐标值的取值要根据屏幕分辨率大小和桌面工作栏窗口的大小决定,所以这是一个难点。
  2. 我后来发现,如果你设置最后两个坐标值的数值超过你的分辨率大小或者说IE最大化时,窗口右下角的坐标位置数值的时候,WIndows 会自动调整这个数值为一个最合适的值(这个动作在你打开新的IE窗口时完成)

有了上面二个经验,我们的IE窗口最大化的解决方法就明确了

1.构建一个分辨率超大的数值的来填写window_placement的注册表值,关闭所有IE窗口,然后导入该注册表(反正windows 会自动调整)

2.再次打开IE,这个时候顺便检查下注册表是否起了作用,关闭IE(其实我们的真实目的是借此机会,让windows 在注册表里自动修改调整坐标位置)

发表在 疑难杂症 | 留下评论

使用正则表示式去掉文本文件中的中文

中文的正则表达式为[\u4e00-\u9fa5] 因为中文是用unicode表示的,每个中文两个字节表示,中文字符的编码范围在这个范围内。

下面我使用powershell 结合正则去掉文本文件中的中文信息。

PS desktop:\> $a
appeal, compel, compulsion, compulsory, propel, pulse, impulse
alter改变;aptitude能力;disastrous灾难的;banish放逐; combat战斗;calculate推算;excavate挖掘;accelerate加速;certify
证明; coincide, concur同时发生;circulate循环,流通;declination倾斜,下垂;discord不和;durability耐久性;equilibrium
平衡,均势; diffident缺乏自信的;domain领地; infinity无限性;afflict使苦恼,折磨;formulate构思,规划;fortify, reinfor
ce加强; frigid寒冷的;fuse熔化,融合;geometry几何;congest拥塞,充满;degrade降级,堕落;heredity遗传;hinder阻碍;hyd
raulics水利学;transit转移;junction连接点;collaborate合作;elapse流逝; latitude纬度;alleviate减轻; magnify放大;mani
pulate操纵;submerge/immerse沉没;symmetry对称; eminent杰出的;negligible可以忽略的;notorious臭名昭著的;optimum最佳条
件, demography

PS desktop:\> $a -replace ‘[\u4e00-\u9fa5]’ ,""
appeal, compel, compulsion, compulsory, propel, pulse, impulse
alter;aptitude;disastrous;banish; combat;calculate;excavate;accelerate;certify; coincide, concur;circulate,;d
eclination,;discord;durability;equilibrium,; diffident;domain; infinity;afflict,;formulate,;fortify, reinfor
ce; frigid;fuse,;geometry;congest,;degrade,;heredity;hinder;hydraulics;transit;junction;collaborate;elaps
e; latitude;alleviate; magnify;manipulate;submerge/immerse;symmetry; eminent;negligible;notorious;optimum, demog
raphy

发表在 powershell | 留下评论

发布两个Autoit写的小工具

1.截屏幕的,书写目的是因为工作环境中似乎对PrintScreen键进行了限制,按了很久FN+printScrren 键都没有反应,郁闷了一阵觉得还不如自己动手,记得Autoit中有这样的自定义函数的,查了帮助,用了5分钟,程序做成了,只能截全屏幕的图,截好后直接调用Mspaint(画图程序)打开截图。可以把其放置在快速启动菜单里面,想截图的话就点击一下,跟人觉得很方便,不过要更多功能就没有。

http://cid-0e9d4b3dce266c1b.skydrive.live.com/embedicon.aspx/Public/CaptureScreen.rar

源代码如下:只有4行代码,哈哈

#NoTrayIcon
#include <ScreenCapture.au3>
#Include <File.au3>

$filename=_TempFile(@TempDir, "cap_", ".jpg")
_ScreenCapture_Capture( $filename)
ShellExecuteWait("mspaint.exe",$filename)
FileDelete($filename)

 

2.最近在鼓捣MDT2010,微软搞个东东就涉及很多东西,一个大部分用脚本实现的东西,还搞了一个很大的框架,不过不得不佩服其架构的能力,为了书写MDT的自定义脚本,往往要书写自定义的WSF文件,这个文件在MDT中有固定的框架的,所以借助windows 的功能,在空白处点击右键,会弹出新建菜单,比如新建txt文件,其实一些文件我们也可以做成模板,然后修改下系统的一些参数,就可以集成在右键的新建菜单项中,现在我建立一个自定义的MDT脚本,只需要右键新建一个再编辑就可以了,节省了很多时间。

源代码如下:也没有几行,/install参数进行安装 /Uninstall进行卸载 http://cid-0e9d4b3dce266c1b.skydrive.live.com/embedicon.aspx/Public/MDTscriptTemplate.rar

#NoTrayIcon
#RequireAdmin
; Script Start – Add your code below here
if $cmdline[0]>=1 then
  $input=StringUpper($CmdLine[1])
else
  $input="/HELP"
endif

if($input="HELP" or $input="/?" or $input="/HELP") Then
    ConsoleWrite("Usage: " & @scriptname & " /install   进行安装"& @CRLF)
    consoleWrite("       " & @scriptname & " /Uninstall 进行卸载")
ElseIf($input="INSTALL" or $input="/INSTALL") then
    FileInstall("Z-Sample.wsf",@WindowsDir & "\shellnew\z-sample.wsf")
    RegWrite("HKCR\.wsf\ShellNew","FileName","REG_SZ", "Z-Sample.wsf")
elseif($input="UNINSTALL" or $input="/UNINSTALL") then
    if(FileExists(@WindowsDir &"\Shellnew\z-sample.wsf")) Then
        FileDelete(@WindowsDir  &"\Shellnew\z-sample.wsf")
    EndIf
    RegDelete("HKCR\.wsf\ShellNew")
EndIf

RunWait("rundll32.exe user32.dll, UpdatePerUserSystemParameters")

发表在 Desktop Deployment | 一条评论

使用Powergui来扩展自己的IT工具箱

近期源于工作上的需要,一直想做个图形化的扩展程序来对自己公司使用的Notes电子流系统进行扩展,以添加一些自己常用的功能,而且想在扩展时能够快速构建应用程序,比如想实现对显示的数据列进行筛选啊,排序啊,还有对一些数据项进行一些自定义的操作,曾经用过脚本来自动化一些功能,但是没有图形界面,每次敲命令行,有些需要交互的东西在命令行下还是不太方面。因此要满足自己的需求,所用的工具应该包括,有统一的界面和模式,容易扩展和修改,自带了一些常规的功能操作。比如对显示的数据进行排序,过滤,这些应该是程序本身提供的,而不是我要去书写的,要支持快速部署,版本控制功能。

先后考虑过使用高级语言,或者类似Eclipse进行插件开发等等,发现这些功能的扩展非常麻烦。由于自己经常使用PowerGui的脚本编辑器来编辑和调试powershell脚本(说真的,这个编辑器实在是非常好用,带语法高亮,Intelligense,还有很强的调试功能,多语言界面等等)因此自己对powegui的控制台,一个图形界面的控制台多少有点熟悉,PowerGUi的控制台提供了类似MMC3.0的界面,左边是功能树,中间显示数据,右边是一些常规的操作,PowerGUi的功能靠PowerPack进行扩展,而Powerpack 由一些列powershell脚本构成,默认情况下Powergui已经附带了很多常用的Powergui,而且其网站上也有一个专门的板块来放置网友写好的POwergui,我们可以直接拿来使用,由此增强了powerGui的扩展功能。(注意本篇介绍的软件全部是免费软件)

在开始之前建议你先观看这个视频,如何创建powerPack

1.先来看看Powergui的主界面,虽然界面非常简单,但是并不代表着其功能很弱,我们可以看到左边PowerGui节点下的Local System节点显示了很多的功能节点,通过这些节点可以管理进程、服务、日志、事件日志、网络配置、本地磁盘、共享、用户和组、还有开发人员会用到的WMI Browser,而这些功能实际上是通过一个Powerpack完成的,而且右边的操作栏中非常类似于MMC,但是有一点你要记住MMC中的操作项是固定死的,而在PowerGui中,只要你有创意,你可以扩展任意多个你想要的操作。

image 

2.看到这一步,你可能会问,讲了半天,到底怎么进行扩展啊?哈哈,PowerGUI 的每个节点和操作项目其实都是一个脚本块或者脚本操作。

我在左边的Drivers节点上点击右键,选择属性,你可以看到这里隐藏了该节点操作的powershell脚本 (虽然我这里只演示了左边节点,但是右边操作项也是同样由脚本块构成的,你可以自己尝试下看看他的属性)

image

或许你现在已经开始尝试Powergui,你可能看到下面的界面(当你点击Drivers节点时,你发现Drivers节点下多出了很多子节点,如果你是个细心的人,你会记住我前面说过,PowerGui的每个节点都是一个脚本块,所以这个时候你可能会问,我难道要写很多这样的脚本快么?哈哈,肯定不用,在Powergui 中你可以创建动态的节点,自动生成子节点的代码块)

image

3.探索下PowerGUI的中间部分的窗口,数据窗口,PowerGui的数据窗口上层是个筛选器,等下我们进行介绍,(如果你想使用筛选,点击它,会弹出添加设置筛选条件的区域)我们先看数据显示部分,数据显示由很多的列组成,每个列名其实是我们要显示的数据项的属性名称,如果你已经了解PowerShell,你肯定知道在powerShell中一切都是对象,对象包含属性和动作,而数据列显示的每一行,代表一个对象,每一列代表对象的每个属性,在PowerGUI的数据窗口中,你可以选择哪些列要实现,哪些不需要显示,更改方法为在列名上点右键,选择要显示的列即可(这些列的显示操作PowerGui会记忆住)

image  image

看看PowerShell的筛选器,属性列中可以从现有的所有属性列表中进行选择,包括显示的列和没有显示的,而操作符号我们看到有很多的选项可以使用,当设置好筛选条件后,点击应用,即可过滤出想要的内容。如果你细心的话,你会发现有个另存为的按钮,点击另存为按钮后,Powergui 会自动给你创建好一个筛选函数的代码,你只需要对筛选器起个好记得名称。

image

 

下面是保存的的筛选条件的截图,其显示在现有的节点下面,旁边有个漏斗型的图标

image

下面我详细谈谈右边操作窗格的东西(隐藏在里面的东西),如果你尝试现在右边创建一个操作(操作分为操作和脚本操作,两者的区别是一个是使用powershell自带的命令进行操作,另外一个是自定义脚本)操作,如下图

image

你会看到可以更改图标(浏览选择一个ICo文件来定义操作显示的图标)

还有一个显示设置,点击后显示下面的内容(事情有点复杂了),第一个地方是关联类型,这个地方是干什么用的呢?由于Powershell中都是处理对象,所以当我们建立一些操作的时候,某些操作可能只是针对某种类型的对象进行的,所以我们有时会需要只针对某种类型的数据显示此操作项,当有这个需求时 ,你可以在这里限定类型(有点像Sharepiont中的target audience的功能了 ,就是针对不同的用户显示不同的内容,我们这里是针对不同的数据显示不同的操作菜单)

image

下面谈谈类别,这个我觉得好理解,就是把操作分成多个类别,比如上图中的那个Actions:Common类别,里面包含一系列常用的操作,包括导出到XML,导出到CSV,HTMl等,就是把操作分组的功能。

选择对象中的两个不同的含义,需要选择对象的时候,你可以选择所有对象,或者某一个对象,然后选择相应的操作,而这些操作也只针对于你选择的对象,如果使用操作无需选中对象,那么不管你是否选择数据,操作时的对象都是全部数据。

显示结果,这个可是最重要的地方,新使用Powergui进行扩展的时候,你可能不会太注意这个地方,但是这个地方的设置最影响你的数据显示和刷新

  1. 已原样保留当前视图 选中该项后,你对数据执行操作后,数据窗口的数据不刷新,你可能会问为什么不刷新啊,刷新多好啊。当然有时候要看操作后的最新数据时我们需要进行视图刷新,但是有些时候就是对数据进行其他的操作,比如导出到CSV,这个时候对显示的数据根本没有影响,所以刷新数据没有任何意义,而且有些刷新操作可能要运行很久的时候,选择刷新视图,将让你在很长的时候都在等待
  2. 刷新当前视图 这个是默认选项(不过可能很多操作你会需要更改这个地方)选择这个选项的时候我们的操作一般会对现有的显示的数据有所更改,而且我们需要及时看到这个更改,比如我们停止一个服务的操作,就需要在数据窗口中刷新服务的状态。
  3. 在嵌套视图中显示结果,这个选项会给每个操作显示一个节点,在数据窗口过滤器的上面,以前的操作也会有节点,你可以选择相应的节点,然后回到其他操作的数据显示(这个大家可以试验下,总之这个选项也会刷新视图数据)

关于更多,更少按钮,点击更多按钮后显示出下面被隐藏的部分,然后”<<更少”按钮显示出来,这个地方其实是PowerPacks部分值得我们注意,为什么呢,因为这里添加其它PowerPack的话,我们可以使用其它PowerPack中的功能,如其它PowerPack中可能定义了很多有用的函数,我们只需在这里添加其它POwerPack就可以在操作的脚本部分直接调用这些函数

image 

 

其他的一些Tips

  1. 如果你想在自己创建的powerGui中实现向用户提示输入,弹出对话框获得用户口令等操作,你可以使用Local system PowerPack中的很多函数。想查看这些函数,点击Local system 下的一个节点,如registry 节点,然后点右键,选择属性,选择已共享的脚本,选择Local System,会打开一个powerPack中共享的一个脚本,这个脚本通常用来定义常用的函数,全局变量等等如下图

image

我们可以看到LocalSystem PowerPack 中给我们提供了很多有用的函数,如密码,用户组操作,ADSI(AD操作) WMI操作,管理控制台的动态节点构建函数

image

2.如果你想实现更多的GUI窗口界面,你可以使用PrimalForms 工具来像在Visual Studio当中一样来设计GUI 界面,然后导出代码为PowerShell代码。关于如何下载他,你可以google下

3.多阅读Powershell的About_XXXX系列的Help,多看其中的例子,相信会解决很多问题。

4.很多代码可以使用别人写好的进行扩展,例如PoshCode网站,很多东西可以通过阅读现有的很多PowerPack中的代码来让自己得到启发,还有Script Center 的脚本库中也有很多实例还有代码可以使用。

发表在 powershell | 留下评论

Windows Deployment Guys 整站打包CHM 下载

以前就关注Windows Deployment Guys的blog网站,上面对桌面部署的操作和技术介绍了很多,尤其是对MDT的使用,以前只是感兴趣在实验环境中使用MDT进行部署,说实在的,完全使用MDT进行的部署还没有做过,不过只是借用了其中的自定义PE镜像的功能,然后在win环境下使用32 位ghost进行部署,使用PE 3.0的内置的分区命令行进行分区,还有WMI等进行硬件序列号查询,还有一些其他的技术,如离线修改注册表等等,作出了一个简单的依靠VBs还有一些bat搭建的一个简陋的部署系统,竟然也部署了100多台计算机,速度还挺快,主要是过程全是自动的,只需要接上网线按下power键,修改下启动是从网络启动即可,把键盘鼠标一拔,显示器也拔掉,后面的就全部自动的,装完后会自动关机,剩下就往仓库一甩,新员工直接发就可以了。

由于最近换了工作,到职听说可能要接手以前的BDD(商业桌面部署系统)而这个BDD系统也是公司自己进行了很大的定制化的,估计修改了很多脚本,因此开始研究MDT.以及BDD的一些机理,但是自己访问Windows Deployment Guys都是通过RSS订阅的,因为换计算机等原因,以前订阅的RSS项目没有积累下来,想找以前的文章还要跑到官方blog上去找,很麻烦,而且现有的工作环境当中,上网有诸多的限制,所以一直在想通过什么办法把这个网站上的所有网络日志download下,包括图片,评论等等,以前做过一个把Windows script Guys 上的几乎所有脚本系列使用离线下载整站的工具download 下来过,然后写脚本处理down下来的页面,整理成了一个CHm文件,这个chm当时做的很简洁漂亮,可惜放在我的笔记本里,笔记本丢了后就一直找不到了,好在最近在看powershell v2的视频,断断续续还是看得差不多了,只是缺乏实际应用来加深理解,于是拿了这个需求来写个脚本,自动download 所有blog页面,分析页面链接的图片,文件,然后download 下来,最后自动生成chm,需求定下来之后,当天已经可以把所有blog下下来,并且提取主要的信息,但是没有实现download 页面相关的图片,而且下载图片之后,还要修改原来页面的图片链接以使用本地的图片,然后在使用help workshop 进行chm 时,发现还要生成 hhp文件,还有hhc文件,甚至包括index文件,还有主页文件,调试修改了三天终于实现了。

http://cid-0e9d4b3dce266c1b.skydrive.live.com/embedicon.aspx/Public/DeployMentGuy2.chm

发表在 Desktop Deployment | 留下评论

The Case of the Printing Failture (找出打印错误的原因)

写在开头:从用过pstool之后,就对软件的作者报有很大的崇敬感,该软件的作者还写了sysinternals系列之后,并且该系列已经被微软收购,而软件作者Mark也到了微软。经常在webcast还有teched 大会上看到有Mark的身影。因此,知道Mark的博客地址之后,一直都在关注他发表的文章。在我的日常工作中,我觉得从他这里学习到了很多,不单单是技术方面,跟多是分析事情的思路和逻辑。以前也看过很多Mark的The case 系列,但是一直没有翻译出来过,翻译这个系列的想法也一直都有,但是总是时间不够(自己时间利用不太有效),今天冲动翻译一篇,这篇文章虽然涉及的技术性不是很强,但是给我们的思路很清晰,但问题出现时,如何去寻找蛛丝马迹,如何一步接一步排除其他干扰并且最终找到故障原因,另外故障解决的时候,我们会大松一口气,往往不会再去想更深层次的原因,这篇文章所描述的管理员却做到了。

我收到最有趣的案例是那些展示了独特的排错技巧,并找出根本原因的例子。我最近的一个这样的例子就是这样:刚开始管理员收到用户报告说他们不能从计算机上打印。用户只能看到一个对话框显示打印任务已经提交到打印队列当中,但是当点击打印窗口或者菜单项的时候,没有任何反应。

管理员首先做的事情是查找用户计算机的日志,寻找有关打印相关的日志,他很快发现有两个与用户打印操作尝试相关联的日志项

image    image

日志内容表明当用户尝试打印的时候,spooler服务启动但是一分钟之后终止,明显的由于意外的错误造成。但是问题是什么?

管理员因此拿出了Sysinternals Procdump。procdump 是一个可以产生进程崩溃转储的工具,转储在你指定的触发器被触发时进行。可用的触发器包括CPU使用率,虚拟内存使用率,未处理的意外、以及进程终止。例如你可以使用CPU使用率触发器,来让procdump程序监视某个程序,在其CPU使用率达到一定的闸值的时候,转储进程相关的数据,以找到原因。因此管理员猜想在意外终止的进程的堆栈跟踪里应该可以找到一些有用的信息。

管理员使用-e 选项然后跟上spooler进程的名称依然ProcDump程序在spooler相应的服务终止时进行程序转储。然后打开一个notepad,尝试在里面打印,结果这导致spooler服务终止,然后procDump监视到此事件触发,转储相应数据。

image

他使用Windbg打开了前面的转储文件,然后运行k 命令,这样windbg dump出崩溃进程的堆栈数据。堆栈数据列出了在崩溃之前调用的函数,下面的图显示出了在崩溃之前,打印程序调用了Ldr 函数,这些函数包含在LdrpLoadDll当中,

image

通过网络搜索得到结果表明LdrpLoadDll 是一个与系统Dll装载器相关的函数,因此怀疑,程序崩溃很可能是因为不能找到相应的DLL文件,或者装载了不正确的DLL文件。那么怎么证明这一猜想呢?管理员转向使用Process Monitor,这个工具可以让他看到进程DLL相关的文件系统操作活动。因此他打开Process Monitor 开始监视,然后打开记事本程序进行打印操作,在打印服务崩溃后,他停止了监视,然后在监视的结果中,他发现在程序崩溃之前,有很多访问打开系统中不同文件夹中LocalSpl.dll的不成功操作。

image

然后他猜想该LocalSpl.dll本来应该是存在的,为了证实这点,他到其他的XP系统上找到了localSpl.dll,这个文件是在系统的system32目录下面

image

当查看该DLl文件的相关描述的时候,可以看出这个dll是spooler服务依赖的组件,如果缺少,则spooler服务不能支持打印操作。因此他拷贝了该dll文件到有问题的计算机之上,结果问题解决

在此似乎问题可以结案了,但是管理员又考虑了另外一个层面,那就是为什么本来系统正常的DLL会丢失呢?通过网络搜索其他经历过同样故障的用户帖子,他找到了原因One post in particular,原来是第三方的打印和传真程序的卸载程序不正确的删除了Localspl.dll

image

发表在 疑难杂症 | 留下评论