设置Windows系统登录背景图片

'设置系统登录时背景图片。瘟十锁屏界面图片和登录图片不是一回事儿

'原理:
'瘟十通过组策略实现:
'1、计算机配置\管理模板\控制面板\个性化\强制显示特定默认锁屏界面图像和登录图像;
'2、计算机配置\管理模板\控制面板\个性化\阻止更改锁定界面图像和登录图像;
'3、使用本程序,不要再用手工对上述1、2组策略进行设置,如果设置过请改为“未设置”,否则在瘟十下无效果。
'瘟七通过修改注册表和图片文件实现。

'编译:
'   代码专门为32位exe运行设计,直接编译为32位exe;
'   编译为32位系统可执行文件,可在64位系统下运行;
'   编译为64位系统,需修改代码。修改位置1处,有说明;编译后只能在64位系统运行
'   不编译,VBS源代码运行,不存在系统位数问题。

'代码设计:张富贵儿 [email protected]
'源代码:VBS
'运行:直接运行,也可以编译成exe文件运行。
'移植:稍稍修改,就可以在VB6下运行
'
'--------------------↓↓↓↓-----代码开始-----↓↓↓↓---------------

Dim OSName,OSBit,OSVer   'OSName=操作系统全称,OSVer=操作系统版本号,OSBit操作系统位数
Dim SilentFlag  '静默参数
Dim SysDirName  'c:\windows\System32目录


SysDirName="C:\Windows\System32\" '系统目录
SilentFlag=0  '等于1静默执行

OsInfo  OSName,OSBit,OSVer  '获取操作系统信息

SetSystem32Dir         '■■■■■■编译32位exe,在64位系统下运行。如果要编译成64位可执行文件,注释掉本行即可■■■■■■■

MainProgram            '主程序
ReGpUpdate             '刷新组策略

Sub ReGpUpdate
    '刷新组策略
    Set LqxkjsjShell = CreateObject("Wscript.Shell")
    LqxkjsjShell.Run "gpupdate.exe /force",0,ture   '刷新组策略
    
    WScript.Sleep 8000    '等8秒,因为组策略刷新需要时间
    
    '再以管理员方式刷一遍组策略,万恶的瘟十,有时候往往需要刷n遍才有效果
    Set FkLSN=CreateObject("Shell.Application")
    FkLSN.ShellExecute SysDirName & "\gpupdate.exe", "/force",SysDirName , "runas", 0  '刷新组策略
    
End Sub

Sub MainProgram
    If OSVer<6 Or OSVer>10 Then
        MsgBox "本程序只适合在瘟七、瘟十系统上使用。",48,"不适用"
        WScript.Quit
    End If   
    ImageFilesCount=0
    If WScript.Arguments.count=0 Then  '运行时不带参数
        Lshnnk= "使用方法:" & Chr(10) & Chr(10) & _
        " 1、直接运行本文件,按【否】取消Windows登录背景图片" & Chr(10) & _
        " 2、将图片文件拖到本文件名上,实现登录背景图片更换"  & Chr(10) & _
        " 3、使用【/s 图片文件名】参数,静默设置登录背景图片" & Chr(10) & _
        " 4、使用【/s 】参数,静默取消登录背景图片"  & Chr(10) & Chr(10)& _
        "    按【是】退出,按【否】取消Windows登录背景图片"
        Set LshnnkShell = CreateObject("Wscript.Shell")
        wdjy=LshnnkShell.Popup (Lshnnk, 27, "设置Windows登录背景图片,27秒后关闭",32+4)
        If wdjy=7 Then
            EscapeLoginImage      '按【否】取消登录背景图片
            Exit Sub
         Else
           WScript.Quit           '退出    
        End If
        
    End If  
    For zxdwshj=0 To WScript.Arguments.count-1      '参数个数,从零开始处理。
        LoginImageFileName=WScript.Arguments(zxdwshj)
        
        If LCase(WScript.Arguments(zxdwshj))="/s"  Then
            SilentFlag=1             '等于1表示要静默
        Else
            If LCase(Right( LoginImageFileName    ,4))=".jpg"  Or LCase(Right( LoginImageFileName    ,4))=".png" Or  _
                LCase(Right( LoginImageFileName    ,4))=".bmp"  Or  LCase(Right( LoginImageFileName    ,4))=".gif" Then        '文件jpg等图片文件
                If CreateObject("Scripting.FileSystemObject").fileExists(LoginImageFileName)=True  Then       '文件存在  
                    Call   SetLoginBackImage  (LoginImageFileName)          '设置登录图片
                    ImageFilesCount=ImageFilesCount+1                        '统计处理图片文件个数
                Else
                    MsgBox "指定图片文件不存在",64,"参数错误"
                    WScript.Quit
                End If     
            Else
                MsgBox "这个文件不是图片文件",64,"文件错误"
                WScript.Quit
            End If 
        End If   
    Next
    If SilentFlag=1 Then 
        Exit Sub          '静默就直接退出
    End If 
    If OSVer=10  Then 
        FuckWin10="万恶的瘟十需要1-5分钟后再查看设置效果,如果没有效果,需要多试几次。"& Chr(10) & Chr(10)
    End If    
    Set WALSN= CreateObject("Wscript.Shell")
    zyqdwshj= "Windows登录背景图片修改工作,已胜利完成。" & Chr(10) & Chr(10) & FuckWin10 & "不忘初心,牢记使命,增强四个意识、坚定四个自信、做到两个维护,构建人类命运共同体。"
    WALSN.Popup zyqdwshj, 27, "27秒后该窗口自动关闭",48
