Powershell 这能在远程计算机上工作吗?

Powershell 这能在远程计算机上工作吗?,powershell,powershell-2.0,Powershell,Powershell 2.0,我一直在努力让它在远程计算机上工作,这可能吗?如果是这样,有人能给我指出正确的方向吗 代码如下: Function Lock-WorkStation { #Requires -Version 2.0 $signature = @" [DllImport("user32.dll", SetLastError = true)] public static extern bool LockWorkStati

我一直在努力让它在远程计算机上工作,这可能吗?如果是这样,有人能给我指出正确的方向吗

代码如下:

    Function Lock-WorkStation { 
        #Requires -Version 2.0 
        $signature = @" 
            [DllImport("user32.dll", SetLastError = true)] 
            public static extern bool LockWorkStation(); 
        "@ 

        $LockWorkStation = Add-Type -memberDefinition $signature -name "Win32LockWorkStation" -namespace Win32Functions -passthru 
        $LockWorkStation::LockWorkStation() | Out-Null 
    }

我不能在这里测试,但对我来说它无法工作,因为正如您在中所读到的,
lockstation
函数只能由交互式桌面上运行的进程调用。此外,用户必须登录


因此,据我所知,当您使用PSSession连接到远程计算机时,您不在交互式会话中。

这是可能的。但是您需要一个变通方法来连接到交互式会话

下载并安装。您只需要一个名为“TaskScheduler”的模块

我已经测试了以下代码:

Function Lock-Workstation
{
param(
$Computername,
$Credential
)
    if(!(get-module taskscheduler)){Import-Module TaskScheduler}
    New-task -ComputerName $Computername -credential:$Credential | 
    Add-TaskTrigger -In (New-TimeSpan -Seconds 30) |
    Add-TaskAction -Script `
    { 
    $signature = @" 
    [DllImport("user32.dll", SetLastError = true)] 
    public static extern bool LockWorkStation(); 
"@ 
    $LockWorkStation = Add-Type -memberDefinition $signature `
                                -name "Win32LockWorkStation" `
                                -namespace Win32Functions `
                                -passthru 
    $LockWorkStation::LockWorkStation() | Out-Null
    } | Register-ScheduledTask TestTask -ComputerName $Computername `
                                        -credential:$Credential
}
您可以这样使用它:

Lock-Workstation "NameOfTheComputer" (Get-Credential)
或者像这样:

Lock-Workstation "NameOfTheComputer"

如果您在指定凭据时在Connect-ToTaskScheduler中收到错误,那是因为模块中有输入错误(编辑Connect-ToTaskScheduler.ps1并将“$NetworkCredentail.Domain”替换为“$NetworkCredential.Domain”

与此无关,但在Windows Vista/7 2008/R2中,它会有所帮助,您可以使用命令
tsdiscon.exe
锁定远程桌面会话或您的工作站

下面是一个示例,在我的计算机上作为管理员域登录,我首先列出,然后锁定服务器上的控制台会话

PS> query session /server:WM2008R2ENT
 SESSION           UTILISATEUR              ID  ÉTAT    TYPE        PÉRIPHÉRIQUE
 services                                    0  Déco
 console           jpb                       2  Actif

PS> tsdiscon 2 /server:WM2008R2ENT

两个问题:1)您是否在运行Vista或更高版本系统的远程计算机上进行测试?2) 您是否真的使用远程计算机上登录的其他用户对其进行了测试?这意味着管理员可以使用taskscheduler在交互式桌面中插入代码。1)我从Windows 7工作站运行到Windows 2008 R2服务器。2) 两台计算机都有相同的用户登录。若要使用不同的凭据远程运行,您可以为new task和register-scheduledtask指定-credential。因此,您需要将用户的凭据登录到远程计算机上。这样我就明白了,谢谢WinFred。我不认为这是一个可操作的解决方案,但这个想法是+1。我想做的是能够将这个函数添加到一个模块中,然后像这样从控制台调用它:
锁定工作站comp1
,然后锁定名为comp1的计算机。我有一个功能可以用来强制注销,但理想情况下我只想锁定工作站。是的,PSremoting隔离远程会话。