Windows XP x64上のターミナルサーバーのマルチユーザーモード

最近のアップグレードをきっかけに、リモートデスクトップ経由で同時に接続するユーザーの数がWindows XP x64の不快な制限に遭遇しました。 つまり、一度に1人のユーザーしかコンピューターを操作できません。 RDP経由で接続すると、ローカルユーザーは切断されます。 ローカルログイン時-リモートのログインを切断します。 マシンのリソースが複数の顧客にとって十分すぎることを考えると、面倒です。



私の知る限り、この問題はすべてのデスクトップ(非サーバー)バージョンのWindowsに固有のものです。 32ビットバージョンのWindows XPには、TS-Freeパッチの形式のソリューションがあります。これは、いくつかのシステムライブラリを古いが無制限のバージョンに置き換えます。 64ビットシステムの場合、ソリューションは通常、OSのサーバーバージョンへの切り替え(相当する費用)またはWinConnect Server VSなどのサードパーティプログラムの使用(ただし、WinXP x64はまだサポートされていません)になります。 オランダのブログで「 Windows XP x64 Terminal Server patch 」という記事に偶然出会ったとき、私はすでに絶望していました。 この記事では、すべてのウイルス対策ソフトが誓うTS-Freeとは異なり、著者はどのバイトがどのような理由で変化するのかを詳細に説明しているため、読者はパッチのセキュリティを個別に検証できます。

以下は記事の無料翻訳です。



Windows XP x64はWindows 2003 x64と同じファイルに基づいていますが、XPのターミナルサーバーにはいくつかの制限があります。 この記事では、それらを取り除く方法を示します。 このアイデアは、Windows XP Terminal Serverのオリジナルパッチのcw2kに基づいていました。



1) Winlogon.exeには、 IsProfessionalTerminalServerを呼び出すEnumerateMatchingUsers関数が含まれています 。 後者は、ゼロ(FALSE)を返すように修正する必要があります。
.text:0000000100042F77 IsProfessionalTerminalServer proc near ; コードXREF:EnumerateMatchingUsers:loc_10002B44Bp

.text:0000000100042F77 ; データ外部参照:.pdata:00000001000D01DCo ...

.text:0000000100042F77

.text:0000000100042F77 VersionInformation = _OSVERSIONINFOW ptr -138h

.text:0000000100042F77 var_20 = word ptr -20h

.text:0000000100042F77 var_ 1E = byte ptr -1Eh

.text:0000000100042F77 var_18 = qword ptr -18h

.text:0000000100042F77

.text:0000000100042F77 48 81 EC 58 01 00 00 sub rsp、 158h => 31 C0 C3 xor eax、eax; retn

.text:0000000100042F7E 48 8B 05 F3 3A 08 00 mov rax、cs:__ security_cookie

.text:0000000100042F85 48 89 84 24 40 01 00 00 mov [rsp + 158h + var_18 ]、rax

.text:0000000100042F8D 48 8D 4C 24 20 lea rcx、[rsp + 158h + VersionInformation ] ; 無効*

.text:0000000100042F92 33 D2 xor edx、edx ; int


しかし、それだけではありません。 IsPerOrProTerminalServer関数もあります。 複数の場所で使用されますが、 MultiUserLogonAttemptからの呼び出しのみを編集します。
.text:0000000100044A91 E8 71 E5 FF FF 呼び出しIsPerOrProTerminalServer

.text:0000000100044A96 85 C0 テストeax、eax

.text:0000000100044A98 0F 84 C9 00 00 00 jz loc_100044B67 => 0F 8D C9 00 00 00 jmp loc_100044B67

.text:0000000100044B13 E8 EF E4 FF FF 呼び出しIsPerOrProTerminalServer

.text:0000000100044B18 85 C0 テストeax、eax

.text:0000000100044B1A 74 0C jz short loc_100044B28 => EB 0C jmp short loc_100044B28


