Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2015, 12:56   #11
SunnyCrash
Пользователь
 
Регистрация: 13.02.2011
Сообщений: 45
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
 function GetCurrentUserName: string;
 const
   cnMaxUserNameLen = 254;
 var
   sUserName: string;
   dwUserNameLen: DWORD;
 begin
   dwUserNameLen := cnMaxUserNameLen - 1;
   SetLength(sUserName, cnMaxUserNameLen);
   GetUserName(PChar(sUserName), dwUserNameLen);
   SetLength(sUserName, dwUserNameLen);
   Result := sUserName;
 end;



procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(GetCurrentUserName);
end;

Последний раз редактировалось Stilet; 13.09.2015 в 14:59.
SunnyCrash вне форума Ответить с цитированием
Старый 15.09.2015, 20:32   #12
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

SunnyCrash, а теперь попробуй запустить от имени другого пользователя, что покажет?
... мне надо чтобы показало того, кто вошёл в систему
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 15.09.2015, 20:37   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
мне надо чтобы показало того, кто вошёл в систему
А как быть со случаями, когда несколько сеансов активны?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.09.2015, 00:21   #14
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
Мне нужно чтобы моя программа запускалась от единственного пользователя (например адмиинистратора), а писала в папки с названием пользователя который вошёл в систему.
Не совсем понятно чего ты желаешь? Нужен именно запуск от другого пользователя, но чтобы писалось в папки того пользователя чей рабочий стол сейчас активен? Или всё-таки запуск с правами администратора?
Ибо вроде, как бы, начиная с Висты пользователь даже с правами администратора не имеет прав писать в папки других пользователей. Он ведь всего лишь "старший помощник младшего администратора".
northener вне форума Ответить с цитированием
Старый 16.09.2015, 07:28   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а те функции на коорые я указал что вам выдали? или вы не пробовали(там ж нет готового кода)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.09.2015, 08:29   #16
Foreseen
Техножрец
Форумчанин
 
Аватар для Foreseen
 
Регистрация: 04.07.2014
Сообщений: 289
По умолчанию

Диспетчер задач то правильно определяет активного пользователя...
Может это как то поможет ТСу? http://ab57.ru/cmdlist/whoami.html (нет, не поможет, тоже определяет имя юзера по getusername)
— Двери есть везде. Просто нужно знать, как в них войти.

Последний раз редактировалось Foreseen; 16.09.2015 в 10:18.
Foreseen вне форума Ответить с цитированием
Старый 16.09.2015, 20:04   #17
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

WTSQuerySessionInformation
поле WTSUserName

Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows;

const
  //  Specifies the current server
  WTS_CURRENT_SERVER_HANDLE = THandle(0);

const
  // WTS_EVENT - Event flags for WTSWaitSystemEvent
  WTS_EVENT_NONE        = $00000000; // return no event
  WTS_EVENT_CREATE      = $00000001; // new WinStation created
  WTS_EVENT_DELETE      = $00000002; // existing WinStation deleted
  WTS_EVENT_RENAME      = $00000004; // existing WinStation renamed
  WTS_EVENT_CONNECT    = $00000008; // WinStation connect to client
  WTS_EVENT_DISCONNECT  = $00000010; // WinStation logged on without client
  WTS_EVENT_LOGON      = $00000020; // user logged on to existing WinStation
  WTS_EVENT_LOGOFF      = $00000040; // user logged off from existing WinStation
  WTS_EVENT_STATECHANGE = $00000080; // WinStation state change
  WTS_EVENT_LICENSE    = $00000100; // license state change
  WTS_EVENT_ALL        = $7fffffff; // wait for all event types
  WTS_EVENT_FLUSH      = DWORD($80000000); // unblock all waiters

type
  //WTS_CONNECTSTATE_CLASS - Session connect state
  WTS_CONNECTSTATE_CLASS = (
    WTSActive,              // User logged on to WinStation
    WTSConnected,          // WinStation connected to client
    WTSConnectQuery,        // In the process of connecting to client
    WTSShadow,              // Shadowing another WinStation
    WTSDisconnected,        // WinStation logged on without client
    WTSIdle,                // Waiting for client to connect
    WTSListen,              // WinStation is listening for connection
    WTSReset,              // WinStation is being reset
    WTSDown,                // WinStation is down due to error
    WTSInit);              // WinStation in initialization


  PWTS_SESSION_INFO = ^WTS_SESSION_INFO;
  WTS_SESSION_INFO = record
    SessionId: DWORD;              // session id
    pWinStationName: LPSTR;        // name of WinStation this session is connected to
    State: WTS_CONNECTSTATE_CLASS; // connection state (see enum)
  end;

  WTS_INFO_CLASS = (
    WTSInitialProgram,
    WTSApplicationName,
    WTSWorkingDirectory,
    WTSOEMId,
    WTSSessionId,
    WTSUserName,
    WTSWinStationName,
    WTSDomainName,
    WTSConnectState,
    WTSClientBuildNumber,
    WTSClientName,
    WTSClientDirectory,
    WTSClientProductId,
    WTSClientHardwareId,
    WTSClientAddress, //Returns pointer to a WTS_CLIENT_ADDRESS - structure
    WTSClientDisplay,
    WTSClientProtocolType);

  PWTS_CLIENT_ADDRESS = ^WTS_CLIENT_ADDRESS;
  WTS_CLIENT_ADDRESS = record
    AddressFamily: DWORD;          // AF_INET, AF_IPX, AF_NETBIOS, AF_UNSPEC
    Address: array [0..19] of BYTE; // client network address
  end;