End Sub

Sub EscapeLoginImage
    ' 取消瘟十登录背景图片设置
    If OSVer=10 Then  ' 取消瘟十登录背景图片设置
        '删除注册表
        RegKeyName="HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Personalization"
        RegValueName=""
        DelParameter="K"
        Call DelRegValue(RegKeyName, RegValueName, DelParameter) '删除一个项和下面所有的内容,瘟十的背景图片
        Exit Sub
    End If 
    
    If OSVer=6 Then  ' 取消瘟七登录背景图片设置
        RegKeyName="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background" 
        DelParameter="K"
        Call DelRegValue(RegKeyName, RegValueName, DelParameter) '删除一个项和下面所有的内容,瘟七的背景图片
    End If

End Sub

Sub SetLoginBackImage (LoginImageFileName)
    '设置瘟十登录背景图片。
    '若取消,注册表中删除HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Personalization
    '考虑到编译exe时,32/64位的exe不同。
    '在VBS源代码下,无需考虑32位还是64位。
    ReImageSizePath  LoginImageFileName '设置图片大小和路径
    If OSVer=10 Then  ' 取消瘟十登录背景图片设置
        '设置注册表,相当于组策略:计算机配置\管理模板\控制面板\个性化\强制显示特定默认锁屏界面图像和登录图像:
        RegKeyName="HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Personalization"
        RegValueName="LockScreenImage"
        RegValue=LoginImageFileName              '图片文件路径
        RegKeyType="REG_SZ"
        Call SetRegValue(RegKeyName, RegValueName,RegValue,RegKeyType)           
        RegValueName="LockScreenOverlaysDisabled"
        RegValue="1"
        RegKeyType="REG_DWORD"
        Call SetRegValue(RegKeyName, RegValueName,RegValue,RegKeyType)           
        '相当于组策略:计算机配置\管理模板\控制面板\个性化\阻止更改锁定界面图像和登录图像:
        RegValueName="NoChangingLockScreen"
        Call SetRegValue(RegKeyName, RegValueName,RegValue,RegKeyType)           
        Exit Sub
    End If
    
    If OSVer=6 Then  ' 瘟七登录背景图片设置
        '瘟七登录背景图片:
        RegKeyName="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background" 
        RegValueName="OEMBackground"
        RegValue="1"
        RegKeyType="REG_DWORD"
        Call SetRegValue(RegKeyName, RegValueName,RegValue,RegKeyType)   
        
    End If

End Sub