2) Termsrv.dll ターミナルサーバーに、サーバーOS上で実行されていると思わせます。 ServiceMainでは、 termsrv.dllがgbServerというグローバル変数を初期化します。 TRUE(1)に等しくする必要があります。
.text:000007FF7B877F77 33 C9 xor ecx、ecx ; 条件マスク

.text:000007FF7B877F79 C7 05 9D 2C 05 00 1C 01 00 00 mov cs:gOsVersion.dwOSVersionInfoSize、 11Ch

.text:000007FF7B877F83 C6 05 B0 2D 05 00 01 mov cs:gOsVersion.wProductType、 1

.text:000007FF7B877F8A FF 15 F8 9A FF FF 呼び出しcs:__ imp_VerSetConditionMask

.text:000007FF7B877F90 48 8D 0D 89 2C 05 00 lea rcx、gOsVersion ; lpVersionInformation

.text:000007FF7B877F97 BA 80 00 00 00 mov edx、 80h ; dwTypeMask

.text:000007FF7B877F9C 4C 8B C0 mov r8、rax ; dwlConditionMask

.text:000007FF7B877F9F FF 15 73 95 FF FF 呼び出しcs:__ imp_VerifyVersionInfoW

.text:000007FF7B877FA5 8B CF mov ecx、edi => 31 C9 xor ecx、ecx

.text:000007FF7B877FA7 48 8D 15 B2 AE FF FF lea rdx、SubKey ; 「System \\ CurrentControlSet \\ Control \\ Termin」...

.text:000007FF7B877FAE 85 C0 テストeax、eax

.text:000007FF7B877FB0 48 8D 44 24 60 lea rax、[rsp + 78h + hKey ]

.text:000007FF7B877FB5 41 B9 19 00 02 00 mov r9d、 20019h ; サム

.text:000007FF7B877FBB 0F 94 C1 setz cl => FF C1 90 inc ecx; いや

.text:000007FF7B877FBE 45 33 C0 xor r8d、r8d ; ulOptions

.text:000007FF7B877FC1 48 89 44 24 20 mov [rsp + 78h + var_58 ]、rax

.text:000007FF7B877FC6 89 0D 30 B0 04 00 mov cs:gbServer、ecx


そのため、サーバーに「アップグレード」しました。 ただし、サーバーOSでコンソールを無効にすることは禁止されているため(STATUS_CTX_CONSOLE_DISCONNECT = $ C00A0027)、このコードが使用されている場所をさらに2つ修正する必要があります。
.text:000007FF7B889D99 85 C0 テストeax、eax

.text:000007FF7B889D9B 75 21 jnz short loc_7FF7B889DBE => EB 21 jmp short loc_7FF7B889DBE

.text:000007FF7B889D9D 48 8D 4B 18 lea rcx、[rbx + 18h ]

.text:000007FF7B889DA1 BF 27 00 0A C0 mov edi、 0C00A0027h
そして再び:
.text:000007FF7B88AA1B 45 85 E4 テストr12d、r12d

.text:000007FF7B88AA1E 74 0A jz short loc_7FF7B88AA2A => EB 21 jmp short loc_7FF7B88AA2A

.text:000007FF7B88AA20 BB 27 00 0A C0 mov ebx、 0C00A0027h


それはすべてパッチです! それらを適用するには、次のことを行う必要があります。



レジストリの編集 :次のキーが指定された値を持っていることを確認してください。

いくつかの微妙な点が残っています:localhost(127.0.0.2への接続によって解決)との接続を確立できず、RDPセッション(コンソールではなく)からコンピューターをブロックすると、単に切断されます(ユーザーの簡易切り替え、ユーザーの簡易切り替えの場合)。 次の記事は、これらの問題を解決することに専念します。



PS [寄付]ボタンは、作成者に感謝の気持ちを表すのにちょうど間に合いました。

PPSいいえ、私たちは関係ありません:)



All Articles