不灭的焱

革命尚未成功,同志仍须努力

作者:php-note.com  发布于:2020-11-16 17:20  分类:Python/数据分析  编辑

在使用win32api来修改同步windows的系统时间时报错:

SetSystemTime方法全称:

win32api.SetSystemTime(tm_year, tm_mon, tm_wday, tm_mday, tm_hour, tm_min, tm_sec, int(msec)) 

调用示例:

win32api.SetSystemTime(2020,10,1,09,30,10,10,0)

报错:

pywintypes.error: (1314, 'SetSystemTime', '客户端没有所需的特权。')

错误原因

在执行这个脚本时,权限不够,需要使用管理员权限来执行这个脚本,我们在调用SetSystemTime函数之前先做个判断,判断当前用户是否有管理员权限,如果没有就请求管理员权限即可,更正后的代码如下:

import win32api
import ctypes, sys

def is_admin():
    try:
    	#获取当前用户的是否为管理员
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False

if is_admin():
    win32api.SetSystemTime(2020,10,1,09,30,10,10,0)
else:
    # 重新运行这个程序使用管理员权限
    ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)

 

参考:https://blog.csdn.net/sinat_29957455/article/details/109631373

 


【工作中的参考代码】

import ctypes
import time
import win32api
from framework.utils.log_util import logger
from framework.utils.string_util import string_is_empty


def system_set_time(time_str=''):
    """
    设置系统时间
    :param time_str: 时间字符串,如:2020-11-16 17:46:50
    :return:
    """
    if string_is_empty(time_str):
        logger.warning('时间字符串不能为空')
        return False

    if not system_is_admin():
        logger.exception("请使用“管理员身份”的【命令提示符】窗口,运行当前脚本", stack_info=True)
        return False

    time_utc = datetime_to_utc(time_str)
    tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst = time.gmtime(time_utc)
    win32api.SetSystemTime(tm_year, tm_mon, tm_wday, tm_mday, tm_hour, tm_min, tm_sec, 0)

    return True


def system_is_admin():
    """
    是否为 管理员
    :return:
    """
    try:
        # 获取当前用户的是否为管理员
        return ctypes.windll.shell32.IsUserAnAdmin()
    except Exception as e:
        logger.warning(e)
        return False


def datetime_to_utc(time_str):
    """
    时间字符串 转 时间戳
    :param time_str:
    :return:
    """
    return time.mktime(time.strptime(time_str, '%Y-%m-%d %X'))

调用示例:

time_str = '2020-10-01 05:05:05'
system_set_time(time_str)

 

相关文章:

Python时间模块(time/datetime)详解