Имя: Пароль:
1C
 
Как узнать у кого "висит" Авторизация доступа?
Ø
0 Kif
 
08.12.05
23:29
В "Мониторе", естественно нет Юзера который не зарегистрировался, но базу "держит"! Конфу не обновишь, приходится бегать по кабинетам (если они открыты) и искать: кто не набрал пароль и ушел на обед!
Как можно это отследить?
1 Young
 
08.12.05
23:36
Рубить все процессы 1cv77s.exe по сетке.
2 Мишка Олимпийский
 
08.12.05
23:39
я для рубки юзеров определенной базы использую Admin1C от MMF. И сообщения рассылаю. Еще ДД можно посмотреть ;)
3 VZ
 
08.12.05
23:39
Как обычно, автор shaharbA (Abraham$)
...
const ForReading=1
set fso=CreateObject("Scripting.FileSystemObject")
Set WSHShell = CreateObject("WScript.Shell")
res=WSHShell.run("cmd.exe /c net file>lockfile.txt",,true)
set f=fso.OpenTextFile("lockfile.txt", ForReading, False)
do while Not f.AtEndOfStream
x=f.readline()
if instr(lcase(x),"users.usr") then
res=WSHShell.run("cmd.exe /c net send " & trim(mid(x,52,21)) & " ""Ах ты сволоч, чего незакрыл окно логина 1Сэ...?!""",,true)
res=WSHShell.run("cmd.exe /c net file " & trim(mid(x,1,11)) & " /close",,true)
Wscript.echo res
end if
loop
dim arr
strComputerName="1cserver"
'"const ForReading=1" & vbCrLf _
a= "set fso=CreateObject(""Scripting.FileSystemObject"")" & vbCrLf _
& "Set WSHShell = CreateObject(""WScript.Shell"")" & vbCrLf _
& "res=WSHShell.run(""cmd.exe /c net file>lockfile.txt"",,true)" & vbCrLf _
& "set f=fso.OpenTextFile(""lockfile.txt"", 1, False)" & vbCrLf _
& "do while Not f.AtEndOfStream" & vbCrLf _
& "x=f.readline()" & vbCrLf _
& "if instr(lcase(x),""users.usr"") then" & vbCrLf _
& "res=WSHShell.run(""cmd.exe /c net file "" + trim(mid(x,1,11)) + "" /close"",,true)" & vbCrLf _
& "res=WSHShell.run(""cmd.exe /c net send "" + trim(mid(x,52,21)) + """" Ax ty svoloch, chego ne zakryl okno logina 1C...?! """",,true)" & vbCrLf _
& "end if" & vbCrLf _
& "loop"
arr=split(a,vbCrLf)
for i=lbound(arr) to ubound(arr)
arr(i)=replace(arr(i),chr(34) & chr(34),chr(34))
next
'WScript.Echo a
Set objClass = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputerName & "\root\CIMV2:Win32_Process")
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputerName & "\root\CIMV2")
Set objStartup = objService.Get("Win32_ProcessStartup")
Set objConfig = objStartup.SpawnInstance_
Res = objClass.Create("cmd.exe /c echo " & chr(39) & "...>FileUserLockRemove.vbs", Null, objConfig, PID)
'WScript.Echo res
Wscript.sleep 100
for each c in arr
Res = objClass.Create("cmd.exe /c echo " & c & ">>FileUserLockRemove.vbs", Null, objConfig, PID)
Wscript.sleep 100
next
Res = objClass.Create("WScript.exe FileUserLockRemove.vbs //b", Null, objConfig, PID)
Wscript.sleep 1000
Res = objClass.Create("cmd.exe /c del FileUserLockRemove.vbs", Null, objConfig, PID)
If Res <> 0 Then
  WScript.Echo "Код ошибки: " & Res
End If
WScript.sleep 1000
Set colProcessList = objService.ExecQuery("Select * from Win32_Process Where Name = 'WScript.exe'")
For Each objProcessT in colProcessList
if objProcessT.ProcessID=PID then
     WScript.echo objProcessT.Terminate()
end if
4 Чучундер
 
08.12.05
23:41
Вжик, а как этот скрипт запускать? т.е. куда его записать/как его выполнить - буквально в двух словах...
А?
5 Дурочка 1С
 
08.12.05
23:43
Посмотреть кто держит файл user.def ...
6 Чучундер
 
08.12.05
23:44
Там next по-моему забыт в конце...
7 Kif
 
08.12.05
23:44
Пасиба! Попробую...
8 VZ
 
08.12.05
23:45
(4) Вестимо, с сервера :)) Не с РС же... тебе ее отыскать надо. А уж потом... отыметь :)))
9 Чучундер
 
