Имя: Пароль:
1C
1C 7.7
v7: 100%-ная выгонялка пользователей
,
0 extrim-style
 
15.03.16
15:10
Задача: обеспечить монопольный режим для sql-базы. Подскажите хорошую выгонялку без лишнего функционала (бэкап не нужен, нужно по возможности закрытие sql-соединений, kill process и т.п.).
1 Волшебник
 
модератор
15.03.16
15:11
2 Злопчинский
 
15.03.16
15:16
рассылка по сети сообщений "через 1 мин база будет принудительно завершена", через 1мин10 сек тупо киляешь все 1ски и запускаешься монопольно
3 vde69
 
15.03.16
15:17
важно не выгнать а не пустить (даже в окно авторизации), большинство выгонялок это не умеют делать
4 vde69
 
15.03.16
15:18
(2) а если у меня 10 баз открыто, ты будешь килять все 10?
5 extrim-style
 
15.03.16
15:18
(1) я искал. И даже здесь - Книга знаний: Выгонялка пользователей для 1С 7.7, 8.0, 8.1. Кучу времени потратил, но пока еще ничего внятного не нашел.
(2) сейчас в конфе реализована выгонялка по константе, но она работает раз в минуту, т.е. пользователь все-равно может приконнектиться
(3) да, это и нужно
6 extrim-style
 
15.03.16
15:19
(4) по-моему taskkill можно выборочно сделать
7 vde69
 
15.03.16
15:20
у меня есть такая хрень http://catalog.mista.ru/public/16686/

она не выгоняет, но позволяет не допустить входа или открытие окна авторизации
8 GROOVY
 
15.03.16
15:20
Сеть вырубаешь на минуту... Гарантия 100%
9 extrim-style
 
15.03.16
15:21
(7) спасибо. Функционал избыточен для моей задачи.
10 ДенисЧ
 
15.03.16
15:21
перевести базу в сингл моде и не выделываться
11 extrim-style
 
15.03.16
15:24
Детализирую: мне нужно автоматическое открытие периода)
Я так понял, конкретно "открывать период автоматом" не проблема, а проблема как раз в осуществлении монопольного доступа.
12 extrim-style
 
15.03.16
15:25
(10) регламентный пользователь не сможет зайти?
13 ДенисЧ
 
15.03.16
15:27
(12) а кто это?
14 vde69
 
15.03.16
15:28
используй (7)...

там можно указать кто может а кто нет заходить монопольно  и еще куча полезностей....

я когда себе сделал был доволен как удав, куча мелкого гемороя ушла....
15 mikecool
 
15.03.16
15:28
отрубить коннекты к каталогу с базой, забрать права на каталог
16 Cyberhawk
 
15.03.16
15:29
Переименовать каталог с базой на время
17 extrim-style
 
15.03.16
15:29
(13) это - специально выделенный пользователь 1С с необходимыми правами для открытия периода (живого не предлагать).
18 extrim-style
 
15.03.16
15:30
(15) готовые решения есть?
19 Новиков
 
15.03.16
15:31
20 mikecool
 
15.03.16
15:31
(18) эээ, хенд-мейд, зачем решение? это делается в консоли управления компом сервера
21 extrim-style
 
15.03.16
15:31
(20) вручную?
22 vde69
 
15.03.16
15:32
если у тебя подобные проблеммы, то открой период на год вперед и не парься...
23 Fish
 
15.03.16
15:34
(15) Так это для файловой, а в (0) скульная.
24 Mikeware
 
15.03.16
15:35
(17) а зачем? хранимкой остатки на новый период сгенерил, в 1ссистем поставил ТА на  начало этого периода
25 Mikeware
 
15.03.16
15:35
и пользователей выгонять не нужно - пущай себе работают...
26 ДенисЧ
 
15.03.16
15:35
(24) У человека проблемы выгнать пользователей, а ты ему вон что предлагаешь...
27 extrim-style
 
15.03.16
15:39
(24) Насколько я помню УстановитьТАНа используется только в монопольном режиме.
28 mikecool
 
15.03.16
15:48
(23) у скульной семерки каталог все равно есть
29 Mikeware
 
