Windows: Bagaimana membuat program berpikir mereka tidak berjalan di sesi server terminal?

11

Saya menggunakan program "SoftXPand 2011 Duo" oleh Miniframe di PC Windows 7 saya. Itu membuat dua workstation dari satu komputer. Ini menggunakan layanan terminal yang dibangun ke dalam Windows untuk membuat sesi tambahan. Saya menggunakan dua layar, dua keyboard dan dua mouse untuk membuat "ilusi" dua komputer ini. Ini bekerja dengan sangat baik dan saya bahkan dapat memainkan dua game 3D yang berbeda pada dua layar yang terpasang pada mesin tunggal ini (menggunakan Radeon HD5770 dan Core i5 2500k dengan 8 Gbytes RAM).

Ada beberapa kerugian untuk ini. Saya baru saja menemukan satu yang tersembunyi pada tampilan pertama. Sesi Anda berada (bahkan pada workstation pertama) akan mengidentifikasi sebagai sesi server terminal! Sekarang beberapa program akan berjalan dengan efek terbatas (grafis), dan beberapa tidak akan berjalan sama sekali.

Ini juga mengakibatkan beberapa game tidak berjalan sama sekali. Mereka hanya mengatakan "Tidak dapat dijalankan dalam sesi terminal server" dan keluar. Saya telah membuktikan bahwa game modern papan atas (DirectX 10, 11) berjalan sama baiknya dengan pada mesin yang sama tanpa SoftXPand, jadi ini adalah batasan yang cukup artifisial!

Jadi, bisakah saya meretas sesi saya saat ini sehingga tidak terlihat seperti sesi server terminal lagi? YAITU

#include <windows.h>
#pragma comment(lib, "user32.lib")

BOOL IsRemoteSession(void)
{
   return GetSystemMetrics( SM_REMOTESESSION );
}

Akan mengembalikan SALAH? (Bukan pertanyaan pemrograman! Hanya contoh bagaimana program mendeteksi jika mereka berada dalam sesi server terminal!)

sinni800
sumber
Apakah Anda memiliki dua keyboard / layar? Tolong jelaskan lebih lanjut tentang pengaturan Anda.
harrymc
@harrymc Ya, saya lakukan. Editing.
sinni800
Alasan aplikasi menolak untuk berjalan di server terminal, bahkan ketika Anda menggunakan sesi konsol, adalah karena alasan lisensi - sehingga satu lisensi tidak dapat digunakan oleh lebih dari satu orang pada saat yang sama.
paradroid

Jawaban:

9

Ada beberapa cara bagi suatu aplikasi untuk memeriksa apakah itu berjalan dalam sesi Terminal Server. Beberapa di antaranya mungkin Anda retas, seperti di bawah ini:

  1. Registry: HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\TSAppCompat.
    Kunci ini tidak ada dalam sesi normal di desktop saya.
    Anda mungkin mencoba menghapusnya, jika Anda bisa.
  2. Nilai variabel lingkungan SESSIONNAME: Konsol / "RDP #" / (kosong).
    Anda dapat mencoba menjalankan game Anda dari Command Prompt (cmd) setelah melakukannya
    SET SESSIONNAME=Console(nilai desktop saya) atau SET SESSIONNAME=(kosong).
    Untuk mengetahui nilainya saat ini, masukkan SET SESSIONNAMEsebelum mengubah apa pun.
  3. Sistem memanggil GetSystemMetrics (SM_REMOTESESSION) dan GetVersionEx ( OSVERSIONINFOEX.wSuiteMask ) mengembalikan konteks eksekusi.
    Tidak banyak yang dapat Anda lakukan untuk melawan yang satu ini, kecuali menulis hook sistem untuk itu.
    Jika tertarik lihat artikel codeproject.com ini: Hooking API terungkap .
harrymc
sumber
Pada 2), nama sesi adalah "konsol" (Apa-apaan ini?). Kunci TSAppCompat juga tidak ada di sini. Tentang yang ketiga ... Tampak sulit dilakukan. Bukankah ada program yang duduk di atas program lain dan memotong panggilan sistem seperti yang saya sebutkan? GetSystemMetrics.
sinni800
Menurut info Anda, mungkin metode ke-3 adalah metode yang layak diserang untuk GetVersionEx dan GetSystemMetrics. Saya telah menambahkan tautan di atas (untuk digunakan oleh seorang programmer).
harrymc
Catatan lain: Jika ada cara untuk menggunakan MSTSC / admin di SoftXPand, ini patut dicoba.
harrymc
@harrymc mengapa MSTSC / admin? Saya akan melihat ke api hooking ... Mungkin terlalu rumit untuk kemampuan pemrograman saya.
sinni800
"MSTSC / admin" adalah kesempatan yang agak panjang: ini adalah tipe sesi jarak jauh yang agak berbeda, jadi mungkin beberapa program mungkin tidak mendeteksinya.
harrymc
0

Saya menemukan solusinya: menjalankan program yang Anda inginkan dengan "runas"

Setelah Anda masuk melalui desktop, ketikkan dalam cmd:

runas / pengguna: YOUR_NAME "YOUR_PROGRAM_PATH"

Saya mengujinya terhadap perangkat lunak Bently dan mereka bekerja dengan baik.

AqD
sumber
Ini menghindari masalah server terminal? Menarik, saya harus mencoba.
sinni800
Tidak berfungsi dengan efek massa 3 (Program ini tidak dapat dijalankan dari jarak jauh)
Mgamerz
0

Saya menggunakan Microsoft Remote Desktop dan saya sudah mencoba 2 metode pertama yang diposting oleh @harrymc, tetapi mereka tidak berfungsi dalam kasus saya. Yang ketiga terlalu rumit untuk saya, jadi saya belum mencobanya.

Pada akhirnya, saya menemukan bahwa Akses Paralel memungkinkan saya untuk menggunakan program yang menunjukkan kesalahan. Ini tidak semulus RDP, jadi saya menggunakannya jika saya benar-benar harus menggunakan program ini.

Lewen
sumber
0

Tidak menjawab pertanyaan SoftXPand secara langsung, tetapi saya berakhir di sini karena pencarian Google dan jawabannya adalah @ harrymc.

Saya membuat file batch yang mengalami keterlambatan 60 detik dan kemudian memulai aplikasi yang ingin saya jalankan. Saya memulai file batch, keluar dari koneksi RDP saya, menunggu sekitar 5 menit dan kemudian terhubung kembali dengan RDP. Aplikasi sial yang saya inginkan sedang menunggu saya ketika saya kembali. Berikut isi file batch:

timeout 60

start /D "your path here" yourExecutable.exe

Kutipan di sekitar jalur diperlukan jika Anda memiliki spasi di jalur.

Mendapat informasi batch dari sini: /programming/8324352/creating-a-batch-file-for-programs-to-start-using-a-delay

alat peraga untuk orang ini: /programming//users/959263/raihan

(Dikatakan untuk memberikan rincian dan membagikan penelitian saya)

LargoBoom
sumber
Solusi yang menarik, saya tidak tahu apakah itu akan dapat diterapkan ke SoftXPand, jujur ​​saja. Karena saya tidak bisa "meninggalkan" sesi seperti dengan RDP.
sinni800