const
  AF_INET      = 2; // internetwork: UDP, TCP, etc.
  AF_NS        = 6; // XEROX NS protocols
  AF_IPX      = AF_NS; // IPX protocols: IPX, SPX, etc.
  AF_NETBIOS  = 17; // NetBios-style addresses
  AF_UNSPEC    = 0; // unspecified
const
  wtsapi = 'wtsapi32.dll';
  Kernel = 'Kernel32.dll';

  function WTSWaitSystemEvent(hServer: THandle;
                              EventMask: DWORD;
                              var pEventFlags: DWORD): BOOL; stdcall;external wtsapi name 'WTSWaitSystemEvent';

  function WTSEnumerateSessions(hServer: THandle;
                                Reserved: DWORD;
                                Version: DWORD;
                                var ppSessionInfo: PWTS_SESSION_INFO;
                                var pCount: DWORD): BOOL; stdcall;external wtsapi name 'WTSEnumerateSessionsA';

  function WTSQuerySessionInformation(hServer: THandle;
                                      SessionId: DWORD;
                                      WTSInfoClass: WTS_INFO_CLASS;
                                      var ppBuffer: Pointer;
                                      var pBytesReturned: DWORD): BOOL; stdcall; external wtsapi name 'WTSQuerySessionInformationA';

  procedure WTSFreeMemory(pMemory: pointer); stdcall;external wtsapi name 'WTSFreeMemory';

  function ProcessIdToSessionId(dwProcessId: DWORD; var pSessionId: DWORD): BOOL; stdcall;external Kernel name 'ProcessIdToSessionId';

Function GetSessionUserName: String;
Var BufSize: Cardinal;
    pBuf: PChar;
    pSessionId : DWORD;
Begin
  ProcessIdToSessionId(GetCurrentProcessId(), pSessionId);
  if WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, pSessionId, WTSUserName, Pointer(pBuf), BufSize) then
  try
    SetString(result,pBuf,BufSize);
  finally
    WTSFreeMemory(pBuf);
  end;
end;

begin
  writeln(GetSessionUserName);
  readln;
end.
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 16.09.2015 в 20:23.
Slym вне форума Ответить с цитированием
Старый 20.09.2015, 13:29   #18
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Господин Slym, огромнейшая Вам благодарность за рабочий пример.
То что надо ! Пусть Господь дарит Вами здоровье !
п.с. репутации +

Тема себя исчерпала, но пусть висит для информации. На эту тему очень мало внятных ответов у гражданина Гула Яндеска Рамлеровича, все советуют проверять запуск explorer-а


Цитата:
Не совсем понятно чего ты желаешь? Нужен именно запуск от другого пользователя, но чтобы писалось в папки того пользователя чей рабочий стол сейчас активен?
Поясняю предназначение приложения.
Есть доменная сеть, в которой на каждом рабочем месте может сидеть любой человек с определёнными правами. Есть приложение, которое выполняет роль программы-аналог uvScreenCamera. видео объективный контроль рабочих мест. Задача, сделать так, чтобы видеофайлы которые сливаются каждые 10 минут на диск... допустим D, были доступны администраторам доменной сети, и не были доступным никому другому (ну чтобы пользователь не стёр ролики как он смотрел в рабочее время "порнуху" )

Решение:
Доменный админ, прописывает моему приложению особый статус и запускает его от минеи доменного админа. Приложением может лазить в папку-хранилище, может там создавать файлы, писать в них и т п. Приложение запускается всегда од одного имени VideoAdmin с особыми правами. Теперь, приложению нужно определить в какую именно папку в хранилище писать, Для каждого юзера создаётся своя папка. Так вот, чтобы узнать имя юзера стартанувшего по автозапуску моё приложение мне нужно было узнать кто зашёл в систему. Папка формируется в формате USER_IP. Например JUDAS_666.666.666.666
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 20.09.2015 в 13:40.
JUDAS вне форума Ответить с цитированием
Старый 20.09.2015, 13:39   #19
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Задрали пользователей. Даже порнуху нельзя беднягам посмотреть на работе
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.09.2015, 13:44   #20
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Про порнуху утрирую. Суть, видеть что пользователь клацает на специализированных АРМ, чтобы потом, когда начинаются разборки, пользователь не включал дурачка мол "я не понимаю как моя фамилия оказалась в объективном контроле базы данных, наверное в это время я ходил(ходила) кушать или писять". С этой программой, которая параллельно пишет содержимое РМ + параллельно с веб камеры (окно в окне) сразу восстанавливается память и логика понимания.
п.с. а работа у нас такая, что за косяк можно загреметь от 5 до 8-ми
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно получить имя пользователя, запустившего процесс? Сергей089 Win Api 1 19.01.2014 18:30
Как получить имя пользователя, блокируещего файл ACCuCTEHT Помощь студентам 2 08.02.2013 21:47
Как получить имя текущего пользователя в windows? betirsolt Общие вопросы Delphi 2 30.08.2011 06:27
Получить имя активного дочернего окна в MDI JeyKip Общие вопросы C/C++ 4 05.12.2010 02:59
Как средствами VBA получить доменное имя пользователя? Прохожий Microsoft Office Excel 3 04.10.2008 18:28