在烧瓶上运行pyad.adgroup时pywintypes.com错误 [英] pywintypes.com error when running pyad.adgroup on flask

查看:305
本文介绍了在烧瓶上运行pyad.adgroup时pywintypes.com错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Python 3.5.2中创建一个简单的应用程序,通过Active Directory验证用户,并根据用户的组成员资格应用其他规则。应用程序可以使用 win32security 包成功验证用户,并尝试使用 pyad 获取组成员信息。



我的问题:我在Flask应用程序上运行代码时遇到pywintypes.com_error消息,从而无法获取组成员信息。

当我在iPython控制台上单独运行后端代码时,它工作正常。我能够查询组成员资格。但是,当它是Flask应用程序的一部分时,会弹出一个错误消息。我已经将问题隔离到了这部分代码中(DN信息被屏蔽):

$ $ p $ group = adgroup.ADGroup.from_dn(' CN = someCN,OU = someOU1,OU = someOU2,
DC = test,DC = domain,DC = com,DC = somecountry')
group_members = sum([member.get_attribute(sAMAccountName))
for group.get_members()],[])

有没有人遇到过这个之前?我想不出为什么代码不能在Flask中运行(虽然我刚刚开始学习Flask),但它将在控制台中运行。



代码参考:

我的Flask应用程序有3个Python文件,

run.py

  from app import app 
import os

app.secret_key = os.urandom(16)
app.run(debug = True)

init .py

  from flask import Flask 
$ b $ app = Flask(__ name__)
from app import views

views.py

  from app import app $ b $ from flask flask Flask,flash, render_template,request,session 

导入win32security作为win32
从pyad导入adgroup

@ app.route(/)
def home() :
如果不是session.get(logged_in):
返回render_template(login.html)
else:
返回您当前登录。

@ app.route(/ login,methods = [GET,POST])
def login():
#initialize variables
username = request.form [username]
password = request.form [password]
DOMAIN =test.domain.com.somecountry
error = None

group = adgroup.ADGroup.from_dn('CN = someCN,OU = someOU1,OU = someOU2,DC = test,DC = domain,DC = com,DC = somecountry')
group_members = sum [member.get_attribute(sAMAccountName)for group.get_members()],[])

如果用户名在group_members:
尝试:
令牌= win32.LogonUser (用户名,域名,密码,
win32.LOGON32_LOGON_NETWORK,
win32.LOGON32_PROVIDER_DEFAULT)
is_auth = bool(令牌)
$ b如果is_auth:
session [ logged_in] = True
除了:
error =凭据不正确,请重试。
其他:
错误=您不能访问这个。

return render_template(login.html,error = error)

login.html

 <!doctype html> 
< title>登入测试< / title>
{%block body%}
{%if session [logged_in]%}
< p>您当前登录。< / p>
{%else%}
< form action =/ loginmethod =POST>
< input type =usernamename =usernameplaceholder =Username>
< input type =passwordname =passwordplaceholder =Password>
< input type =submitvalue =登录>
< / form>
< li> {{error}}< / li>
{%endif%}
{%endblock%}

这是错误追溯:

pre code $ traceback(最近一次调用最后一个)
文件C:\ Users \ user\\ \\ AppData \ Local \Continuum\Anaconda3\lib\site-packages\flask\app.py,第2000行,在__call__
返回self.wsgi_app(environ,start_response)
文件C:\ Users \\\\ Application \AppData\Local\Continuum\Anaconda3\lib\site-packages\flask\app.py,1991行,在wsgi_app
response = self.make_response(self.handle_exception(e))
文件C:\ Users \\\ Application \AppData\Local\Continuum\Anaconda3\lib\site-packages\flask \app.py,第1567行,在handle_exception
reraise(exc_type,exc_value,tb)
文件C:\ Users \\\ Application \AppData\Local\Continuum\Anconda3 \lib\site-packages\flask\_compat.py,第33行,重新加价
提高价值
文件C:\Users\user\AppData\Local\Continuum\Anaconda3\lib\site-packages\flask\app.py,第1988行,在wsgi_app
response = self.full_dispatch_request()
文件C:\ Users \\\ Application \AppData\Local\Continuum\Anaconda3\lib\site-packages\flask\app.py ,第1641行,在full_dispatch_request
rv = self.handle_user_exception(e)
文件C:\ Users \\\\\ Application \AppData\Local\Continuum\Anaconda3\lib\ site_packages\flask\app.py,第1544行,在handle_user_exception
reraise(exc_type,exc_value,tb)
文件C:\ Users \\\\\\\\ Application \ Local \Continuum\Anaconda3\lib\site-packages\flask\_compat.py,第33行,在重新
提高价值
文件C:\ Users \ user \\ \\ AppData \ Local \Continuum\Anconda3\lib\site-packages\flask\app.py,第1639行,在full_dispatch_reque st
rv = self.dispatch_request()
文件C:\ Users \\\\\ Application \AppData\Local\Continuum\Anaconda3\lib\site-packages\flask\\ \\ app.py,第1625行,在dispatch_request
返回self.view_functions [rule.endpoint](** req.view_args)
文件C:\ Users \\\\\\\\ Documents test \app\views.py,第23行,登录
group = adgroup.ADGroup.from_dn('CN = someCN,OU = someOU1,OU = someOU2,DC = test,DC = domain,DC = com,DC = somecountry')
文件C:\ Users \\\ Application \AppData\Local\Continuum\Anaconda3\lib\site-packages\pyad\adobject.py ,第131行,在from_dn
return cls(distinguished_name,None,options)
文件C:\ Users \\\\\ Application \AppData\Local\Continuum\Anaconda3\lib\\ \\ site-packages \pyad\adobject.py,第88行,在__init__
self .__ set_adsi_obj()
文件C:\ Users \\\\\\\\ Application \ Local \ Continuum\Anaconda3\l ib'\\site-packages \pyad\adobject.py,第76行,在__set_adsi_obj
self.adsd_adsi_obj = self.adsi_provider.getObject('',self .__ ads_path)
File< COMObject ADsNameSpaces>,第2行,在getObject

