Tôi muốn xác định theo chương trình nếu người dùng hiện tại (hoặc quy trình) có quyền truy cập để tạo liên kết tượng trưng. Trong Windows (Vista và lớn hơn), người ta không thể tạo ra một liên kết tượng trưng mà không có SeCreateSymbolicLinkPrivilege và theo mặc định, điều này chỉ được gán cho các quản trị viên. Nếu một trong những cố gắng để tạo ra một liên kết tượng trưng mà không có đặc quyền này, một lỗi Windows 1314 (Một đặc quyền cần thiết không được tổ chức bởi khách hàng) xảy ra.Xác định xem quy trình Windows có đặc quyền để tạo liên kết tượng trưng
Để chứng minh hạn chế này, tôi đã tạo cài đặt Windows sạch, đăng nhập bằng tài khoản Quản trị viên ban đầu (bị giới hạn thông qua UAC) và không thể tạo liên kết tượng trưng trong thư mục chính.
Sau khi chạy Command Prompt as Administrator hoặc vô hiệu hóa UAC, lệnh đó thực hiện mà không có lỗi.
Theo this article, "mọi quá trình được thực hiện thay mặt cho người dùng đều có bản sao mã thông báo [truy cập]".
Vì vậy, tôi đã tạo a Python script to query for the permissions. Để thuận tiện và áp phích, tôi bao gồm một đoạn trích dưới đây.
Ý tưởng đằng sau tập lệnh là liệt kê tất cả các đặc quyền và xác định xem quy trình có đặc quyền bắt buộc hay không. Thật không may, tôi thấy rằng quá trình hiện tại không thực sự có đặc quyền mong muốn, ngay cả khi nó có thể tạo các liên kết tượng trưng.
Tôi nghi ngờ vấn đề là mặc dù các đặc quyền của người dùng hiện tại không bao gồm rõ ràng đặc quyền, tư cách thành viên nhóm của anh ta đủ khả năng đặc quyền đó.
Tóm lại, làm thế nào tôi có thể xác định xem một quy trình cụ thể có đặc quyền tạo liên kết tượng trưng (không cố gắng tạo liên kết) không? Một ví dụ trong C hoặc C++ hoặc Python được ưa thích, mặc dù bất cứ điều gì sử dụng Windows API sẽ phù hợp.
def get_process_token():
token = wintypes.HANDLE()
TOKEN_ALL_ACCESS = 0xf01ff
res = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, token)
if not res > 0: raise RuntimeError("Couldn't get process token")
return token
def get_privilege_information():
# first call with zero length to determine what size buffer we need
return_length = wintypes.DWORD()
params = [
get_process_token(),
TOKEN_INFORMATION_CLASS.TokenPrivileges,
None,
0,
return_length,
]
res = GetTokenInformation(*params)
# assume we now have the necessary length in return_length
buffer = ctypes.create_string_buffer(return_length.value)
params[2] = buffer
params[3] = return_length.value
res = GetTokenInformation(*params)
assert res > 0, "Error in second GetTokenInformation (%d)" % res
privileges = ctypes.cast(buffer, ctypes.POINTER(TOKEN_PRIVILEGES)).contents
return privileges
privileges = get_privilege_information()
print("found {0} privileges".format(privileges.count))
map(print, privileges)
Windows có liên kết tượng trưng? –
Bạn đang cố gắng tạo loại liên kết tượng trưng nào? Có rất nhiều thứ khác nhau có thể được coi là liên kết tượng trưng trong Windows - các điểm kết nối hệ thống tập tin, liên kết cứng hệ thống tập tin, liên kết tượng trưng quản lý đối tượng, v.v .. Tôi tin rằng bạn chỉ cần đặc quyền SeCreateSymbolicLink để tạo các liên kết tượng trưng cho người quản lý đối tượng. –
Tôi đang cố gắng tạo liên kết tượng trưng dựa trên điểm nối hệ thống tệp, chẳng hạn như liên kết được tạo bởi CreateSymbolicLink. –