15.03.16
16:33
(27) и что?
30 ADirks
 
16.03.16
11:41
нашёл в кучке скрипт, убивающий все процессы 1С, связанные с указанным каталогом базы
К нему нужна утилитка handle.exe от Марка Руссиновича (SysInternals)


var wsh = new ActiveXObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var net = new ActiveXObject("WScript.Network");

var DomainName = "";
var IBDir = "";
var fShowOnly = false;
var Flag_KillAll = false;
var ThisComputer = net.ComputerName;
var TempPath = wsh.ExpandEnvironmentStrings("%TEMP%");
try {
    if( !fso.DirectoryExists(TempPath) ) TempPath = "";
} catch(err) {
    TempPath = ".";
}


ProcessCommandLine();
KillProcesses(IBDir, DomainName);

//=====================================================================================
//=====================================================================================
//=====================================================================================

function KillProcesses(IBDir, DomainName)
{
    if( DomainName != null && DomainName != "" )
    {
        Debug('KillDomain');
        ADSI = GetObject("WinNT://" + DomainName);
        ADSI.Filter = Array("computer");
        Comp_enum = new Enumerator(ADSI);
        for(; !Comp_enum.atEnd(); Comp_enum.moveNext() )
        {
            var Comp = Comp_enum.item();
            WScript.Echo("Comp. "+Comp.Name);

            if( Comp.Name.toLowerCase() == "adirks" )
            {
                KillOnComputer(IBDir, Comp.Name);
            }
        }
    }
    else
    {
        Debug('KillOnComputer');
        KillOnComputer(IBDir, ThisComputer);
    }

}

function KillOnComputer(IBDir, ComputerName)
{
    Debug(ComputerName+": "+"winmgmts:{ImpersonationLevel=Impersonate}!\\\\" + ComputerName + "\\Root\\CIMV2");
    try {
        WMI = GetObject("winmgmts:{ImpersonationLevel=Impersonate}!\\\\" + ComputerName + "\\Root\\CIMV2");
    } catch(err) {
        return;
    }
    
    Proc_enum = new Enumerator( WMI.ExecQuery("SELECT Name, ProcessID FROM Win32_Process WHERE Name = '1cv7.exe' or Name = '1cv7s.exe' or Name = '1cv7l.exe'") );
    for(; !Proc_enum.atEnd(); Proc_enum.moveNext() )
    {
        var Proc = Proc_enum.item();
        var strNameOfUser = '', strUserDomain = '';
        var nRetCode = Proc.GetOwner(strNameOfUser, strUserDomain);

        //WScript.Echo(Proc.Name+": "+Proc.ProcessID+";  "+nRetCode+" - "+strUserDomain+"\\"+strNameOfUser);
        Debug(Proc.Name+": "+Proc.ProcessID);
        if( NeedKill(Proc.ProcessID, IBDir) )
        {
            WScript.Echo("Terminate process "+Proc.Name+": "+Proc.ProcessID);
            Debug("Terminate process "+Proc.ProcessID);
            if( !fShowOnly )
            {
                Proc.Terminate
            }
        }
    }
}


function NeedKill(ProcID, IBDir)
{
    if( Flag_KillAll ) return true;
    
    var HandlesFName = TempPath+"\\1c~kill~handles.tmp";
    var res = wsh.Run("cmd /C handle.exe -p "+ProcID+" >"+HandlesFName, 2, true);
    var HandlesFile = fso.OpenTextFile(HandlesFName);
    var text = HandlesFile.ReadAll();
    HandlesFile.Close();
    //fso.DeleteFile(HandlesFName);
    
    var re = new RegExp('\\s*\\S+:\\s+\\S+\\s*(.*)', 'ig');
    var FName = (IBDir+'\\1cv7.lck').toLowerCase();
    while( (matches = re.exec(text)) != null )
    {
        var HandleName = matches[1].toLowerCase();
        HandleName = HandleName.replace(/[\r\n]*/g, '');
        Debug('Need kill?  '+FName+' == '+HandleName);
        if( FName == HandleName ) return true;
    }
    return false;
}