08.12.05
23:47
(5) не, наверное user.dat?
10 smaharbA
 
08.12.05
23:47
Блин неужто это все я накабузял, там помоему скрещщено (в тоже время ктото задавал вопрос как запустить скрипт удаленно с доступом к сети, этт не такто просто кстати)...
11 smaharbA
 
08.12.05
23:49
Аааа, точно, это два скрипта, один на сервере, а другой с любого места...
12 VZ
 
08.12.05
23:49
(6) Ты прав, забыт :(
(10) Ты, ты, не сомневаяся ;) А после сообщения можно удаленный шутдаун жахнуть...
13 Чучундер
 
08.12.05
23:49
(10) Вот-вот, хочется со своей рабочей машины заранить такой скрипт и поиметь нарушителя....
14 smaharbA
 
08.12.05
23:52
(13) Можно батником, если нада то завтро в "нормальном" изложении...
16 smaharbA
 
08.12.05
23:55
(15) ага, адрес записал, иду уже спать...
17 smaharbA
 
08.12.05
23:57
+ Кстати, это не страшно что окно открыто, это можно обходить, но надо чтоб скрипт на машине с базой работал, в нем думаю строк 10 будет...
Завтра...
18 VZ
 
08.12.05
23:59
(17) Ежели здесь выложишь, учти: я запишу! ;)
20 smaharbA
 
09.12.05
16:58
strComputer = "1cserver" 'Сервер баз, проверяемый...
strComputerRegBase="1cserver" 'Компьютер с которого берется список баз...
Set WSHShell = CreateObject("Wscript.Shell")
Set Locator= CreateObject("WBemScripting.SWbemLocator")
Set Service=Locator.ConnectServer()
Set oExec=WSHShell.Exec("rundll32 kernel32,Sleep")
PID=Service.Get("Win32_Process.Handle=" & oExec.ProcessID).ParentProcessID
oExec.Terminate
For each c in Service.ExecQuery("select commandline,name from Win32_Process where (name='wscript.exe' or name='cscript.exe') and ProcessID<>" & PID)
  if instr(ucase(c.commandline),Ucase(WScript.ScriptName)) then
    Button=WSHShell.Popup("Скрипт " & WScript.ScriptName & " уже запущен!!!" & vbCr & "Перезапустить???",10,,4)
    If Button=6 then
      c.Terminate
      WSHShell.Popup "Скрипт " & WScript.ScriptName & " перезапущен...",5
    Else
      WSHShell.Popup "Уже запущенный скрипт " & WScript.ScriptName & " оставлен.",5
      WScript.Quit
    End If
  end if