Sub ReImageSizePath (LoginImageFileName)
    '设置图片大小和路径
    ImageFile1=LoginImageFileName
    Set fklsn=WScript.CreateObject("WScript.Shell")    
    If OSVer=6 Then   '瘟七
        '调用系统CMD命令创建目录和子目录
        DirName=SysDirName & "oobe\info\backgrounds"  '目录名称
        
        MakeSubDir="cmd /c md " & DirName 
        Fklsn.Run MakeSubDir,0  ,ture '创建目录
        
        PathName=SysDirName & "oobe"
        SetPathPermissions PathName   '设置权限
        
        PathName=SysDirName & "oobe\info"
        SetPathPermissions PathName   '设置权限
        
        
        PathName=SysDirName & "oobe\info\backgrounds"
        SetPathPermissions PathName   '设置权限
        
        PathName=SysDirName & "oobe\info\backgrounds\backgroundDefault.jpg"
        SetPathPermissions PathName   '设置权限
        
        DirName=SysDirName & "oobe\info\backgrounds"  '目录名称
        
        MakeSubDir="cmd /c md " & DirName 
        Fklsn.Run MakeSubDir,0 ,ture  '创建目录
        
        ImageFile2=SysDirName & "oobe\info\backgrounds\backgroundDefault.jpg"
    End If
    
    If OSVer=10 Then   '瘟十    
        DirName="C:\Windows\Web\Screen"
        SetPathPermissions DirName   '设置权限
        ImageFile2=DirName & "\backgroundDefault.jpg"
        
        SetPathPermissions ImageFile2   '设置权限
        
    End If    
    
    GetScreenResolution x,y   '获取屏幕分辨率
    ImgWidth=CStr(x) 
    ImgHeight=CStr(y)
    
    ImgRatio=False 
    SaveNewFile ImageFile1,ImageFile2,ImgWidth,ImgHeight,ImgRatio
    
    
    LoginImageFileName=ImageFile2
End Sub


Sub SaveNewFile(ImageFile1,ImageFile2,ImgWidth,ImgHeight,ImgRatio)
    '将ImageFile1另存为ImageFile2,宽度为ImgWidth,高度为ImgHeight,锁定纵横比为ImgRatio(取值True或False
    
    
    Set Img = CreateObject("WIA.ImageFile")
    Set Proc = CreateObject("WIA.ImageProcess")
    Img.LoadFile ImageFile1 '打开文件
    
    Proc.Filters.Add Proc.FilterInfos("Scale").FilterID '添加一个Scale的滤境,用来调整纵横比
    Proc.Filters(1).Properties("MaximumWidth")=ImgWidth        '定义新图片的 宽度
    Proc.Filters(1).Properties("MaximumHeight")=ImgHeight      '定义新图片的 高度
    'Proc.Filters(1).Properties("MaximumWidth")="1920"        '定义新图片的  宽度
    'Proc.Filters(1).Properties("MaximumHeight")="1080"        '定义新图片的 高度
    
    Proc.Filters(1).Properties("PreserveAspectRatio") =ImgRatio   '指定原图片纵横比
    'Proc.Filters(1).Properties("PreserveAspectRatio") =True         '保持原图片纵横比
    'Proc.Filters(1).Properties("PreserveAspectRatio") =False     '不保持原图片纵横比

    '如果要转换文件格式的话:
    Proc.Filters.Add Proc.FilterInfos("Convert").FilterID          '添加转换滤镜ID
    Proc.Filters(2).Properties("FormatID").Value = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"    '保存为JPG
    'Proc.Filters(2).Properties("FormatID").Value = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"    '保存为PNG
    'Proc.Filters(2).Properties("FormatID").Value = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"    '保存为BMP
    'Proc.Filters(2).Properties("FormatID").Value = "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}"    '保存为GIF
    'Proc.Filters(2).Properties("FormatID").Value = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"    '保存为TIF
    
   
    
    Set NewImg = Proc.Apply(Img) '保存新图片到 NewImg 对象里
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    If Fso.fileExists(ImageFile2)=True  Then       '文件存在  
      
        SetPathPermissions ImageFile2   '设置权限
        
        'aa=MsgBox  ("文件" & ImageFile2 & "已存在 ,覆盖吗? ",32+4,"文件已存在")
        'If aa=6 Then  '覆盖
        Fso.DeleteFile ImageFile2          '删除文件
        '   Else Exit Sub
        ' End If
        
    End If
    NewImg.SaveFile ImageFile2  '把NewImg对象保存为图片    
    
    JpgSize=Fso.Getfile(ImageFile2).Size
    
    If JpgSize>256000 And OSVer<10 Then  '瘟七要求文件必须是jpg,不大于256K,瘟十没有此要求
        
        Call ReSize256K(ImageFile1,ImageFile2) '调整瘟七图片大小
    End If 
    
    
End Sub


