改变 WID 的位置

改变 WID 的位置

一、把 \windows\wid 目录移动到 E:\wid。
要在安全模式下进行。
以后的所有工作都可以在正常模式下进行。

二、修改注册表中的有关内容,共有 7 个地方,分成 4 个方面。
 1、关于类注册,有两个。这两个的修改需要先取得对键值的控制权。
[HKLM\SOFTWARE\Classes\CLSID\{A6F16B19-0040-4947-8D3F-52DE129BB615}]
@="Microsoft WID Server Virtual Device Interface for Server"

[HKLM\SOFTWARE\Classes\CLSID\{A9A3FE12-61C7-496E-AABF-B83E3287AB82}]
@="Microsoft WID Server Virtual Device Interface for Client"

2、关于服务,有两个。
[HKLM\SYSTEM\CurrentControlSet\Services\MSSQL$MICROSOFT##WID]
[HKLM\SYSTEM\CurrentControlSet\Services\WIDWriter]

DisplayName 和 Description,要注意前面的 @ 不能省略。

3、关于 SQL Server 的有一个。
[HKLM\SOFTWARE\Microsoft\Microsoft SQL Server]

4、关于事件日志的有两个。
[HKLM\SYSTEM\CurrentControlSet\Services\EventLog\Application\MSSQL$MICROSOFT##WID]
[HKLM\SYSTEM\CurrentControlSet\Services\EventLog\Application\WIDVDI]

经过这两步,WIDWriter 服务已经可以启动了,但是,SQL Server 服务还是不能启动。后来,发现,是由于权限的问题。
这个权限的设置就有点难度了。是要求 MSSQL$MICROSOFT##WID 用户必须对 Data 和 Log 目录有写入的权限。而这个用户是无法添加的。因此,只能从正常的服务器上把权限复制过来。

三、设置 WID 目录的权限。

1、复制原来的权限:
cacls C:\Windows\WID\Log /s
下面的是输出:
C:\Windows\WID\Log "D:PAI(A;OICI;FA;;;BA)(A;OICI;FA;;;SY)(A;;0x13019f;;;S-1-5-80-1184457765-4068085190-3456807688-2200952327-3769537534)(A;OICIIO;SDGWGR;;;S-1-5-80-1184457765-4068085190-3456807688-2200952327-3769537534)"

2、设置新目录的权限:
cacls e:\wid\log /s:"D:PAI(A;OICI;FA;;;BA)(A;OICI;FA;;;SY)(A;;0x13019f;;;S-1-5-80-1184457765-4068085190-3456807688-2200952327-3769537534)(A;OICIIO;SDGWGR;;;S-1-5-80-1184457765-4068085190-3456807688-2200952327-3769537534)"

用同样的方法设置 Data 的权限。Binn 的权限可能不设置也行。

四、改变数据文件的位置。
实际上,系统文件才只有 100 多兆,不一定真有移动的必要。
因此,前面的操作意义并不好,仅在于学习而已。

真正需要移动的是数据文件,因为数据文件可能会很大,并且在系统盘上进行频繁访问也对性能有影响。
这就需要安装工具 SQL Management Studio 了,有 600 多兆。
连接时,服务器名填写 \\.\pipe\MICROSOFT##WID\tsql\query。余下的操作就没有什么难度了,分离、附加就好了。

五、出现的问题。
大概会有两个:
1、3417 错误
这是 SQL 错误,是由于在 SQL Server 运行状态下复制的 master 等数据库造成的。停止 SQL Server 服务后再复制数据库文件就可以了。

2、1067 错误
这是 Windows 错误,说是进行意外终止。上,就是前面说的,MSSQL$MICROSOFT##WID 用户对数据库目录没有读写权限造成的。


3、3605 错误
这是 SQL 错误,说是验证数据库 SUSDB 架构失败。当把 WSUS 3.0 的 SUSDB 附加到 Windows 2012 中的 WID 时发生。
在 SQL 日志中,具体表现为:
错误 50000, 严重性 16, 状态 1
Detected an authorized object in schema
Database verification script failed for database

%programfiles%\update services\tools\wsusutil postinstall [sql parameter] [content parameter]
两个参数分别指定 SQL 服务器和升级补丁的位置,对于 WID, SQL 就不必指定了。实际上,CONTENT 也不必指定,因为在安装时指定过了。如果不放心,就指定一焉,比如:F:\WSUS
静静地等上 5、6 分钟,就好了。

六、说明。
微软是说通过备份与恢复的办法,实现数据库的迁移。
备份就不用多说了。
恢复的过程是这样的:
USE master
GO

ALTER DATABASE SUSDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

DROP DATABASE SUSDB
GO

RESTORE DATABASE [SUSDB] FROM DISK = N'C:\SUSDB.bak' WITH FILE = 1, MOVE N'SUSDB' TO N'c:\Windows\WID\Data\susdb.mdf', MOVE N'SUSDB_log' TO N'c:\Windows\WID\Data\SUSDB_log.ldf', NOUNLOAD, STATS = 10

不过,即使这样,也一样出现 3605 的错误。

# -*- coding: utf-8 -*- """ 文件名:lock_duration_strict_v2.py 功能:按 WID → 天 → 时间排序 → 相邻状态去重 → 提取“施封→解封”周期 规则: - 连续多个“施封” → 仅保留第一个 - 连续多个“解封” → 仅保留第一个 - 只有状态变化才视为有效事件 """ import pandas as pd import os def analyze_lock_duration_strict(input_file, output_file, min_duration_seconds=1): """ 严格模式分析电子锁数据 步骤: 1. 按 WID 分组 2. 按 CreateTime 升序排列 3. 添加 Date 列并按天分组 4. 在每一天内进行【相邻状态去重】 5. 遍历去重后序列,匹配 施封→解封 6. 计算每次上锁时长 """ print(f"开始处理文件:{input_file}") # 读取数据 if input_file.endswith('.csv'): df = pd.read_csv(input_file, encoding='utf-8') elif input_file.endswith(('.xlsx', '.xls')): df = pd.read_excel(input_file) else: raise ValueError("仅支持 .csv 或 .xlsx 文件") required_columns = ['DeviceID', 'WID', 'CreateTime', '锁状态'] for col in required_columns: if col not in df.columns: raise KeyError(f"缺少必要列:'{col}'。当前列:{list(df.columns)}") # 清洗时间字段 df['CreateTime'] = pd.to_datetime(df['CreateTime'], errors='coerce') df = df.dropna(subset=['CreateTime']).copy() df = df.sort_values(by='CreateTime').reset_index(drop=True) print(f"✅ 共加载 {len(df)} 条有效记录") # 添加日期用于分组 df['Date'] = df['CreateTime'].dt.date results = [] # 第一层:按 WID 分组 for wid, group_wid in df.groupby('WID', sort=False): group_wid = group_wid.sort_values(by='CreateTime').reset_index(drop=True) # 第二层:按 Date 分组 for date, group_day in group_wid.groupby('Date'): day_data = group_day.copy().reset_index(drop=True) # === 关键步骤:相邻去重,只保留状态变化的第一个点 === deduped = [] prev_status = None for _, row in day_data.iterrows(): current_status = str(row['锁状态']).strip() # 只有当状态改变时才保留 if current_status != prev_status: deduped.append(row) prev_status = current_status # 转为 DataFrame 方便遍历 deduped_df = pd.DataFrame(deduped) # === 遍历去重后的数据,查找“施封”后紧跟“解封”的组合 === sealed_time = None for _, row in deduped_df.iterrows(): status = str(row['锁状态']).strip() if status == '施封': # 只有第一次“施封”被保留(因已去重),直接记录 sealed_time = row['CreateTime'] elif status == '解封' and sealed_time is not None: unsealed_time = row['CreateTime'] duration_sec = int((unsealed_time - sealed_time).total_seconds()) # 过滤太短的记录 if duration_sec >= min_duration_seconds: results.append({ 'DeviceID': row['DeviceID'], 'WID': wid, 'Date': date, '施封时间': sealed_time, '解封时间': unsealed_time, '上锁时长(秒)': duration_sec }) # 匹配成功后重置,防止后续“解封”重复使用 sealed_time = None # 输出结果 result_df = pd.DataFrame(results) if not result_df.empty: result_df = result_df.sort_values(['WID', 'Date', '施封时间']).reset_index(drop=True) print(f"✅ 共识别出 {len(result_df)} 次有效的‘施封→解封’周期") # 统计每个 WID 每日次数 summary = result_df.groupby(['WID', 'Date']).size().reset_index(name='当日有效上锁次数') print("\n📊 各WID每日有效上锁次数统计(去重后):") print(summary.head(10)) else: print("⚠️ 未识别到任何符合规则的‘施封→解封’周期,请检查数据") # 保存结果 if output_file.endswith('.csv'): result_df.to_csv(output_file, index=False, encoding='utf-8-sig') elif output_file.endswith('.xlsx'): result_df.to_excel(output_file, index=False) else: raise ValueError("输出文件必须以 .csv 或 .xlsx 结尾") print(f"\n🎉 处理完成!结果已保存至:{output_file}") # ==================== 使用示例 ==================== if __name__ == "__main__": # 🔧 修改路径为你自己的文件位置 input_path = "C:\\Users\\zhong.jz.2\\Downloads\\电子锁轨迹_2025.07-2025.11.xlsx" output_path = "【Luna】电子锁上锁时长计算结果.xlsx" try: analyze_lock_duration_strict( input_file=input_path, output_file=output_path, min_duration_seconds=60 # 忽略小于60秒的有效周期 ) except Exception as e: print(f"❌ 错误:{e}") 在这个代码的基础上取消天数分组
最新发布
12-31
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值