Страница 1 из 1

Get Windows Local & Domain User SID and Login User Name

Добавлено: 15 Декабрь 2018, 15:00
Developer
Привет всем!

Есть ли рабочий пример в коде Clarion получения SID (GUID) и Login имени текущего локального и доменного пользователя Windows из приложения Clarion без прав администратора? :wink:

Get Windows Local & Domain User SID and Login User Name

Добавлено: 15 Декабрь 2018, 16:05
kreator
Eсть функция getUserName. Без домена, кажется.С доменом надо разбираться отдельно. Могу посмотреть, что есть у нас. На память - из реестра вытаскивается. Но могу ошибаться. А зачем?

Get Windows Local & Domain User SID and Login User Name

Добавлено: 15 Декабрь 2018, 16:25
Developer
kreator писал(а): 15 Декабрь 2018, 16:05Eсть функция getUserName. Без домена, кажется.С доменом надо разбираться отдельно. Могу посмотреть, что есть у нас. На память - из реестра вытаскивается. Но могу ошибаться. А зачем?
Разграничение доступа и протокол: кто, когда и что делал и под каким логином был зарегистрирован пользователь работавший с приложением Clarion с SQL сервером :mrgreen:

Kreator, посмотри пожалуйста.

Через системные утилиты есть такая возможность, а вот из кода Clarion пока не обнаружил :?

Get Windows Local & Domain User SID and Login User Name

Добавлено: 15 Декабрь 2018, 21:38
RaFaeL
Если пользователь работает с SQL сервером, зачем это все делать в Кларионе? Это надо делать триггером на стороне сервера

Вот этот код используем для авторизации по текущему пользователю домена

