Windows: 根据分组的本地TCP/IP打印机的安装(3)

一个改进:

原来的设计上有个缺陷,问题的出现是这样的:

在系统部署的初期,一般是电脑硬盘被格式化,然后把以wim格式存储的核心系统,恢复到硬盘,之后重新启动系统,自动登录到一个本地的管理员用户,安装所指定的软件,以及后期配置等等,这些都是可以在部署流程中定义并自动完成的,最后系统重新启动完成系统的最初部署,准备交付用户。而安装打印机的过程就是在安装软件的时候完成,因为 在这个时候,这个被被用来登录的本地管理员用户,可能有也可能没有访问域的权限,如果有,那么万事大吉;如果没有,那么原来设计中,使用诸如doamin/group或者doamin/user的格式,设置打印机存储权限的部分就会出现错误,从而无法完成制定的任务。

 

其实解决这个问题很简单,不过因为这方面接触少,而且钻了牛角尖,我走了一个弯路,因为以前使用SetACL来实现权限,所以就看他们文档,在forums里询问,当然是不得所以,后来想到使用runas, psexec等方式,但是问题是需要一个同时有本地管理员权限的域成员,而且Windows没有一个象Mac系统里面的,简单实现使用加密的方式传输密码,避免使用明码传输的命令行命令,而这样的安全隐患是不能接受的。后来看到了CPAU的第三方软件,它可以做到加密,但是已经很老了,2005的更新,有不知道Windows 7是否兼容,所以没有细看。后来看到微软自带的SubInAcl工具,不仅命令行的格式简单,易懂,而且也从他的文档中了解到,可以使用SID来代替文字格式,从而避免访问域,并且它也支持SID和名称的缓冲。经过测试,完全可行,可能SetACL也是可以使用这个方法,只不过没有实践检验。至此,上面的问题完美解决。

 

而文件格式需要修改:

1:Printer Configuration文件,为了好看,把最前面的字段,移到最后,因为SID很长,放在前面为了对齐,需要很多空格,把其它重要信息挤到了后面。

2:在程序中,把DenyGroup部分变更,并把各个IDX索引值变过来,就好了。

 

下面就把DenyGroup函数重新写一边,其实很简单:

 

Function DenyGroup (strPrinter, strSecurity)
   ' Const DenyGroup_LogID = "DenyGroup:"
   Const DenyGroup_LogID = "<DenyGroup>:"

   ' Build the command line.
   strCMD="subinacl.exe /noverbose /nostatistic /printer " & strPrinter & " /deny=" & strSecurity
wscript.echo "____" & strCMD
   Set WshShell = CreateObject("WScript.Shell")
   WshShell.Run strCMD, 6

 

   DenyGroup = 0  
   '
   strLogInfo = DenyGroup_LogID & "Group <" & strSecurity & "> has been set DENY using printer <" _
      & strPrinter & ">."
   myLog LOGLVL_Message, strLogInfo
End Function

 

 

下一步准备把它改写成VB。

 

Windows和*nix的一个使用感想:

以前使用VB,C,C++,#类的语言开发Windows的程序,后来使用脚本管理Mac系统,从管理角度来说,Windows先天的不足,脚本方面很弱,据说PowerShell的出现会好点,可是看了看,他的思路不是那么直接。

Windows的脚本里面大量使用类的封装和引用,看似简单,但是对于脚本来说,真的没有*nix本身来得的优势,它天生是为脚本设计的,使用每个命令的回馈,就可以掌握系统状态。所以,从管理员的角度说,还是*nix的系统简单、直观和有效。

 


原文链接: http://blog.csdn.net/afatgoat/article/details/6080059

你可能感兴趣的:(Windows: 根据分组的本地TCP/IP打印机的安装(3))