1С запущена из под админа?

Автор trdm, 04 июня 2025, 11:52

« назад - далее »

trdm

Работал с почтовыми задачами, и одна из задач - задание каталогов для временных файлов почты.
Так вот если 1ёС запущена на из под админа, тогда там траблы с созданием каталогов.
Ну т.е. с последующим их использованием.
Можно ли как-то узнать, что 1С запущена под админом?

Злоп

А в каталоге пользователя доступ вроде полный должен быть - создавать там?

Харлампий Дымба

А что такое "под админом"?
Узнать имя учетной записи пользователя из 1С? Вот пример:
Попытка
    scrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl");
    scrptCtrl.language="vbscript";
    scrptCtrl.addcode("
    |
    |Function GetUser()
    |Set WSHShell = CreateObject(""WScript.Shell"")
    |Set WshSysEnv = WshShell.Environment(""Process"")
    |GetUser = WshSysEnv(""Username"")
    |End Function
    |");
    
    ИмяПользователяТерминала = scrptCtrl.run("GetUser");
Исключение
    ИмяПользователяТерминала = "не получилось";
КонецПопытки;

Или узнать права на запись в конкретную папку? Тогда возможно проще там что-то попробовать создать, а затем считать - если получилось, значит права есть.

А КаталогВременныхФайлов() не получится не использовать? Или как Злоп советует.

Злоп

"попробовать создать, а затем считать - если получилось, значит права есть."
- вполне рабочий вариант, я так делал

Злоп

Если через ФС копировать файл или записывать в папку где нет прав - платформа ничего не скажет, все пройдет типа нормально, но итог будет бяковый.

p18

Цитата: Злоп от 04 июня 2025, 18:39Если через ФС копировать файл или записывать в папку где нет прав - платформа ничего не скажет, все пройдет типа нормально, но итог будет бяковый.
странно. но если так
ТТ=СоздатьОбъект("Текст");
ТТ.ДобавитьСтроку("Тест");
Попытка
 ТТ.Записать(путь куда надо);
исключение
 Сообщить ("Прав нет!");
КонецПопытки;
ТТ=СоздатьОбъект("Текст");
Попытка 
 ТТ.Открыть(путь куда надо);
 Сообщить ("Права есть");
Исключение 
 Сообщить ("Прав точно нет");
КонецПопытки;

trdm

Я просто видел код на си++ там просто у процесса запрашивается какой-то токен и анализируется.
задачка не совсем для formex, но...

ЯнСмит

как вариант запарсить текстовую выдачу команды "net user NAME"

Arbuz

Set fso = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
Set file = fso.CreateTextFile("C:\test_admin.txt", True)
If Err.Number = 0 Then
    WScript.Echo "Права администратора есть"
    file.Close
    fso.DeleteFile("C:\test_admin.txt")
Else
    WScript.Echo "Права администратора отсутствуют"
End If
On Error GoTo 0

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colGroups = objWMIService.ExecQuery("Select * from Win32_GroupUser Where GroupComponent=""Win32_Group.Domain='" & strComputer & "',Name='Administrators'""")

isAdmin = False
Set objNetwork = CreateObject("WScript.Network")
currentUser = objNetwork.UserDomain & "\" & objNetwork.UserName

For Each objGroup In colGroups
    ' Получаем имя пользователя из связанного объекта PartComponent
    Set colItems = objWMIService.ExecQuery("Select * from Win32_UserAccount Where __RELPATH='" & Replace(objGroup.PartComponent, """", "'") & "'")
    For Each objItem In colItems
        fullName = objItem.Domain & "\" & objItem.Name
        If LCase(fullName) = LCase(currentUser) Then
            isAdmin = True
            Exit For
        End If
    Next
    If isAdmin Then Exit For
Next

If isAdmin Then
    WScript.Echo "Пользователь входит в группу администраторы"
Else
    WScript.Echo "Пользователь не является администратором"
End If

Есть еще в проекте wsusoffline маленькая (37kB) утилитка isAdmin — она просто даёт код возврата 1 если пользователь не админ, могу выложить.
Но самый простой и надёжный первый вариант.