Sub ReSize256K(ImageFile1,ImageFile2)
    '瘟七系统要求登录背景图片文件必须是jpg,小于256K
    '逐渐降低Jpg质量,直到文件小于256K
    
    'ImageFile1 '原始图片文件名
    'ImageFile2 '生成图片  
    NewFileSinz=256000   '图片尺寸
    JPGQuaqlityVal=85    '设置JPG压缩质量起始值为85
    
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    If Fso.fileExists(ImageFile2)=True  Then       '文件存在  
        SetPathPermissions ImageFile2   '设置权限
        Fso.DeleteFile ImageFile2          '删除文件
    End If
    
    Do     Until  NewFileSinz<256000  '文件超过256K,就降低jpg图片质量,然后保存,再测试文件大小
        Set Img = CreateObject("WIA.ImageFile")
        Set Proc = CreateObject("WIA.ImageProcess")
        Img.LoadFile ImageFile1 '打开文件
        Proc.Filters.Add Proc.FilterInfos("Convert").FilterID          '添加转换滤镜
        Proc.Filters(1).Properties("FormatID").Value = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"    '保存为JPG
        Proc.Filters(1).Properties("Quality").Value = JPGQuaqlityVal        
        Set NewImg = Proc.Apply(Img) '保存新图片到 NewImg 对象里   
        NewImg.SaveFile ImageFile2  '把NewImg对象保存为图片    
        NewFileSinz= FSO.Getfile(ImageFile2).Size  '文件大小
        If   NewFileSinz>256000 Then
            Set Img =Nothing
            Set Proc =Nothing
            Set NewImg = Nothing
            JPGQuaqlityVal= JPGQuaqlityVal-3   '降低Jpg压缩质量
            SetPathPermissions ImageFile2   '设置权限
            Fso.DeleteFile ImageFile2          '删除文件
        Else
            Exit Do
        End If       
    Loop        
    
End Sub

Sub SetPathPermissions(PathName)
    '设置权限
    ttt="Icacls " & PathName & " /grant everyone:F" 
    CreateObject("wscript.shell").run ttt,0,ture
End Sub


Sub GetScreenResolution(x,y)
    '获取屏幕分辨率
    x=CreateObject("HtmlFile").ParentWindow.Screen.Width    '屏幕的宽度
    y=CreateObject("HtmlFile").ParentWindow.Screen.Height    '屏幕的高度
End Sub

Sub SetRegValue(RegKeyName, RegValueName,RegValue,RegKeyType)
    '设置注册表
    'RegKeyName=项名, 例如 "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\test"
    'RegValueName=键名, 例如 "MySet"
    'RegValue=键值,例如"不忘初心牢记使命"
    'RegKeyType=键类型,例如 "REG_SZ"
    '没有RegKeyName会自动创建的
    'RegKeyName, RegValueName, RegKeyType, RegValue  都是字符串儿变量
    'RegValueName如果为空的话,只创建RegKeyName
    'RegKeyType取值如下:
    'REG_SZ      '字符串儿
    'REG_DWORD   '数值,32为
    'REG_BINARY   '二进制
    'REG_MULTI_SZ  '多字符串儿
    'REG_EXPAND_SZ   '字符串儿扩展
    'REG_QWORD    '数值,64位
    'REG_NONE
    
    
   
    If InStr(RegKeyName, " ") <> 0 Then  '带空格的RegKeyName处理
        RegKeyName = Chr(34) & RegKeyName & Chr(34)
    End If
    
    If InStr(RegValueName, " ") <> 0 Then  '带空格的RegKeyName处理
        RegValueName = Chr(34) & RegValueName & Chr(34)
    End If
    
    
    If InStr(RegValue, " ") <> 0 Then  '带空格的RegKeyName处理
        RegValue = Chr(34) & RegValue & Chr(34)
    End If
    
    
    RunShell = "cmd /c reg add   " & RegKeyName & " /f /v " & RegValueName & " /t " & RegKeyType & " /d " & RegValue
    If RegValueName = "" Then
        RunShell = "cmd /c reg add " & RegKeyName & " /ve "
    End If
    
    If OSBit = 64 Then            '64位系统的话
        RunShell = RunShell & " /reg:64"
    End If
    
    Set fklsn=WScript.CreateObject("WScript.Shell")
    FKLSN.Run RunShell, 0  ,ture          '执行DOS命令
    
End Sub