Next
Set fso = CreateObject("Scripting.FileSystemObject")
set Dict=CreateObject("Scripting.Dictionary")
do
  set GB=GetBase(strComputerRegBase)
  for each c in GB
    f_name=mid(GB.item(c).item("Path"),len(fso.GetDriveName(GB.item(c).item("Path")))+2)
    drives=split(fso.GetDriveName(GB.item(c).item("Path")),"\")
    
    if ubound(drives)=3 then
      on error resume next
      Set Service = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & drives(2) & "\root\cimv2")
      set oShare=Service.ExecQuery("Select * from Win32_Share where Type=0 and Name='" & drives(3) & "'")
      for each v in oShare
        set oFile=Service.ExecQuery("Select * from CIM_DataFile where Name='" & replace(v.path,"\","\\") & "\\" & replace(f_name,"\","\\") & "usrdef\\users.usr' and accessmask IS Null")
        for each ff in oFile
          set oExec=wshshell.ехес("%comspec% /c openfiles.exe /s " & strComputer & " /query /fo csv /nh")
          do while not oExec.StdOut.AtEndOfStream
            arr=split(replace(oExec.StdOut.ReadLine,"""",""),",")
            if ucase(arr(3))=ucase(ff.name) then
              set oExec=wshshell.ехес("%comspec% /c openfiles.exe /s " & strComputer & " /disconnect /ID " & arr(0))
              do while oExec.Status=0
                wscript.sleep 100
              loop
              Users=Users & "Пользователь " & arr(1) & ", База """ & GB.item(c).item("Caption") & """, Путь """ & GB.item(c).item("Path") & """" & vbCr
            end if
          loop
        next
      Next
      err.clear
      on error goto 0
    elseif ubound(drives)=0 then
      set oFile=Service.ExecQuery("Select * from CIM_DataFile where Name='" & replace(drives(0),"\","\\") & "\\" & replace(f_name,"\","\\") & "usrdef\\users.usr' and accessmask IS NULL")
      for each ff in oFile
        set oExec=wshshell.ехес("%comspec% /c openfiles.exe /s " & strComputer & " /query /fo csv /nh")
        do while not oExec.StdOut.AtEndOfStream
          arr=split(replace(oExec.StdOut.ReadLine,"""",""),",")
          if ucase(arr(3))=ucase(ff.name) then
            set oExec=wshshell.ехес("%comspec% /c openfiles.exe /s " & strComputer & " /disconnect /ID " & arr(0))
            do while oExec.Status=0
              wscript.sleep 100
            loop
            Users=Users & "Пользователь " & arr(1) & ", База """ & GB.item(c).item("Caption") & """, Путь """ & GB.item(c).item("Path") & """" & vbCr
          end if
        loop
      next
    end if
  next
  If trim(Users)<>"" then
    WScript.Echo Users
    Users=""
  End If
  wscript.sleep 300
loop
function GetBase(strComputerRegBase)
  set DictB=CreateObject("Scripting.Dictionary")
  const HKEY_CURRENT_USER = &H80000001
  Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputerRegBase & "\root\default:StdRegProv")
  strKeyPath = "Software\1C\1Cv7\7.7\Titles"
  oReg.EnumValues HKEY_CURRENT_USER, strKeyPath, arrValues
  strInfo=vbNullString
  For i = LBound(arrValues) To UBound(arrValues)
    call oReg.GetStringValue(HKEY_CURRENT_USER,strKeyPath,arrValues(i),Value)
    Execute "set dictKey" & i & "=CreateObject(""Scripting.Dictionary"")"
    Execute "dictKey" & i & ".add ""Path"",arrValues(" & i & ")"
    Execute "dictKey" & i & ".add ""Caption"",Value"
    DictB.Add "db" & i,eval("dictKey" & i)
  Next
  set GetBase=DictB
end function
function GetUser(param)
  set DictU=CreateObject("Scripting.Dictionary")
  if fso.FileExists(param&"usrdef\users.usr") then
    set Txt=FSO.OpenTextFile(param&"usrdef\users.usr")
    LineUser=""
    ChI=0
    do while Not Txt.AtEndOfStream
      Chi=Chi+1
      Buf=Txt.Read(1)
      if asc(Buf)>31 then
        LineUser=LineUser+Buf
      end if
    loop
    LineBof="{"&chr(34)&"Container.Contents"&chr(34)&","
    LineUser=Mid(LineUser,InStr(LineUser,LineBof)+23)
    LineUser=Mid(LineUser,1,InStr(LineUser,"}}"))
    Arr=split(LineUser,"},{")
    for iArr=lbound(Arr) to Ubound(arr)
      Arr(iArr)=Replace(Arr(iArr),chr(34),"")
      Arr(iArr)=Replace(Arr(iArr),"}","")
      Arr(iArr)=mid(Arr(iArr),19)
      Arr(iArr)=mid(Arr(iArr),InStr(Arr(iArr),",")+1)
      Arr(iArr)=mid(Arr(iArr),1,InStr(Arr(iArr),",")-1)
    next
    for each sArr In Arr
      DictU.add sArr,sArr
    next
  else
  end if
  set GetUser=DictU
end function
///
Это должно запускаться на ХР или 2003 (можно не на сервере а любой рабочей станции) работает с серверами баз под управлением 2000/ХР/2003
21 Чучундер
 
09.12.05
17:27
Запустил локально на дом.машине W2K
поправил ашипки
дает
строка 9
символ 1
ошибка 0х80041017
код 80041017
источник (null)
 и что дальше?
22 Дурочка 1С
 
09.12.05
21:00
Ник "Тяп Ляп" в базе не найден. Зарегистрируйте ник!
23 Чучундер
 
09.12.05
21:07
А, е!
24 Чучундер
 
09.12.05
21:13
Все равно не получается...
А что значит
...and ProcessID<>" & PID
?
перед кавычкой ничего не надо...?
25 Мишка Олимпийский
 
09.12.05
23:02
он домой уехал, будет в понедельник только.
26 smaharbA
 
12.12.05
07:13
For each c in Service.ExecQuery("select commandline,name,processid from Win32_Process where (name='wscript.exe' or name='cscript.exe') and ProcessID<>" & PID)
Но и без этой коррекции все должно работать
На 2000 не будет отслеживать, надо перестраивать net files использовать, и, чтобы отслеживать в терминале (если пути локальные) нужно включить глобальный флаг Maintain a list of objects for each type («Вести список объектов каждого типа») с помощью команды gflags.exe (из Support Tools)
...Ник Тя Ляп в базе небыл зарегистрирован...