中pywintypes.com_error:(-2147352567,'Exception occurred。',(0,None,None,None,0,-2147221020),None)


解决方案

运行相同的代码在一个python2 32位环境中。

不知道这是否是一个选项,但值得一试。


I am creating a simple app in Python 3.5.2 that authenticates users via Active Directory and applies additional rules based on a user's group membership. The app can successfully authenticate users using the win32security package, and tries to obtain group membership info using pyad.

My problem: I get a pywintypes.com_error message when running the code on my Flask app, preventing me from getting group membership info.

When I run the backend code separately on an iPython console, it works fine. I am able to query group membership. However, when it is part of a Flask app, an error pops out. I have isolated the problem to this part of the code (DN information masked):

group = adgroup.ADGroup.from_dn('CN=someCN,OU=someOU1,OU=someOU2,
                                 DC=test,DC=domain,DC=com,DC=somecountry')
group_members = sum([member.get_attribute("sAMAccountName")
                    for member in group.get_members()],[])

Has anyone encountered this before? I cannot think of why the code won't run in Flask (though I have just started learning Flask) but it will run in the console.

Code Reference:

I have 3 Python files for my Flask app and an html file in the templates folder.

run.py

from app import app
import os

app.secret_key = os.urandom(16)
app.run(debug=True)

init.py

from flask import Flask

app = Flask(__name__)
from app import views

views.py

from app import app
from flask import Flask, flash, render_template, request, session

import win32security as win32
from pyad import adgroup

@app.route("/")
def home():
    if not session.get("logged_in"):
        return render_template("login.html")
    else:
        return "You are currently logged in."

@app.route("/login", methods=["GET","POST"])
def login():
    #initialize variables
    username = request.form["username"]
    password = request.form["password"]
    DOMAIN = "test.domain.com.somecountry"
    error = None

    group = adgroup.ADGroup.from_dn('CN=someCN,OU=someOU1,OU=someOU2,DC=test,DC=domain,DC=com,DC=somecountry')
    group_members = sum([member.get_attribute("sAMAccountName") for member in group.get_members()],[])

    if username in group_members:
        try:
            token = win32.LogonUser(username, DOMAIN, password,
                                    win32.LOGON32_LOGON_NETWORK,
                                    win32.LOGON32_PROVIDER_DEFAULT)
            is_auth = bool(token)

            if is_auth:
                session["logged_in"] = True
        except:
            error = "Incorrect credentials. Please try again."
    else:
        error = "You are not permitted to access this."

    return render_template("login.html", error=error)

login.html

<!doctype html>
<title>Login Test</title>
{% block body %}
{% if session["logged_in"] %}
<p>You are currently logged in.</p>
{% else %}
<form action="/login" method="POST">
    <input type="username" name="username" placeholder="Username">
    <input type="password" name="password" placeholder="Password">
    <input type="submit" value="Log In">
</form>
<li>{{error}}</li>
{% endif %}
{% endblock %}

This is the error traceback:

Traceback (most recent call last):
File "C:\Users\user\AppData\Local\Continuum\Anaconda3\lib\site-packages\flask\app.py", line 2000, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\user\AppData\Local\Continuum\Anaconda3\lib\site-packages\flask\app.py", line 1991, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "C:\Users\user\AppData\Local\Continuum\Anaconda3\lib\site-packages\flask\app.py", line 1567, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\user\AppData\Local\Continuum\Anaconda3\lib\site-packages\flask\_compat.py", line 33, in reraise
raise value
File "C:\Users\user\AppData\Local\Continuum\Anaconda3\lib\site-packages\flask\app.py", line 1988, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\user\AppData\Local\Continuum\Anaconda3\lib\site-packages\flask\app.py", line 1641, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\user\AppData\Local\Continuum\Anaconda3\lib\site-packages\flask\app.py", line 1544, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\user\AppData\Local\Continuum\Anaconda3\lib\site-packages\flask\_compat.py", line 33, in reraise
raise value
File "C:\Users\user\AppData\Local\Continuum\Anaconda3\lib\site-packages\flask\app.py", line 1639, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\user\AppData\Local\Continuum\Anaconda3\lib\site-packages\flask\app.py", line 1625, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\user\Documents\test\app\views.py", line 23, in login
group = adgroup.ADGroup.from_dn('CN=someCN,OU=someOU1,OU=someOU2,DC=test,DC=domain,DC=com,DC=somecountry')
File "C:\Users\user\AppData\Local\Continuum\Anaconda3\lib\site-packages\pyad\adobject.py", line 131, in from_dn
return cls(distinguished_name, None, options)
File "C:\Users\user\AppData\Local\Continuum\Anaconda3\lib\site-packages\pyad\adobject.py", line 88, in __init__
self.__set_adsi_obj()
File "C:\Users\user\AppData\Local\Continuum\Anaconda3\lib\site-packages\pyad\adobject.py", line 76, in __set_adsi_obj
self._ldap_adsi_obj = self.adsi_provider.getObject('', self.__ads_path)
File "<COMObject ADsNameSpaces>", line 2, in getObject

pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147221020), None)

解决方案

I was able to mitigate this error by running my same code in a python2 32bit environment.

Not sure if this is an option, but worth a shot.

这篇关于在烧瓶上运行pyad.adgroup时pywintypes.com错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