Function DelRegValue(RegKeyName, RegValueName, DelParameter)
    '删除注册表。采用此法,避开32/64位问题
    'RegKeyName=项名, 例如 "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\test"
    'RegValueName=键名, 例如 "MySet"
    'DelParameter=参数,三个值,
    '使用方法:
    '删除某键,必须指定键名。只要指定键名,参数是什么都是无效的。
    '删除项目,必须指定键名为空,而且必须指定参数DelParameter,参数DelParameter为:
    'DelParameter = "D"         '只删除该项的默认值
    '参数 = "V"         '删除该项下的所有键名,包括默认值
    '参数 = "K"        '删除该项以及该项下面所有的子项、键名,也就是删的啥也不剩"
    
    If InStr(RegKeyName, " ") <> 0 Then  '带空格的项名处理
        RegKeyName = Chr(34) & RegKeyName & Chr(34)
    End If
    If InStr(RegValueName, " ") <> 0 Then  '带空格的项名处理
        RegValueName = Chr(34) & RegValueName & Chr(34)
    End If
    DelParameter=UCase(DelParameter)       '大写
    If RegValueName <> "" Then
        RunShell = "cmd /c reg delete " & RegKeyName & " /v " & RegValueName & " /f"
    Else
        Select Case DelParameter
            Case "D"           '只删除该项下的默认值
            RunShell = "cmd /c reg delete " & RegKeyName & " /ve /f"
            Case "V"           '删除该项下的所有键名,包括默认值
            RunShell = "cmd /c reg delete " & RegKeyName & " /va /f"
            Case "K"           '删除该项以及该项下面所有的子项、键名,也就是删的啥也不剩
            RunShell = "cmd /c reg delete " & RegKeyName & " /f"
            Case Else
            Exit Function
        End Select
    End If
    If OSBit = 64 Then            '这是因为,如果编译为32位的exe,运行于64位系统,会导致注册表位置混乱
        RunShell = RunShell & " /reg:64"
    End If
    
    Set fklsn=WScript.CreateObject("WScript.Shell")
    FKLSN.Run RunShell, 0 ,ture           '执行DOS命令

End Function


Sub GetMyAppName(MyName,MyPath)
    '返回自身文件名
    Set fso = CreateObject("scripting.filesystemobject") 
    MyName=WScript.scriptname 
    MyPath=WScript.ScriptFullName
End Sub

Sub SetSystem32Dir
    '编译为32位可执行exe,保证在64位系统下运行正确
    '在编译为32位exe后在64位系统执行时,C:\windows\system32目录,会变成C:\Windows\SysWOW64
    '只要把C:\windows\system32目录改成c:\windows\sysnative目录,在64位系统执行时会变成C:\windows\system32
    '若编译成64位exe,不要执行本子程序 
        Call GetMyAppName(MyName,MyPath) '获取自身文件名
    
    If LCase(Right(MyName,4))=".exe" And OSBit=64 Then     '如果自己是32位exe文件,操作系统是64位的
        SysDirName="c:\windows\sysnative\"                 
    End If
End Sub

Sub OsInfo (OSName,OSBit,OSVer)
    '获取操作系统信息。
    'OSName=操作系统全称,OSVer=操作系统版本号,OSBit操作系统位数

    On Error Resume Next
    
    Set FKMXF = GetObject("winmgmts:\\.\root\cimv2")
    Set mxfyd = FKMXF.ExecQuery("Select * from Win32_OperatingSystem",,48)
    For Each wdjy In mxfyd
        OSName =wdjy.Caption     '操作系统全称    
        OSVer=wdjy.Version    '操作系统版本号
        '瘟十 10.0* 
        '瘟2016 10.0* 
        '瘟八1 6.3* 
        '瘟2012 R2 6.3* 
        '瘟八 6.2 
        '瘟2012 6.2 
        '瘟七 6.1 
        '瘟2008 R2 6.1 
        '瘟2008 6.0 
        '未死的 6.0 
        '瘟2003 5.2 
        '叉屁64位5.2 
        '叉屁32位5.1 
        '瘟两千 5.0 
        
        OSVer    =CInt(Left(OSVer,2))'左取两位转换为数值
        OSBit    =CInt(Left(wdjy.OSArchitecture,2))  ' 操作系统位数,返回64或32,转换为数值型。
    Next
End Sub

你可能感兴趣的:(windows,vbs)