Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Проблемы с определением SID пользователя (http://forum.oszone.net/showthread.php?t=339778)

macF 21-03-2019 10:06 2864420

Проблемы с определением SID пользователя
 
Вот рабочий сценарий для определения SID.

SID мне нужен для работы с реестром в разделе HKU.
Помимо прочего необходимо также добавлять и изменять параметры в разделе HKLM.
Так как у пользователей нет прав администратора - скрипт приходится запускать из под учетки с правами админа.
А вот здесь и проблема. Если запустить сценарий ниже с правами админа - я получаю SID учетки этого админа, а не текущего залогиненного пользователя.
Как получить SID текущего пользователя вошедшего в систему ?

Код:

Set wshShell = CreateObject( "WScript.Shell" )
strUserName = wshShell.ExpandEnvironmentStrings( "%USERNAME%" )
Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objAccount = objWMIService.Get("Win32_UserAccount.Name='" & strUsername & "',Domain='" & strComputer & "'")
getSID = objAccount.SID
MsgBox getSID


Busla 21-03-2019 11:02 2864426

Это плохая идея: пользователь вообще может быть не залогинен. А может быть залогинено несколько пользователей.

YuS_2 21-03-2019 12:34 2864437

Цитата:

Цитата macF
Как получить SID текущего пользователя вошедшего в систему ? »

Powershell & WMI
Можно оформить в виде функции...
Для powershell v 2.0, необходимо заменить gcim на gwmi
Код:

$loginuser = (gcim win32_computersystem).username|split-path -leaf 
$user = gcim win32_useraccount|
?{$_.disabled -eq $false -and ($_.name -eq $loginuser -or $_.fullname -eq $loginuser)}|
select name,fullname,sid
$userprofile = gcim win32_userprofile|
?{$_.special -eq $false -and $_.loaded -eq $true -and $_.sid -eq $user.sid}|select sid,localpath

$user|add-member -mem noteproperty -name 'LocalPath' -value $($userprofile.localpath)

$user|fl *


Iska 21-03-2019 23:24 2864538

macF, проблема в том, что Вы что-то делаете не так. Не работайте с HKU. Работайте с HKCU из logon-скриптов. С HKLM работайте из startup-скриптов. Не должно быть никаких:
Цитата:

Цитата macF
Помимо прочего необходимо также добавлять и изменять параметры в разделе HKLM.
Так как у пользователей нет прав администратора - скрипт приходится запускать из под учетки с правами админа. »


macF 22-03-2019 02:46 2864553

Цитата:

Это плохая идея: пользователь вообще может быть не залогинен. А может быть залогинено несколько пользователей.
У нас рабочая группа. Win7 и выше.
Сценарий запускается штатно из планировщика с правами админа при входе любого пользователя и задержкой 1 минута.
За АРМ всегда работает только один юзер. Смена пользователя не активна.

Цитата:

macF, проблема в том, что Вы что-то делаете не так. Не работайте с HKU. Работайте с HKCU из logon-скриптов. С HKLM работайте из startup-скриптов.
Сама затея здесь предельно проста: не дать юзеру нажать (если ему вдруг вздумается) через меню пуск на рестарт, выключение, завершения сеанса или смена пользователя во время выполнения архивации. Только блокировка.

1. До архивации WBadmin оставить в меню пуск только кнопку блокировать (без перезагрузки).
Ручками вот это работает:

Код:

'Убрать из меню пуск все кнопки КРОМЕ завершение сеанса, сменить пользователя, блокировать!
RegShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoClose", "1", "REG_DWORD"
'Сменить пользователя"
RegShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\HideFastUserSwitching", "1", "REG_DWORD"
'Выйти из системы"
RegShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\StartMenuLogOff", "1", "REG_DWORD"

А это работает только если получить SID текущего порльзователя!
Код:

'Выбрать блокировку в меню пуск по умолчанию
RegShell.RegWrite "HKEY_USERS\"&getSID&"\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_PowerButtonAction", "200", "REG_DWORD"

далее обновить групповую политику для приминения изменений
Код:

Start=WshShell.Run("""C:\Windows\System32\gpupdate.exe"" /force",1,true)
Я бы в этот раздел HKU просто так и не лез бы. Может Вы знаете как это реализовать в HKLM или HKCU ? Я ничего рабочего для себя так и не нашел.
Через gpedit.msc тема таже. Разница только в том что там два параметра и тот же HKU.

Iska 22-03-2019 05:38 2864555

Цитата:

Цитата macF
Цитата:

Цитата Busla
Это плохая идея: пользователь вообще может быть не залогинен. А может быть залогинено несколько пользователей. »

У нас рабочая группа. Win7 и выше. »

macF, это вообще никак не кореллирует — наличествует домен, або нет, Windows XP или Windows 7.

Цитата:

Цитата macF
Сама затея здесь предельно проста: не дать юзеру нажать (если ему вдруг вздумается) через меню пуск на рестарт, выключение, завершения сеанса или смена пользователя во время выполнения архивации. Только блокировка. »

Для этого предназначены logoff/shutdown-скрипты (только увеличьте им максимально допустимое время выполнения с умолчальных 10/15 минут). А нажать он может и на Reset, и на кнопку на сетевом фильтре.

Цитата:

Цитата macF
Ручками вот это работает … далее обновить групповую политику для приминения изменений»

А теперь представьте, что произошёл некий йок во время этого процесса. То-то радости будет. Не делайте так.

macF 26-04-2019 06:47 2869222

Код:

Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName

Set objWMIService = GetObject( "winmgmts:\\.\root\cimv2" )
Set colItems = objWMIService.ExecQuery( "Select * from Win32_ComputerSystem" )
For Each objItem in colItems
    strUserName = objItem.UserName
    'WScript.Echo "User Name: " & strUserName 
Next

i_1 = len(strUserName)
i_2 = InStr(1,strUserName,"\",vbTextCompare)
i_3 = i_1 - i_2
strUserName = Right(strUserName, i_3)

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
Set objAccount = objWMIService.Get("Win32_UserAccount.Name='" & strUsername & "',Domain='" & strComputer & "'")
getSID = objAccount.SID
MsgBox getSID



Время: 21:59.

Время: 21:59.
© OSzone.net 2001-