Код: Выделить всё

            mOcx = Create(0, CREATE:ole)
            mOcx{PROP:Create} = 'ADSystemInfo'
            If mOcx{PROP:Object} Then
              tcs = mOcx{'UserName'}
              mOcx{PROP:Release} = 1
              mOcx{PROP:deactivate} = 1
            End
            Destroy(mOcx)
            if clip(tcs)<>''
              objConnection = Create(0, CREATE:ole)
              objConnection{PROP:Create} = 'ADODB.Connection'
              If objConnection{PROP:Object} Then 
                objConnection{'Provider'} = 'ADsDSOObject'
                objConnection{'Open'}
                objRecordset = objConnection{'Execute("SELECT sAMAccountName, CN FROM ''LDAP://' & clip(tcs) &'''")'}
                LOC:UserName=clip(objConnection{objRecordset &'.Fields.Item("sAMAccountName").Value'})
                objConnection{PROP:Release} = 1
                objConnection{PROP:deactivate} = 1
              end
            end
            Destroy(objConnection)
Вероятно, другие item дадут другие параметры, поищи документацию

Get Windows Local & Domain User SID and Login User Name

Добавлено: 15 Декабрь 2018, 23:53
Developer
Rafael, спасибо за пример :D

Попробую.

Примеры для получения Windows SID Current User (Local / Domain) есть в основном на C++, C#, Delphi - на Clarion ничего не обнаружил :(

Get Windows Local & Domain User SID and Login User Name

Добавлено: 16 Декабрь 2018, 5:17
morkovin
Через системные утилиты есть такая возможность, а вот из кода Clarion пока не обнаружил
Ну так запускай утилиту из клариона. Вывод перенаправь в файл и потом можно парсить его.

https://docs.microsoft.com/en-us/sysint ... psloggedon

Get Windows Local & Domain User SID and Login User Name

Добавлено: 16 Декабрь 2018, 15:36
kreator
Вот здесь проверка на пользователя и домен - viewtopic.php?f=1&t=2148.
Есть у нас вот такое определение (сразу уж всё):

Код: Выделить всё

GLO:TempPath = GETTEMPPATH()
LOC:TempString = ''
GetRegSubKeys(REG_LOCAL_MACHINE , 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces' , LOC:RegSubKeysQueue)
loop i#=1 to records(LOC:RegSubKeysQueue)
  get(LOC:RegSubKeysQueue , i#)
  s" = GetReg(REG_LOCAL_MACHINE , 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\' & clip(LOC:RegSubKeysQueue.LOC:RegSubKeyName), 'IPAddress')
  if s"[1:7]<>'0.0.0.0'
    LOC:TempString = clip(LOC:TempString) & ' ' & clip(s")
  end  
  s" = GetReg(REG_LOCAL_MACHINE , 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\' & clip(LOC:RegSubKeysQueue.LOC:RegSubKeyName), 'DhcpIPAddress')
  if s"[1:7]<>'0.0.0.0'
    LOC:TempString = clip(LOC:TempString) & ' ' & clip(s")
  end  
end  
LOC:TempString = LOC:TempString[2:len(clip(LOC:TempString))]
GLO:IPAddresses = LOC:TempString
GLO:UserName = GetUserName() 
GLO:ComputerName = GetReg(REG_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters' , 'NV Hostname')
GLO:Domain = GetReg(REG_LOCAL_MACHINE , 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters' , 'NV Domain')
А вообще есть как-бы тонкость. Вот у нас в конторе несколько доменов. В реестре, похоже, храниться домен, где зарегистрирован данный комп. Но пользователь может быть из другого домена. Пример из верхней ссылки позволяет вытащить из AD полную инфу. Но тут как бы не проколоться, потому что (как у нас) есть домен-отец и домены-дети. Если не указать домен-отца, то сервис LDAP будет искать пользователя по всему миру. А где взять имя домен-отца? Скорее это должна быть глобальная настройка, задающаяся руками.
Есть ещё фигня, которую я пытался решить, но сразу не получилось, отложил. Пользователя уволили и его запись в AD отключена, может быть отключена по причине отпуска сотрудника (такое практикуется, сотруднику бывает запрещено работать в отпуске). И вот такой пользователь пришёл на работу, отключил комп от сети, и зашёл на этот под своей отключенной учёткой. Винда пропускает проверку на отключенность в этой ситуации. Потом пользователь включает в сеть и может делать что хочет. Нужна проверка на действующий пароль. Пример из верхней ссылки ответа на это не даёт.
И ещё. Если к SQL-серверу пользователь логинится через доменную учётку, может, действительно, логично воспользоваться SQL-сервером?

Get Windows Local & Domain User SID and Login User Name

Добавлено: 16 Декабрь 2018, 18:53
Developer
Kreator, благодарю за пример и обозначенные возможные нюансы! :D

Как я понял, необходимо проверять на практике :wink:

Get Windows Local & Domain User SID and Login User Name

Добавлено: 16 Декабрь 2018, 19:03
Developer
morkovin писал(а): 16 Декабрь 2018, 5:17
Через системные утилиты есть такая возможность, а вот из кода Clarion пока не обнаружил
Ну так запускай утилиту из клариона. Вывод перенаправь в файл и потом можно парсить его.

https://docs.microsoft.com/en-us/sysint ... psloggedon
Игорь, спасибо за отклик и предложение, но я сторонник по возможности, быть более независимым от сторонних утилит :wink:

Но как вариант - предложенное тобой решение вполне реально - буду рассматривать и проверять все предложения :wink:

Get Windows Local & Domain User SID and Login User Name

Добавлено: 16 Декабрь 2018, 21:13
morkovin
OddJob от CapeSoft:
OddJob also provides the ability to pass data to a started process (via the Standard Input as well as on the command line), which allows command line applications to be run and data passed to them, as well as retrieving the result back from the process. This opens up a huge number of command line tools to your application, from simple command line clients, to command line server, compilers and even batch files.

Get Windows Local & Domain User SID and Login User Name

Добавлено: 16 Декабрь 2018, 21:34
morkovin
кто, когда и что делал и под каким логином был зарегистрирован пользователь работавший с приложением Clarion с SQL сервером
Очевидно, что такую информацию надо получать через веб-интерфейс из любой точки мира. Кларион тут не подходит.
Решение
Node.js+WebSocket+SysUtilites