Войти

Показать полную графическую версию : создание списка пк, на котором скрипт уже выполнялся


ejik_off
21-05-2014, 11:39
Добрый день!!!
Ребята помогите допилить скрипт сам ноль в vbs-скриптах. Вообщем суть проблемы такая:
с помощью групповых политик на машины пользователей ставится миранда и копируется папка с настроенной мирандай, все это через логон-скрпт. Нужно что бы скрипт после удачного копирования взял названия компа и записал куда-нибудь в шару,
и при следующем запуске скрипта, он должен смотреть нет ли имени машины в списке, если нет то запускается. Как то так.
вот листинг самого скрипта: set WshShell = WScript.CreateObject("WScript.Shell")
set oFso = CreateObject("Scripting.FileSystemObject")

strComputerName = WshShell.ExpandEnvironmentStrings("%computername%")

If InStr(LCase(strComputerName), LCase("TNS-")) = 0 Then
KillProcess()

set objVer = WshShell.exec("%comspec% /c ver")
strWindowsVer = objVer.stdout.readall

strWindows = WshShell.ExpandEnvironmentStrings("%WinDir%")
strWindowsOS = WshShell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%")
strAppData = WshShell.ExpandEnvironmentStrings("%APPDATA%")
strCurrentDir = oFSO.GetParentFolderName(Wscript.ScriptFullName)
strDesktop = WshShell.SpecialFolders("Desktop")
strAllUsersPrograms = WshShell.SpecialFolders("AllUsersPrograms")
strAllUsersStartup = WshShell.SpecialFolders("AllUsersStartup")

strSourcePath = "\\intec.tns-intec.kz\sysvol\intec.tns-intec.kz\scripts\Miranda IM\"
strSourceFileVersion = oFso.GetFileVersion(strSourcePath & "miranda32.exe")

If CStr(strWindowsOS) = "x86" Then
strProgramFiles = WshShell.ExpandEnvironmentStrings("%ProgramFiles%")
Else
strProgramFiles = WshShell.ExpandEnvironmentStrings("%ProgramFiles(x86)%")
End If

strDestinationPath = strProgramFiles & "\Miranda IM\"
strDestinationFileVersion = oFso.GetFileVersion(strDestinationPath & "miranda32.exe")

If Not oFSO.FolderExists(strDestinationPath) Then
oFSO.CreateFolder(strDestinationPath)

return = WshShell.Run("xcopy " & chr(34) & strSourcePath & "*" & chr(34) & " " & chr(34) & strDestinationPath & chr(34) & " /I /E /H /Y")

set oShellLink = WshShell.CreateShortcut(strDesktop & "\Miranda IM.lnk")

oShellLink.TargetPath = strDestinationPath & "miranda32.exe"
oShellLink.IconLocation = strDestinationPath & "miranda32.exe, 0"
oShellLink.Description = "Miranda IM"
oShellLink.Save()

If Not oFSO.FileExists(strAllUsersPrograms & "\Miranda IM.lnk") Then
wscript.echo strDesktop & "\Miranda IM.lnk", strAllUsersPrograms & "\Miranda IM.lnk"
oFSO.CopyFile strDesktop & "\Miranda IM.lnk", strAllUsersPrograms & "\Miranda IM.lnk"
End If

If oFSO.FileExists(strAllUsersStartup & "\Miranda IM.lnk") Then
oFSO.DeleteFile strAllUsersStartup & "\Miranda IM.lnk"
End If

If Not oFSO.FileExists(strWindows & "\krb5.ini") Then
oFSO.CopyFile strCurrentDir & "\krb5.ini", strWindows & "\krb5.ini"
End If

If InStr(strWindowsVer, "Windows XP") > 1 Then
WshShell.RegWrite "HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\AllowTGTSessionKey", 1, "REG_DWORD"
Else
WshShell.RegWrite "HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters\AllowTGTSessionKey", 1, "REG_DWORD"
End If

WshShell.RegWrite "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\Miranda", strDestinationPath & "miranda32.exe", "REG_SZ"
Else
wscript.echo strSourceFileVersion
wscript.echo strDestinationFileVersion

If strSourceFileVersion <> strDestinationFileVersion Then
return = WshShell.Run("xcopy " & chr(34) & strSourcePath & "*" & chr(34) & " " & chr(34) & strDestinationPath & chr(34) & " /I /E /H /Y")
wscript.echo return
End If
End If
End If

Sub KillProcess()
strComputer = "."
strProcess = "miranda32.exe"
set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" & strProcess & "'")

For Each objProcess In colProcessList
objProcess.Terminate()
Next
End Sub

Iska
21-05-2014, 14:56
ejik_off, не надо писать «куда-нибудь в шару». Есть общепринятый способ — использование реестра. Локального.

