如何修改或查询终端服务的 RDP 连接权限

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 259129
重要 本文包含有关如何修改注册表的信息。请确保备份注册表之前对其进行修改。请确保您知道如何出现问题时还原注册表。有关如何备份、 还原和修改注册表的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章 ︰
256986 Microsoft Windows 注册表的说明
简介
终端服务配置应用程序允许您更改远程桌面协议传输控制协议 (RDP-TCP) 连接权限。这些权限确定哪些用户可以执行的操作 (连接、 断开连接,请注销、 查询等等) 对终端服务会话。

应用程序可以以编程方式更改 Microsoft Windows 注册表通过 RDP-TCP 连接权限。如果您运行的 Windows Server 2003 或更高版本的 Windows 服务器,请使用 WMI 提供程序Win32_TSPermissionsSetting类以编程方式更改 RDP-TCP 连接权限。这些以编程方式更改生效,必须重新启动运行 Windows 终端服务器的计算机。

若要查看示例对于 Windows Server 2003 中使用Win32_TSPermissionsSetting类的 WMI 脚本,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章︰
290720 如何使用 WMI 将用户添加到终端服务 RDP 权限
更多信息
警告如果使用注册表编辑器或其他方法错误地修改了注册表,可能会出现严重问题。这些问题可能要求您重新安装操作系统。Microsoft 不能保证这些问题能够得到解决。修改注册表的风险由您自己承担。

安全描述符存储在注册表中的自相关格式。要获取或修改的安全描述符,您必须将其转换为绝对格式。修改安全描述符后,必须将其转换回自相关格式,然后重新保存更改。

DefaultSecurity注册表值在以下注册表项中存储的默认安全设置︰
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations
如果您修改安全设置,它们存储在安全值在以下注册表项︰
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp
如果您修改默认的安全描述符和安全值下 Rdp-tcp 键不存在,则必须创建值。

示例代码

下面的代码演示如何修改当前 RDP-TCP 连接权限。该代码检查Rdp-tcp项下已修改的安全描述符。如果没有找到,它会打开WinStations项下的默认安全描述符。修改的描述符后,它将保存Rdp-tcp项下。
#include <windows.h>#include <stdio.h>#include <tchar.h>#define USER_ACCESS  0x1A1#define GUEST_ACCESS 0x20#define FULL_CONTROL 0xF03FFvoid _tmain(void) {   BYTE   buffer[4096];   BYTE   acl[1024];   DWORD  dwAcl = sizeof(acl);   BYTE   sacl[1024];   DWORD  dwSacl = sizeof(sacl);   BYTE   sidOwner[1024];   DWORD  dwSidOwner = sizeof(sidOwner);   BYTE   sidGroup[1024];   DWORD  dwSidGroup = sizeof(sidGroup);   DWORD  dwSize = sizeof(buffer);   HKEY   hKey = NULL;   LONG   lResult;   BYTE   AbsSD[4096];   BYTE   AbsModifiedSD[4096];   DWORD  dwAbsMod = sizeof(AbsModifiedSD);   // Open the rdp-tcp key   lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,         TEXT("system\\currentcontrolset\\control")         TEXT("\\terminal server\\winstations\\rdp-tcp"),         0, KEY_QUERY_VALUE | KEY_SET_VALUE, &hKey);   if (lResult != ERROR_SUCCESS) {      _tprintf(TEXT("RegOpenKeyEx failed with error %u\n"), lResult);      return;   }   // Query the Security value   lResult = RegQueryValueEx(hKey, TEXT("Security"), NULL, NULL, buffer,         &dwSize);   // Close the rdp-tcp key   RegCloseKey(hKey);   if (lResult != ERROR_SUCCESS && lResult != ERROR_FILE_NOT_FOUND) {      _tprintf(TEXT("RegQueryValueEx failed with error %u\n"),            lResult);      return;   }   // If the value was not present, get the default security descriptor   if (lResult == ERROR_FILE_NOT_FOUND) {      // Open the WinStations key      lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,             TEXT("system\\currentcontrolset\\control")            TEXT("\\terminal server\\winstations"),             0, KEY_QUERY_VALUE | KEY_SET_VALUE, &hKey);      if (lResult != ERROR_SUCCESS) {         _tprintf(TEXT("RegOpenKeyEx failed with error %u\n"),               lResult);         return;      }      // Query the DefaultSecurity value      lResult = RegQueryValueEx(hKey, TEXT("DefaultSecurity"), NULL,            NULL, buffer, &dwSize);      // Close the WinStations key      RegCloseKey(hKey);      if (lResult != ERROR_SUCCESS) {         _tprintf(TEXT("RegQueryValueEx failed with error %u\n"),               lResult);         return;      }   }   // Convert the self-relative security descriptor to the absolute form   dwSize = sizeof(AbsSD);   if (!MakeAbsoluteSD((PSECURITY_DESCRIPTOR) buffer, AbsSD, &dwSize,          (PACL) acl, &dwAcl, (PACL) sacl, &dwSacl, (PSID) sidOwner,          &dwSidOwner, (PSID) sidGroup, &dwSidGroup)) {      _tprintf(TEXT("MakeAbsoluteSD failed with error %u\n"),             GetLastError());      return;   }   //    // TODO: Your code to modify the dacl goes here   //    // CAUTION: Incorrectly modifying the DACL may prevent the    // system from operating properly.  For added safety, be sure    // to back up the registry before you run your code.   //       // Convert the security descriptor back to the self-relative form   if (!MakeSelfRelativeSD(AbsSD, AbsModifiedSD, &dwAbsMod)){      _tprintf(TEXT("MakeSelfRelativeSD failed with error %u\n"),            GetLastError());      return;   }   // Open the rdp-tcp key   lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,         TEXT("system\\currentcontrolset\\control")         TEXT("\\terminal server\\winstations\\rdp-tcp"),         0, KEY_QUERY_VALUE | KEY_SET_VALUE, &hKey);   if (lResult != ERROR_SUCCESS) {      _tprintf(TEXT("RegOpenKeyEx failed with error %u\n"), lResult);      return;   }   // Save the modified security value   lResult = RegSetValueEx(hKey, TEXT("Security"), 0, REG_BINARY,          AbsModifiedSD, dwAbsMod);   if (lResult != ERROR_SUCCESS){      _tprintf(TEXT("RegSetValueEx failed with %u\n"), lResult);      return;   }   // Close the rdp-tcp key   RegCloseKey(hKey);}				

警告:本文已自动翻译

属性

文章 ID:259129 - 上次审阅时间:07/03/2016 23:16:00 - 修订版本: 5.0

Microsoft Win32 Application Programming Interface

  • kbapi kbhowto kbkernbase kbmt KB259129 KbMtzh
反馈