function ProcessCommandLine()
{
    var args = WScript.Arguments;
    if( args.length == 0 )
    {
        Help();
        WScript.Quit();
    }
    
    for( i = 0; i < args.length; i++ )
    {
        if( args(i) == "-d" )
        {
            IBDir = args(++i);
        }
        else if( args(i) == "--domain" )
        {
            DomainName = args(++i);
        }
        else if( args(i) == "--all" )
        {
            Flag_KillAll = true;
        }
        else if( args(i) == "-i" )
        {
            fShowOnly = true;
        }
        else
        {
            Help();
            WScript.Quit();
        }
    }
    
    if( IBDir.length == 0 && !Flag_KillAll )
    {
        WScript.Echo("Не указан каталог базы данных! (ключ -d <IBDir>)");
        WScript.Quit();
    }
    WScript.Echo("'" + IBDir + "'");
}


function Help()
{
    Help = "Использование:\n\
\tKill1C.js {-d <Каталог базы данных>|--all} [--domain <имя домена>]  [-i]\n\
Каталог базы нужно указывать без финального слэша ('\\')\n\
Если указан параметр --all, то уничтожаются процессы независимо от базы данных\n\
Если имя домена не указано, то уничтожаются процессы только на текущей машине.\n\
-i - показывает список процессов, подпадающих под указанные условия. \n\
Для работы требуется утилитка handle.exe от sysinternals (http://www.sysinternals.com/)\n\
";

    WScript.Echo(Help);
}

function Debug(msg)
{
    return;
    var f = fso.OpenTextFile("debug", 8, true);
    f.WriteLine(msg);
    f.Close();
}
31 aka AMIGO
 
16.03.16
11:48
32 Garykom
 
гуру
16.03.16
12:08
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=539761&threadtype=0

писал когда то обработку для УТ10 чтобы во всех вариантах в т.ч. файловом хорошо блокировало и разблокировало

через прямую запись в файл блокировки файловой базы делал, с серверной базой оно и так замечательно пашет
33 Мимохожий Однако
 
16.03.16
12:12
(32)1с77
34 Garykom
 
гуру
16.03.16
12:44
(33) а какая разница? аналогично разобраться с файлом блокировок или таблицей и "не пущщать" новых в базу

всем старым сообщение, если не вышли в срок то рубим уже через http://catalog.mista.ru/public/90647/
35 Garykom
 
гуру
16.03.16
12:45
(34)+ под не пущщать это банально пароли скажем меняются на другие или еще как
36 ADirks
 
16.03.16
12:45
фигасе, как форум то заплющило... не знаю как кто, а я своего поста прочитать не могу :)
Скрипт убил ещё и мисту попутно :))

а вот, ещё вариант, кажется от Орефкова
нужны ещё grep и gawk

echo off


SET lockfile=X:\1C_Bases\Buh\1cv7.lck
handle %lockfile% | grep -E 1cv7[sl]*.exe | gawk "{ print system(\"pskill \" $3) }"
37 Mikeware
 
16.03.16
12:48
(36)нормально он читается....
38 aka AMIGO
 
16.03.16
12:51
(36) Я скрыл текст, нажми кнопку >> под твоим ником - текст развернётся
39 ADirks
 
16.03.16
12:54
(38) не, там вообще жестко всё было, всё форматирование испортилось, от своего поста я только заголовок видел. Щас нормально всё...
40 Dotoshin
 
16.03.16
13:42
(8) Павел, да вы просто хакер!
41 ManyakRus
 
16.03.16
18:43
Выгонялка:
net share sql /delete

Запускалка:
net share sql=C:\db\dbv7\iso-trd-sql /grant:Все,full
42 romix
 
16.03.16
19:20
Я делал выгонялку и не пускалку.
http://x-romix.narod.ru/
Вышибает любые сеансы, предупреждает пользователей с таймером в трее. Корректно не пускает.
http://x-romix.narod.ru/2006_12_05_Starter1C.rar
43 Лефмихалыч
 
16.03.16
21:07
100% - это вот:
стопроцентная выгонялка пользователей
Программист всегда исправляет последнюю ошибку.