我正在尝试制定一个Powershell命令来远程注销用户.我们有一个终端服务器,程序非常不稳定,有时会锁定会话.我们必须远程注销用户,但我正在尝试编写一个Powershell语句,该语句将注销运行该脚本的人员.我用Google搜索,发现了这个命令:
Invoke-Command -ComputerName MyServer -Command {shutdown -l}
Run Code Online (Sandbox Code Playgroud)
但是,该命令返回"不正确的功能".我可以在括号中成功运行其他命令,例如Get-Process.
我的想法是让我把它放到一个脚本中,用户可以运行该脚本将自己从服务器上注销(因为当它锁定时,它们无法访问开始菜单或ALT + CTRL + END通过GUI完成它).
流程将是这样的:Bob通过RDP登录MyServer,但他的会话冻结了.在他的本地桌面上,他可以运行MyScript(包含类似于上面的命令),这将在MyServer上注销他的会话.
我创建了一个PowerShell脚本,将当前用户保存到报表中.创建此报告时,它工作正常,因为我使用$ env:USERNAME.但是,现在报告在SYSTEM帐户下作为计划任务运行,它将当前用户保存为"HOSTNAME $".是否有另一种简单的方法来获取登录用户?以下不起作用:
Get-WMIObject -class Win32_ComputerSystem | select username
Run Code Online (Sandbox Code Playgroud)
任何想法都会非常感激,因为我需要保存当前登录的用户.我还需要以NT AUTHORITY\SYSTEM运行报告来运行提升的任务.
我编写了这个Powershell脚本来获取Active Logged in Users.它在exe文件(C#)中完美运行,当我从Powershell运行时,我得到了Arithmetic operation resulted in an overflow.
找不到问题.有什么问题?
function IsUserCurrentlyLoggedIn($UserDomain, $UserName)
{
Add-Type -Language CSharp -TypeDefinition @'
using System;
using System.Runtime.InteropServices;
namespace Test
{
public static class EnumerateUsers
{
[DllImport("wtsapi32.dll")]
static extern IntPtr WTSOpenServer([MarshalAs(UnmanagedType.LPStr)] String pServerName);
[DllImport("wtsapi32.dll")]
static extern void WTSCloseServer(IntPtr hServer);
[DllImport("wtsapi32.dll")]
static extern Int32 WTSEnumerateSessions(
IntPtr hServer,
[MarshalAs(UnmanagedType.U4)] Int32 Reserved,
[MarshalAs(UnmanagedType.U4)] Int32 Version,
ref IntPtr ppSessionInfo,
[MarshalAs(UnmanagedType.U4)] ref Int32 pCount);
[DllImport("wtsapi32.dll")]
static extern void WTSFreeMemory(IntPtr pMemory);
[DllImport("Wtsapi32.dll")]
static extern bool WTSQuerySessionInformation(
System.IntPtr hServer, int sessionId, …Run Code Online (Sandbox Code Playgroud)