如何在非提升的PowerShell中运行w32tm

时间:2014-02-25 00:15:19

标签: powershell powershell-v2.0 ntp

我正在编写一个帮助程序脚本,它将通过服务器列表并验证它们是否与NTP同步。脚本应根据设施操作员的请求作为普通脚本运行,并且如果目标不同步,则应请求管理员凭据。遗憾的是,我们目前无法更改NTP配置,因此我们必须进行解决方法。

我现在拥有的(如果脚本以管理员身份运行,它可以很好地工作)是一个命令(远程计算机的“w32tm / query / status”),它通过“Invoke-Command”执行,所以我可以通过它管理员凭据。

我的想法是避免使用WinRM,因为主机名解析在我们的系统中无法正常工作(它需要一些痛苦的主机到IP和回到正确的主机名解析),这使得WinRM无用。

命令w32tm可以获取远程计算机的状态,但需要以管理员身份运行它。

在这两种情况下(以管理员身份运行并以普通用户身份运行,稍后提供凭据),$脚本以域\管理员身份执行(通过检查管理员角色和“WhoAmI”命令确认)但状态仅为以管理员身份执行整个脚本时获取。 对于普通用户的执行,我收到错误:

The following error occurred: Access is denied. (0x80070005)

我使用的所有机器显然都允许远程执行,因为它适用于管理员用户。

所以基本上我的问题是,如果用户的角色适合任务(它是管理员角色),为什么在$脚本中不允许使用“w32tm ...”命令?

我无法解决的脚本部分:

function synchronize_remote_machine ($target, $username, $cred)
{
    $script = { 
        param( [String] $compName )

        $user = [Security.Principal.WindowsIdentity]::GetCurrent();
        $userIsAdmin = (New-Object Security.Principal.WindowsPrincipal $user).`
                IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)  

        if (-not $userIsAdmin)
        {
            Write-Warning "You do not have Administrator rights to run this script!`n
                    Please re-run this script as an Administrator!"
        }
        else    
        {
            whoAmI
            w32tm /query /status /computer:$compName
            #w32tm /resync /rediscover /computer:$compName
        }
    }

    # resync via WinRM
    try 
    {
        #execute_resync_command $target $username $cred
        if ($username -eq 'Administrator')
        {
            # when run as admin
            invoke-command -ScriptBlock $script -ArgumentList $target;
        }
        else
        {
            # for normal user the initalized credential cals is used
            invoke-command -computername "localhost" -Credential $cred -ScriptBlock $script -ArgumentList $target
        }
    }
    catch
    {
        Write-Error "Error executing resync command on host $target."# -foregroundcolor "red"
        throw
    }   
}

2 个答案:

答案 0 :(得分:2)

我没有(重新)使用提升的权限运行脚本,而是在这些服务器上授予运营商组SeSystemtimePrivilege。您可以使用组策略或从每台服务器上的Server 2003 Resource Kit Tools运行ntrights.exe来执行此操作:

ntrights +r SeSystemtimePrivilege -u DOMAIN\operators

答案 1 :(得分:1)

即使您以管理员身份执行,也可以尝试在提升的流程中运行脚本吗?

您可以使用Start-Process CmdLet来实现这一目标。

start-process 'c:\system32\WindowsPowerShell\v1.0\powershell.exe' -verb runas -argumentlist "-file YourScript.ps1"