127 lines
5.1 KiB
Python
127 lines
5.1 KiB
Python
# Tests for the win32security module.
|
|
import sys, os
|
|
import unittest
|
|
import winerror
|
|
from pywin32_testutil import testmain, TestSkipped, ob2memory
|
|
|
|
import win32api, win32con, win32security, ntsecuritycon
|
|
|
|
class SecurityTests(unittest.TestCase):
|
|
def setUp(self):
|
|
self.pwr_sid=win32security.LookupAccountName('','Power Users')[0]
|
|
self.admin_sid=win32security.LookupAccountName('','Administrator')[0]
|
|
|
|
def tearDown(self):
|
|
pass
|
|
|
|
def testEqual(self):
|
|
self.failUnlessEqual(win32security.LookupAccountName('','Administrator')[0],
|
|
win32security.LookupAccountName('','Administrator')[0])
|
|
|
|
def testNESID(self):
|
|
self.failUnless(self.pwr_sid==self.pwr_sid)
|
|
self.failUnless(self.pwr_sid!=self.admin_sid)
|
|
|
|
def testNEOther(self):
|
|
self.failUnless(self.pwr_sid!=None)
|
|
self.failUnless(None!=self.pwr_sid)
|
|
self.failIf(self.pwr_sid==None)
|
|
self.failIf(None==self.pwr_sid)
|
|
self.failIfEqual(None, self.pwr_sid)
|
|
|
|
def testSIDInDict(self):
|
|
d = dict(foo=self.pwr_sid)
|
|
self.failUnlessEqual(d['foo'], self.pwr_sid)
|
|
|
|
def testBuffer(self):
|
|
self.failUnlessEqual(ob2memory(win32security.LookupAccountName('','Administrator')[0]),
|
|
ob2memory(win32security.LookupAccountName('','Administrator')[0]))
|
|
|
|
def testMemory(self):
|
|
pwr_sid = self.pwr_sid
|
|
admin_sid = self.admin_sid
|
|
sd1=win32security.SECURITY_DESCRIPTOR()
|
|
sd2=win32security.SECURITY_DESCRIPTOR()
|
|
sd3=win32security.SECURITY_DESCRIPTOR()
|
|
dacl=win32security.ACL()
|
|
dacl.AddAccessAllowedAce(win32security.ACL_REVISION,win32con.GENERIC_READ,pwr_sid)
|
|
dacl.AddAccessAllowedAce(win32security.ACL_REVISION,win32con.GENERIC_ALL,admin_sid)
|
|
sd4=win32security.SECURITY_DESCRIPTOR()
|
|
sacl=win32security.ACL()
|
|
sacl.AddAuditAccessAce(win32security.ACL_REVISION,win32con.DELETE,admin_sid,1,1)
|
|
sacl.AddAuditAccessAce(win32security.ACL_REVISION,win32con.GENERIC_ALL,pwr_sid,1,1)
|
|
for x in range(0,200000):
|
|
sd1.SetSecurityDescriptorOwner(admin_sid,0)
|
|
sd2.SetSecurityDescriptorGroup(pwr_sid,0)
|
|
sd3.SetSecurityDescriptorDacl(1,dacl,0)
|
|
sd4.SetSecurityDescriptorSacl(1,sacl,0)
|
|
|
|
class DomainTests(unittest.TestCase):
|
|
def setUp(self):
|
|
self.ds_handle = None
|
|
try:
|
|
# saving the handle means the other test itself should bind faster.
|
|
self.ds_handle = win32security.DsBind()
|
|
except win32security.error as exc:
|
|
if exc.winerror != winerror.ERROR_NO_SUCH_DOMAIN:
|
|
raise
|
|
raise TestSkipped(exc)
|
|
|
|
def tearDown(self):
|
|
if self.ds_handle is not None:
|
|
self.ds_handle.close()
|
|
|
|
class TestDS(DomainTests):
|
|
def testDsGetDcName(self):
|
|
# Not sure what we can actually test here! At least calling it
|
|
# does something :)
|
|
win32security.DsGetDcName()
|
|
|
|
def testDsListServerInfo(self):
|
|
# again, not checking much, just exercising the code.
|
|
h=win32security.DsBind()
|
|
for (status, ignore, site) in win32security.DsListSites(h):
|
|
for (status, ignore, server) in win32security.DsListServersInSite(h, site):
|
|
info = win32security.DsListInfoForServer(h, server)
|
|
for (status, ignore, domain) in win32security.DsListDomainsInSite(h, site):
|
|
pass
|
|
|
|
def testDsCrackNames(self):
|
|
h = win32security.DsBind()
|
|
fmt_offered = ntsecuritycon.DS_FQDN_1779_NAME
|
|
name = win32api.GetUserNameEx(fmt_offered)
|
|
result = win32security.DsCrackNames(h, 0, fmt_offered, fmt_offered, (name,))
|
|
self.failUnlessEqual(name, result[0][2])
|
|
|
|
def testDsCrackNamesSyntax(self):
|
|
# Do a syntax check only - that allows us to avoid binding.
|
|
# But must use DS_CANONICAL_NAME (or _EX)
|
|
expected = win32api.GetUserNameEx(win32api.NameCanonical)
|
|
fmt_offered = ntsecuritycon.DS_FQDN_1779_NAME
|
|
name = win32api.GetUserNameEx(fmt_offered)
|
|
result = win32security.DsCrackNames(None, ntsecuritycon.DS_NAME_FLAG_SYNTACTICAL_ONLY,
|
|
fmt_offered, ntsecuritycon.DS_CANONICAL_NAME,
|
|
(name,))
|
|
self.failUnlessEqual(expected, result[0][2])
|
|
|
|
class TestTranslate(DomainTests):
|
|
def _testTranslate(self, fmt_from, fmt_to):
|
|
name = win32api.GetUserNameEx(fmt_from)
|
|
expected = win32api.GetUserNameEx(fmt_to)
|
|
got = win32security.TranslateName(name, fmt_from, fmt_to)
|
|
self.failUnlessEqual(got, expected)
|
|
|
|
def testTranslate1(self):
|
|
self._testTranslate(win32api.NameFullyQualifiedDN, win32api.NameSamCompatible)
|
|
|
|
def testTranslate2(self):
|
|
self._testTranslate(win32api.NameSamCompatible, win32api.NameFullyQualifiedDN)
|
|
|
|
def testTranslate3(self):
|
|
self._testTranslate(win32api.NameFullyQualifiedDN, win32api.NameUniqueId)
|
|
|
|
def testTranslate4(self):
|
|
self._testTranslate(win32api.NameUniqueId, win32api.NameFullyQualifiedDN)
|
|
|
|
if __name__=='__main__':
|
|
testmain()
|