You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
3.0 KiB
113 lines
3.0 KiB
# |
|
# Copyright (c) 2004-2012, Ashok P. Nadkarni |
|
# All rights reserved. |
|
# |
|
# See the file LICENSE for license |
|
|
|
|
|
# TBD - document and test |
|
proc twapi::get_active_console_tssession {} { |
|
return [WTSGetActiveConsoleSessionId] |
|
} |
|
|
|
proc twapi::get_current_window_station_handle {} { |
|
return [GetProcessWindowStation] |
|
} |
|
|
|
# Get the handle to a window station |
|
proc twapi::get_window_station_handle {winsta args} { |
|
array set opts [parseargs args { |
|
inherit.bool |
|
{access.arg generic_read} |
|
} -nulldefault] |
|
|
|
set access_rights [_access_rights_to_mask $opts(access)] |
|
|
|
return [OpenWindowStation $winsta $opts(inherit) $access_rights] |
|
} |
|
|
|
|
|
# Close a window station handle |
|
proc twapi::close_window_station_handle {hwinsta} { |
|
# Trying to close our window station handle will generate an error |
|
if {$hwinsta != [get_current_window_station_handle]} { |
|
CloseWindowStation $hwinsta |
|
} |
|
return |
|
} |
|
|
|
# List all window stations |
|
proc twapi::find_window_stations {} { |
|
return [EnumWindowStations] |
|
} |
|
|
|
|
|
# Enumerate desktops in a window station |
|
proc twapi::find_desktops {args} { |
|
array set opts [parseargs args {winsta.arg}] |
|
|
|
if {[info exists opts(winsta)]} { |
|
set hwinsta [get_window_station_handle $opts(winsta)] |
|
} else { |
|
set hwinsta [get_current_window_station_handle] |
|
} |
|
|
|
trap { |
|
return [EnumDesktops $hwinsta] |
|
} finally { |
|
# Note close_window_station_handle protects against |
|
# hwinsta being the current window station handle so |
|
# we do not need to do that check here |
|
close_window_station_handle $hwinsta |
|
} |
|
} |
|
|
|
|
|
# Get the handle to a desktop |
|
proc twapi::get_desktop_handle {desk args} { |
|
array set opts [parseargs args { |
|
inherit.bool |
|
allowhooks.bool |
|
{access.arg generic_read} |
|
} -nulldefault] |
|
|
|
set access_mask [_access_rights_to_mask $opts(access)] |
|
|
|
# If certain access rights are specified, we must add certain other |
|
# access rights. See OpenDesktop SDK docs |
|
set access_rights [_access_mask_to_rights $access_mask] |
|
if {"read_control" in $access_rights || |
|
"write_dacl" in $access_rights || |
|
"write_owner" in $access_rights} { |
|
lappend access_rights desktop_readobject desktop_writeobjects |
|
set access_mask [_access_rights_to_mask $opts(access)] |
|
} |
|
|
|
return [OpenDesktop $desk $opts(allowhooks) $opts(inherit) $access_mask] |
|
} |
|
|
|
# Close the desktop handle |
|
proc twapi::close_desktop_handle {hdesk} { |
|
CloseDesktop $hdesk |
|
} |
|
|
|
# Set the process window station |
|
proc twapi::set_process_window_station {hwinsta} { |
|
SetProcessWindowStation $hwinsta |
|
} |
|
|
|
proc twapi::get_desktop_user_sid {hdesk} { |
|
return [GetUserObjectInformation $hdesk 4] |
|
} |
|
|
|
proc twapi::get_window_station_user_sid {hwinsta} { |
|
return [GetUserObjectInformation $hwinsta 4] |
|
} |
|
|
|
proc twapi::get_desktop_name {hdesk} { |
|
return [GetUserObjectInformation $hdesk 2] |
|
} |
|
|
|
proc twapi::get_window_station_name {hwinsta} { |
|
return [GetUserObjectInformation $hwinsta 2] |
|
}
|
|
|