如何更为合理地管理公司文件服务器?
随着知识产权管理越来越重要的今天,公司文件服务器上均是购买的正版软件。但是,本公司去年年末,经历了一件事情:明明文件服务器放着某个正版软件,可是一些用户并没有找到或者其它原因,竟然安装了从网上下载的盗版AUTOCAD2008,然后再在局域网内传播安装程序,最终结果是:很快收到了autodesk公司正式向我公司发出的关于用户使用盗版软件的通知律师函。。。。。当然,因我上级单位集团公司是AUTOCAD厂家的战略合作商.盗版风波就很快过去了.......
如何杜绝此类事件的再次发生!行政管理很重要,如何从技术层面解决呢?同时也在这一个时期,认识接触了很多圈内的朋友,经常沟通中不经发现,竟然有好多友人公司都存在这个问题!并且坦言均是一块心病,这个问题就是:就是不想让用户私自安装文件服务器以外的任何软件!
公司是域环境,文件服务器上的工作用软件已绝对满足工作需要了,完全无需用户(公司用户全部是WINDOWS家族的操作系统)再去其它地方寻找安装工作软件,同时,有些软件必须要在管理员模式下才能运行,大多软件是可以运行在Power Users组下的权限下。如何来做一个整体的解决方案尤为重要!必竟我可不想,因前期考虑不周,最终影响到公司的业务运行!
与此同进度,一系列的问题均已浮现在眼前,也在困惑着我:
1.首先将每个用户的本地管理员组的域用户帐号降级为Power Users组;
2.文件服务器上的任何软件,均要让这些Power Users组域用户顺利运行安装!
3.建立响应机制,以应对用户个性化的需求,比如,某些特别岗位有时可能需安装文件服务器以外的软件。
经过一段时间的尝试,找到了一些可行的方法,与大家分享(若您有更多想法,请您告诉我!感谢!)
问题1: 用户权限降级的问题,我试着在网上漫游了一下,很多的解决方法。传送门1 传送门2 更多请自行去网上漫游.....(本问题不是本文阐述的重点)
问题2:企业文件服务器。可能传统意义上更多地会用FTP来做或者就是单纯的利用SERVER的NTFS特性来提供共享的使用与权限管理。但我们不得不面对:资源不找好,不直接。还有倘若将用户加入进POWER USERS组,软件安装上会受到影响. 直至某次去网吧(家里有网但我更喜欢那里的环境),我突发灵感。为什么不试着将其桌面上的那个游戏菜单经过改装移植至企业里去呢?经过实际,经过改良可以以企业管理员授过的任意权限来运行。那么以面向用户的GUI人性化的形势解决资源难找的问题是很不错的体验!好在,网上开源的文件服务器菜单工具也很好找,以管理员权限来运行,核心是:
- Global $adminname="localadmin" ;有权限运行的用户名
- Global $adminpassword="P@SSW0RD";用户名的密码
- Global $Domain="test.com.cn" ;公司域名
- Global $admin=1 ;初始状态,以留后用
- ;检测是否有管理员权限,若没有使用帐号:localadmin来执行
- If Not IsAdmin() Then
- $admin=RunAs($adminname,$Domain, $adminpassword,0,@AutoItExe)
- If $admin=0 Then Exit(MsgBox(16,"拒绝!","当前用户无管理员权限无法安装."))
- EndIf
问题3:百密终有一疏,对于一些个案用拿来的文件服务器上没有的工作软件,可以为他们定制授权的安装程序,守住管理员权限的阵地,核心:
- Global $adminname="localadmin" ;有权限运行的用户名
- Global $adminpassword="P@SSW0RD";用户名的密码
- Global $Domain="test.com.cn" ;公司域名
- $ver = FileGetVersion(@ScriptDir&"\setup.exe") ;获取用户的setup.exe的的版本信息
- If $ver ="3.0.81.0" Then
- ;当然若你还是不放心,还可以借助时间限制,文件字节大小来解决等。可自由发挥
- $time=@YEAR&@MON&@MDAY
- If $time<>"20100909" Then Exit(MsgBox(262144+16, "失败-请与管理员联系", "因管理员信息验证失败!"))
- ;若还是不放心,可借助当前登录的用户名来限制 不写了,根据需要发挥吧
- If @UserName<>"zhangsan" Then Exit(MsgBox(262144+16, "失败-请与管理员联系", "因管理员信息验证失败!"))
- ; Run a command prompt as the administrator.
- $pid = RunAs($adminname,$Domain, $adminpassword,0,@ScriptDir&"\setup.exe")
- ; Show a message.
- If $pid=0 Then Exit(MsgBox(262144+16, "失败-请与管理员联系", "因管理员信息验证失败!"))
- Else
- Exit(MsgBox(262144+16, "失败-请与管理员联系", "因管理员信息验证失败!"))
- EndIf
结合本文,略加修改,相信即可达到企业目的。
我们公司的(双击图标即可在线用管理员权限安装,右击图标,有多个功能可选,含拷贝程序包到本地):
以上准备好了,就可以通过组策略布置拷贝到每个用户的桌面上去了。>>>传送门
本博附件是网友水木子原版开源共享的AU3版的菜单(感谢水木子的开源). 这个版本不支持企业UNC路径。请修改源码中的如下位置:
- Func CreateGroup($hWnd, $iGroupID, $sHeader, $sText, $sImageFile, $nIcoID = -1);创建分组,参数1控件句柄、参数2分组ID、参数3分组标题
- ; If StringRegExp($sImageFile, '(?i)[a-z]:\\.+\.\w{3}') = 0 Then
- ; $sImageFile = 'shell32.dll'
- ; $nIcoID = 4
- ; EndIf
- GUICtrlCreateListViewItem($sText, $hWnd)
- If StringRegExp ($sImageFile, "(?s).msi\z") Then
- GUICtrlSetImage(-1, @AutoItExe, $nIcoID)
- Else
- GUICtrlSetImage(-1, $sImageFile, $nIcoID)
- EndIf
- $iNumber = _GUICtrlListView_GetCounterPage($hWnd) - 1;计算在可视区域中可垂直显示的项目数量
- _GUICtrlListView_EnableGroupView($hWnd);启用控件中的项目分组显示
- _GUICtrlListView_InsertGroup($hWnd, -1, $iGroupID, $sHeader & ' ');插入分组
- _GUICtrlListView_SetItemGroupID($hWnd, $iNumber, $iGroupID);设置项目分组编号
- EndFunc ;==>CreateGroup
还要联系本文一开始处谈到的以一定帐号权限运行的:
- Func RunProgram($nEvent)
- $iIndex = _GUICtrlListView_GetSelectedIndices($hListView[$iPage])
- If $iIndex <> '' Then
- $sItemText = _GUICtrlListView_GetItemText($hListView[$iPage], Number($iIndex))
- $aSoftPath = StringRegExp(FileRead($Path), $sItemText & '=(.+?)\r', 3)
- $aWorkPath = StringRegExp($aSoftPath[0], '(.+)\\', 3)
- If $nEvent = 1 Then
- If StringRegExp ($aSoftPath[0], "(?s).msi\z") Then
- If $admin=1 Then
- RunAs($adminname, $Domain, $adminpassword,0,"msiexec /package "&$aSoftPath[0])
- Else
- Run("msiexec /package "&$aSoftPath[0])
- EndIf
- Else
- If $admin=1 Then
- RunAs($adminname, $Domain, $adminpassword,0,$aSoftPath[0])
- Else
- Run($aSoftPath[0])
- EndIf
- EndIf
- EndIf
- If $nEvent = 2 Then
- $tmpcopyvar = FileSelectFolder("拷贝到:", "")
- If $tmpcopyvar <>"" Then
- _DirCopy($aWorkPath[0],$tmpcopyvar)
- MsgBox(262144,"提示","运行完毕")
- ShellExecute($tmpcopyvar)
- ;ShellExecute($aWorkPath[0])
- EndIf
- EndIf
- If $nEvent = 3 Then Return $sItemText
- EndIf
- EndFunc ;==>RunProgram
当然,您可以根据需要,改动更多,更加地符合企业的实际。若您有更好的方法欢迎一起讨探,感谢。