ejik_off
21-05-2014, 17:12
Есть общепринятый способ — использование реестра. Локального. »
а как это сделать

Iska
21-05-2014, 17:56
Например, так: WMI Tasks: Registry (Windows) (http://msdn.microsoft.com/en-us/library/aa394600(v=vs.85).aspx).

P.S. MSDN — наше всё.

ejik_off
22-05-2014, 06:51
Я в программировании полный 0, поэтому и обратился сюда. С добавлением ключа в реестр я понял, но как это написать в скрипте?

ejik_off
26-05-2014, 13:26
С проверкой ключа в реестре получилось,Iska спасибо за ссылку!
теперь вопрос такой, в скрипте как я понял, есть строки которые вроде как должны копировать ярлык в автозагрузку. Но при запуске скрипта не копируется ярлык в авторан. Как можно найти ошибку?

Iska
26-05-2014, 14:20
в скрипте как я понял, есть строки которые вроде как должны копировать ярлык в автозагрузку. »
Вроде как должны удалять файл ярлыка из автозагрузки:
If oFSO.FileExists(strAllUsersStartup & "\Miranda IM.lnk") Then
oFSO.DeleteFile strAllUsersStartup & "\Miranda IM.lnk"
End If

И вроде как создавать запись в реестре:
WshShell.RegWrite "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\Miranda", strDestinationPath & "miranda32.exe", "REG_SZ"

Проверьте, есть ли данная запись в реестре.

ejik_off
26-05-2014, 14:29
Проверьте, есть ли данная запись в реестре. »
Такой записи нет

Вот это условие пропускается
If Not oFSO.FolderExists(strDestinationPath) Then
oFSO.CreateFolder(strDestinationPath)

return = WshShell.Run("xcopy " & chr(34) & strSourcePath & "*" & chr(34) & " " & chr(34) & strDestinationPath & chr(34) & " /I /E /H /Y")

set oShellLink = WshShell.CreateShortcut(strDesktop & "\Miranda IM.lnk")

oShellLink.TargetPath = strDestinationPath & "miranda32.exe"
oShellLink.IconLocation = strDestinationPath & "miranda32.exe, 0"
oShellLink.Description = "Miranda IM"
oShellLink.Save()

If Not oFSO.FileExists(strAllUsersPrograms & "\Miranda IM.lnk") Then
wscript.echo strDesktop & "\Miranda IM.lnk", strAllUsersPrograms & "\Miranda IM.lnk"
oFSO.CopyFile strDesktop & "\Miranda IM.lnk", strAllUsersPrograms & "\Miranda IM.lnk"
End If

If oFSO.FileExists(strAllUsersStartup & "\Miranda IM.lnk") Then
oFSO.DeleteFile strAllUsersStartup & "\Miranda IM.lnk"
End If

If Not oFSO.FileExists(strWindows & "\krb5.ini") Then
oFSO.CopyFile strCurrentDir & "\krb5.ini", strWindows & "\krb5.ini"
End If

If InStr(strWindowsVer, "Windows XP") > 1 Then
WshShell.RegWrite "HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\AllowTGTSessionKey", 1, "REG_DWORD"
Else
WshShell.RegWrite "HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters\AllowTGTSessionKey", 1, "REG_DWORD"
End If

WshShell.RegWrite "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\Miranda", strDestinationPath & "miranda32.exe", "REG_SZ"
Else
После Else поставил WshShell.RegWrite "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\Miranda", strDestinationPath & "miranda32.exe", "REG_SZ"
Вышла ошибка, код ошибки 80070005, сдается мне что пользователь не может в эту ветку писать.

Iska
26-05-2014, 16:08
Вот это условие пропускается »
Там нужно так:
If Not oFSO.FolderExists(strDestinationPath) Then
oFSO.CreateFolder strDestinationPath
End If

Прочее должно исполняться независимо от предварительного отсутствия папки.

После Else поставил
WshShell.RegWrite "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\Miranda", strDestinationPath & "miranda32.exe", "REG_SZ"
Вышла ошибка, код ошибки 80070005, сдается мне что пользователь не может в эту ветку писать. »
Простой пользователь — да, не может. Но он не может и с «AllUsers…» папками манипулировать. У Вас какой?

Кстати, ошибка точно на этой строке?

ejik_off
27-05-2014, 07:03
Там нужно так:
Код:
If Not oFSO.FolderExists(strDestinationPath) Then
oFSO.CreateFolder strDestinationPath
End If
Прочее должно исполняться независимо от предварительного отсутствия папки. »
Я уже запутался в этих циклах :)
Простой пользователь — да, не может. Но он не может и с «AllUsers…» папками манипулировать. У Вас какой? »
Скрипт будет запускаться у обычных юзерах.
Кстати, ошибка точно на этой строке? »
Да.




© OSzone.net 2001-2012