使用 WMI 配置终端服务网关





4.00/5 (1投票)
描述了使用 WMI 向终端服务网关添加和删除 RAPs 的方法。
引言
本文介绍 WMI 和终端服务网关。您可以使用 WMI 远程管理您的 TS 网关服务器。在这里,我描述了两种方法,即添加和删除资源授权策略 (RAP)。所有代码块都来自概念验证演示,它们并不代表代码的“生产”状态。
背景
远离办公室的员工需要不断访问内部资源。让人们访问他们自己的办公室电脑在离开时能提供最熟悉的感觉。在从互联网打开此类连接时,需要采取一些措施来保护、管理和处理这些连接。为了避免给管理员带来负担,开发了一项自动服务,为最终用户配置终端服务网关。本文展示了一种管理 TS 网关服务器配置的一部分的方法。
Using the Code
在使用代码之前,需要添加 System.Management
命名空间。此外,这些方法要求您的服务器上有一个用户组。在本例中,该组的名称为“RAP_TEST”。如果您是域的一部分或正在运行 Active Directory 服务,也可以使用“DOMAIN\UserGroup”之类的组。
执行代码时,请注意无法在本地实现 PacketPrivacy 的身份验证级别。这意味着您无法在您尝试配置的服务器上运行代码。
首先,我从使用稍后描述的类别的代码开始。这是一个简单的循环,它将 100 个 RAP 添加到服务器。
public class ProofOfConcepts
{
static void Main(string[] args)
{
TerminalServicesGatewayConnector oTSC =
new TerminalServicesGatewayConnector("TSGWTEST");
string log = "";
for (int i = 0; i < 100; i++)
{
oTSC.AddRAP("COUNT_TEST_" + i.ToString(), out log);
Console.WriteLine("#\t" + i.ToString() + "\t" + log);
}
Console.ReadLine();
}
}
文章的重点从定义 TerminalServerGatewayConnector
类开始。该类用于连接和进行配置更改。文章后面找到的方法都是该类的方法。
using System.Management;
public class TerminalServicesGatewayConnector
{
public enum SUCCESS : byte
{
SUCCESS = 0x00,
ERROR = 0x01,
REMOTE_EXCEPTION = 0x02
}
private ConnectionOptions _oConn;
private ManagementScope _oMScope;
private ManagementPath _oMPath;
private string _sHost;
private string _sPath = @"\root\CIMV2\TerminalServices";
private string _sUsername = @"TSGWTEST\Administrator";
private string _sPassword = @"Password!Admin";
public TerminalServicesGatewayConnector(string sHost)
{
_sHost = @"\\" + sHost;
}
}
变量 _sUsername
和 _sPassword
需要根据您自己的设置进行设置。命名空间变量 _sPath
是可以找到终端服务网关服务器所有 WMI 调用的位置。我听说终端服务将被重命名为远程桌面服务。这可能会影响未来的命名空间。
这是将 RAP 添加到网关配置的方法
public SUCCESS AddRAP(string sComputerName, out string sLogString)
{
try
{
_oConn = new ConnectionOptions();
_oConn.Impersonation = ImpersonationLevel.Impersonate;
_oConn.Authentication = AuthenticationLevel.PacketPrivacy;
_oConn.Username = _sUsername;
_oConn.Password = _sPassword;
_oConn.EnablePrivileges = true;
_oMScope = new ManagementScope(_sHost + _sPath, _oConn);
_oMScope.Options.Authentication = AuthenticationLevel.PacketPrivacy;
_oMScope.Options.Impersonation = ImpersonationLevel.Impersonate;
_oMScope.Options.EnablePrivileges = true;
_oMPath = new ManagementPath();
_oMPath.ClassName = "Win32_TSGatewayResourceAuthorizationPolicy";
_oMPath.NamespacePath = _sPath;
_oMScope.Connect();
ManagementClass processClass = new ManagementClass(_oMScope, _oMPath, null);
ManagementBaseObject inParameters =
processClass.GetMethodParameters("Create");
ManagementObject processInstance = processClass.CreateInstance();
ManagementNamedValueCollection mnvc = new ManagementNamedValueCollection();
InvokeMethodOptions imo = new InvokeMethodOptions();
inParameters["Name"] = sComputerName + "_GW";
inParameters["Description"] = "";
inParameters["Enabled"] = true;
inParameters["ResourceGroupName"] = @"RAP_TEST";
inParameters["ResourceGroupType"] = "CG";
inParameters["UserGroupNames"] = @"RAP_TEST";
inParameters["ProtocolNames"] = "RDP";
inParameters["PortNumbers"] = "3389";
mnvc.Add("Authentication", AuthenticationLevel.PacketPrivacy);
imo.Context = mnvc;
sLogString = "";
processClass.Get();
ManagementBaseObject outParameters =
processClass.InvokeMethod("Create", inParameters, imo);
if ((UInt32)outParameters["ReturnValue"] == 0)
{
sLogString = "Item created.";
return SUCCESS.SUCCESS;
}
else
{
sLogString = "ERROR: " +
((UInt32)outParameters["ReturnValue"]).ToString();
return SUCCESS.ERROR;
}
}
catch (System.Exception ex)
{
sLogString = ex.Message;
return SUCCESS.REMOTE_EXCEPTION;
}
}
这是从网关配置中删除 RAP 的方法
public SUCCESS DeleteRAP(string sComputerName, out string sLogString)
{
try
{
_oConn = new ConnectionOptions();
_oConn.Impersonation = ImpersonationLevel.Impersonate;
_oConn.Authentication = AuthenticationLevel.PacketPrivacy;
_oConn.Username = _sUsername;
_oConn.Password = _sPassword;
_oConn.EnablePrivileges = true;
_oMScope = new ManagementScope(_sHost + _sPath, _oConn);
_oMScope.Options.Authentication = AuthenticationLevel.PacketPrivacy;
_oMScope.Options.Impersonation = ImpersonationLevel.Impersonate;
_oMScope.Options.EnablePrivileges = true;
_oMScope.Connect();
ObjectQuery oQuery = new ObjectQuery("SELECT * FROM " +
"Win32_TSGatewayResourceAuthorizationPolicy WHERE Name=\"" +
sComputerName + "_GW\" ");
ManagementObjectCollection oResults =
new ManagementObjectSearcher(_oMScope, oQuery).Get();
if (oResults != null && oResults.Count == 1)
{
foreach (ManagementObject oResult in oResults)
{
uint iResultCode =
(UInt32)oResult.InvokeMethod("Delete", null);
if (iResultCode == 0)
{
sLogString = "Item deleted.";
return SUCCESS.SUCCESS;
}
else
{
sLogString = "ERROR: " + iResultCode.ToString();
return SUCCESS.ERROR;
}
}
}
sLogString = "ERROR: Not Found.";
return SUCCESS.ERROR;
}
catch (System.Exception ex)
{
sLogString = "ERROR: " + ex.Message;
return SUCCESS.REMOTE_EXCEPTION;
}
}
关注点
终端服务网关服务器上的 RAP 数据源并非设计用于并发访问。请注意这一点,并在编写访问这些设置的程序时注意。并发访问 RAP 配置可能会损坏 RAP 存储。为了避免此问题,我创建了一个 Mutex 来以编程方式屏蔽并发访问。
历史
- 2009-06-29 - 首次版本。
- 2009-07-08 - 拼写更正。