这个问题很简单,我很难找到答案。
服务器故障以前帮助过我找到一种不使用 WSUS 即可自动执行 Windows 更新的方法。它运行良好,但要通过网络运行它,您必须先安装共享驱动器。这在 XP 中非常简单,因为您只需安装驱动器并运行更新程序即可。
然而,在 Vista 和 W7 上,这一切都必须以提升的权限才能正常工作。UAC 帐户无法看到普通用户安装的网络驱动器,因此为了让一切正常,我必须通过升级net use
的 shell 安装共享。我想通过一个简单的 .bat 文件自动安装此共享并启动更新程序。
我可能只会指示每个人在 .bat 文件上右键单击“以管理员身份运行”,但我想尽可能保持简单,并让 .bat 自动提示用户提升他们的权限。
由于这些计算机不属于我们,我不能指望安装任何类似 Powershell 的东西,因此排除了任何类似的解决方案,并且几乎必须依赖 RTM Vista 安装中包含的东西。我希望我在这里主要忽略了一些显而易见的东西。:)
答案1
http://technet.microsoft.com/en-us/magazine/2007.06.utilityspotlight.aspx
编辑:如果您只向客户提供一个文件来运行,为什么不使用 WinRAR 创建自解压 RAR 并在 SFX 选项中设置“需要管理员”标志?这样可以免除您只能运行 1 个文件的限制,您可以拥有所需的所有资源。
或者使用您最喜欢的 SFX 工具制作您的 SFX 并使用上面的提升工具。
答案2
如果您准备转换为 PowerShell,这将更容易做到。这是我的“ Elevate-Process.ps1
”脚本(su
在我的配置文件中带有别名):
# Updated elevate function that does not need Elevate PowerToys
# From http://devhawk.net/2008/11/08/My+ElevateProcess+Script.aspx
$psi = new-object System.Diagnostics.ProcessStartInfo
$psi.Verb = "runas"
# If passed multiple commands, or one (that isn't a folder) then execute that command:
if (($args.Length -gt 1) -or (($args.length -eq 1) -and -not (test-path $args[0] -pathType Container))) {
$file, [string]$arguments = $args;
$psi.FileName = $file
$psi.Arguments = $arguments
[System.Diagnostics.Process]::Start($psi) | out-null
return
}
# If from console host, handle case of one argyment that is
# a folder, to start in that folder. Otherwise start in current folder.
if ($host.Name -eq 'ConsoleHost') {
$psi.FileName = (Get-Command -name "PowerShell").Definition
if ($args.length -eq 0) {
$psi.Arguments = "-NoExit -Command &{set-location '" + (get-location).Path + "'}"
} else {
$psi.Arguments = "-NoExit -Command &{set-location '" + (resolve-path $args[0]) + "'}"
}
[System.Diagnostics.Process]::Start($psi) | out-null
return
}
# Otherwise this is some other host (which cannot be assumed to take parameters).
# So simplely launch elevated.
$psi.FileName = [system.diagnostics.process]::getcurrentprocess().path
$psi.Arguments = ""
[System.Diagnostics.Process]::Start($psi) | out-null
也可以在 PSH 中检测是否升高(因此您可以检查是否升高,然后在需要时升高):
$wid=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$prp=new-object System.Security.Principal.WindowsPrincipal($wid)
$adm=[System.Security.Principal.WindowsBuiltInRole]::Administrator
$IsAdmin=$prp.IsInRole($adm)
if ($IsAdmin) {
$host.UI.RawUI.Foregroundcolor="Red"
write-host "`n** Elevated Session **`n" -foreground $_errorColour -background $_errorBackound
}
答案3
这是我编写的一个示例脚本,希望它能帮助其他人。这是一个 bat 文件,它会提示用户获取权限,然后自行升级。它会输出一些 vbscript,触发 UAC 提示,然后重新运行已升级的 bat 文件...http://jagaroth.livejournal.com/63875.html
答案4
FusionInventory.org 是一个开源解决方案,主要由小型维修店使用。它可以像您的个人远程控制 Windows 更新程序一样。