current user without writing code

本文介绍如何在InfoPath中不编写任何代码即可获取当前用户的详细信息。通过设置数据连接到Web服务,利用GetUserProfileByName方法,可以自动填充表单中的用户属性。

InfoPath - Get the current user without writing code

Posted Thursday, April 05, 2007 12:56 PM by Itay Shakury

I've just read IP team blog post about getting the current user's details using Web Services.
Actually the exact same result can be achieved without writing any code. It's a very common thing to do and I couldn't find any guide for that, so here it is:
* If you are already familiar with this, this post might still be useful. I have included the complete set of default properties get returned and their proper naming syntax at the bottom.
* This works at InfoPath as well as InfoPath Forms Services.
*Clayton Cobb has a great follow up post if you to take the this a step further.

  1. With InfoPath opened go to Tools > Data Connections, and click 'add...' to add a new data connection to the form. This opens up the Data Connection Wizard.
  2. We want to receive data from the WS about the current user, so choose receive data' and click next.
  3. Our data source is a WS so choose 'Web Service' and next.
  4. Now you will have to point the wizard to the WS. Type an address similar to this: http://ServerName/_vti_bin/UserProfileService.asmx  and click next.
  5. Here you get a list of all methods for that WS, choose GetUserProfileByName and click next.
  6. In this screen you can specify what parameters are sent to the method, we are relying on the method's ability to return the current user name if no value is passed to it, so we will leave this as is (no value is passed to the method) and click next.
  7. Click next and make sure 'Automatically retrieve data when form is opened' is checked.
  8. Finish the wizard.

The GetProfileByName method returns a PropertyData array. You can think of it as a repeating table of name and value pairs.
So Now that you have a data connection that can get the current users, you can use it values. In this example I will show the user's first name in a textbox.

  1. Add a textbox to the form.
  2. Go to the first textbox's properties (double click it).
  3. In the 'Default Value' part, click the 'fx' button next to the 'Value' field. this opens up the formula builder dialog.

    vc
  4. Click 'Insert field or group'.

  5. In the data sources drop down, choose the GetUserProfileByName data source.
  6. Expand all groups under the 'dataFields' group, and choose the 'value' field. Don't click OK yet!

  7. With data 'value' field selected, click the 'Filter Data...' button and 'Add...'.
  8. In the first drop down (value) select 'Select a field or group...' and choose the 'Name' field under the 'PropertyData' group.



  9. Leave the middle drop down as is ('is equal to') and in the last drop down choose 'type a text...'.

  10. This is the part where you specify which property to put in the textbox. As we said the method returns multiple properties about the user. For this textbox we want to put the user's first name in, so type 'FirstName' (this is case sensitive!). I have included the property list you can use here (just below), so if you want some other property, just type its name instead.
  11. That's it, all we have to do is to confirm everything so Click 'OK' for every open dialog box until you are back in the design mode.
  12. click 'Preview' and see the wonder!
  13. If you want more details repeat steps 1-11 and enter different property names in step 10.

Finally, as I Promised, here is the complete list of default profile properties get returned by the userprofileservice. I think they are pretty self explained:

UserProfile_GUID
AccountName
FirstName
LastName
PreferredName
WorkPhone
Office
Department
Title
Manager
AboutMe
PersonalSpace
PictureURL
UserName
QuickLinks
WebSite
PublicSiteRedirect
SPS-Dotted-line
SPS-Peers
SPS-Responsibility
SPS-Skills
SPS-PastProjects
SPS-Interests
SPS-School
SPS-SipAddress
SPS-Birthday
SPS-MySiteUpgrade
SPS-DontSuggestList
SPS-ProxyAddresses
SPS-HireDate
SPS-LastColleagueAdded
SPS-OWAUrl
SPS-ResourceAccountName
SPS-MasterAccountName
Assistant
WorkEmail
CellPhone
Fax
HomePhone

Mon Aug 11, 2025 14:04:15: IAR Embedded Workbench 3.10.1 (D:\weibin\b\stm8\bin\stm8proc.dll) Mon Aug 11, 2025 14:04:15: C-SPY Processor Descriptor V3.10.1.201 for STM8 Mon Aug 11, 2025 14:04:15: C-SPY Debugger Driver, ST-LINK V3.10.1.201 for STM8 Mon Aug 11, 2025 14:04:16: Connected to STM8 SWIM Debugging system, STM8-SWIM 1.6.12, GDI Version 1.2.6 Mon Aug 11, 2025 14:04:16: Flash verified. Mon Aug 11, 2025 14:04:16: Loaded debugee: D:\weibin\work\练习\stm8\PJ\USER\Debug\Exe\STM8S_DEMOV1.0.out Mon Aug 11, 2025 14:04:16: Target reset Mon Aug 11, 2025 14:04:30: Breakpoint hit: Code @ main.c:108.3 Mon Aug 11, 2025 14:04:47: Failed to clear breakpoint: Target busy. Mon Aug 11, 2025 14:04:48: Failed to clear breakpoint: Target busy. Mon Aug 11, 2025 14:04:54: Failed to stop target: gdi-error [40412]: Abort command is not possible in current CPU state (HALT, WFI or Protected code execution) Mon Aug 11, 2025 14:04:54: Reading memory at 0x505F did not return without remarks: gdi-error [40414]: Core state (HALT, WFI, Protected code execution) forbids access Mon Aug 11, 2025 14:04:54: Writing memory at 0x90E9 did not return without remarks: gdi-error [40414]: Core state (HALT, WFI, Protected code execution) forbids access Mon Aug 11, 2025 14:04:54: Reading memory at 0x505F did not return without remarks: gdi-error [40414]: Core state (HALT, WFI, Protected code execution) forbids access Mon Aug 11, 2025 14:04:54: Writing memory at 0x8B4B did not return without remarks: gdi-error [40414]: Core state (HALT, WFI, Protected code execution) forbids access Mon Aug 11, 2025 14:04:54: Reading memory at 0x505F did not return without remarks: gdi-error [40414]: Core state (HALT, WFI, Protected code execution) forbids access Mon Aug 11, 2025 14:04:54: Writing memory at 0x8BA5 did not return without remarks: gdi-error [40414]: Core state (HALT, WFI, Protected code execution) forbids access Mon Aug 11, 2025 14:04:54: IAR Embedded Workbench 3.10.1 (D:\weibin\b\stm8\bin\stm8proc.dll)
08-12
# # Copyright 2025 The InfiniFlow Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # from flask import request from flask_login import current_user, login_required from api import settings from api.constants import DATASET_NAME_LIMIT from api.db import StatusEnum from api.db.db_models import DB from api.db.services import duplicate_name from api.db.services.search_service import SearchService from api.db.services.user_service import TenantService, UserTenantService from api.utils import get_uuid from api.utils.api_utils import get_data_error_result, get_json_result, not_allowed_parameters, server_error_response, validate_request @manager.route("/create", methods=["post"]) # noqa: F821 @login_required @validate_request("name") def create(): req = request.get_json() search_name = req["name"] description = req.get("description", "") if not isinstance(search_name, str): return get_data_error_result(message="Search name must be string.") if search_name.strip() == "": return get_data_error_result(message="Search name can't be empty.") if len(search_name.encode("utf-8")) > 255: return get_data_error_result(message=f"Search name length is {len(search_name)} which is large than 255.") e, _ = TenantService.get_by_id(current_user.id) if not e: return get_data_error_result(message="Authorized identity.") search_name = search_name.strip() search_name = duplicate_name(SearchService.query, name=search_name, tenant_id=current_user.id, status=StatusEnum.VALID.value) req["id"] = get_uuid() req["name"] = search_name req["description"] = description req["tenant_id"] = current_user.id req["created_by"] = current_user.id with DB.atomic(): try: if not SearchService.save(**req): return get_data_error_result() return get_json_result(data={"search_id": req["id"]}) except Exception as e: return server_error_response(e) @manager.route("/update", methods=["post"]) # noqa: F821 @login_required @validate_request("search_id", "name", "search_config", "tenant_id") @not_allowed_parameters("id", "created_by", "create_time", "update_time", "create_date", "update_date", "created_by") def update(): req = request.get_json() if not isinstance(req["name"], str): return get_data_error_result(message="Search name must be string.") if req["name"].strip() == "": return get_data_error_result(message="Search name can't be empty.") if len(req["name"].encode("utf-8")) > DATASET_NAME_LIMIT: return get_data_error_result(message=f"Search name length is {len(req['name'])} which is large than {DATASET_NAME_LIMIT}") req["name"] = req["name"].strip() tenant_id = req["tenant_id"] e, _ = TenantService.get_by_id(tenant_id) if not e: return get_data_error_result(message="Authorized identity.") search_id = req["search_id"] if not SearchService.accessible4deletion(search_id, current_user.id): return get_json_result(data=False, message="No authorization.", code=settings.RetCode.AUTHENTICATION_ERROR) try: search_app = SearchService.query(tenant_id=tenant_id, id=search_id)[0] if not search_app: return get_json_result(data=False, message=f"Cannot find search {search_id}", code=settings.RetCode.DATA_ERROR) if req["name"].lower() != search_app.name.lower() and len(SearchService.query(name=req["name"], tenant_id=tenant_id, status=StatusEnum.VALID.value)) >= 1: return get_data_error_result(message="Duplicated search name.") if "search_config" in req: current_config = search_app.search_config or {} new_config = req["search_config"] if not isinstance(new_config, dict): return get_data_error_result(message="search_config must be a JSON object") updated_config = {**current_config, **new_config} req["search_config"] = updated_config req.pop("search_id", None) req.pop("tenant_id", None) updated = SearchService.update_by_id(search_id, req) if not updated: return get_data_error_result(message="Failed to update search") e, updated_search = SearchService.get_by_id(search_id) if not e: return get_data_error_result(message="Failed to fetch updated search") return get_json_result(data=updated_search.to_dict()) except Exception as e: return server_error_response(e) @manager.route("/detail", methods=["GET"]) # noqa: F821 @login_required def detail(): search_id = request.args["search_id"] try: tenants = UserTenantService.query(user_id=current_user.id) for tenant in tenants: if SearchService.query(tenant_id=tenant.tenant_id, id=search_id): break else: return get_json_result(data=False, message="Has no permission for this operation.", code=settings.RetCode.OPERATING_ERROR) search = SearchService.get_detail(search_id) if not search: return get_data_error_result(message="Can't find this Search App!") return get_json_result(data=search) except Exception as e: return server_error_response(e) @manager.route("/list", methods=["POST"]) # noqa: F821 @login_required def list_search_app(): keywords = request.args.get("keywords", "") page_number = int(request.args.get("page", 0)) items_per_page = int(request.args.get("page_size", 0)) orderby = request.args.get("orderby", "create_time") if request.args.get("desc", "true").lower() == "false": desc = False else: desc = True req = request.get_json() owner_ids = req.get("owner_ids", []) try: if not owner_ids: # tenants = TenantService.get_joined_tenants_by_user_id(current_user.id) # tenants = [m["tenant_id"] for m in tenants] tenants = [] search_apps, total = SearchService.get_by_tenant_ids(tenants, current_user.id, page_number, items_per_page, orderby, desc, keywords) else: tenants = owner_ids search_apps, total = SearchService.get_by_tenant_ids(tenants, current_user.id, 0, 0, orderby, desc, keywords) search_apps = [search_app for search_app in search_apps if search_app["tenant_id"] in tenants] total = len(search_apps) if page_number and items_per_page: search_apps = search_apps[(page_number - 1) * items_per_page : page_number * items_per_page] return get_json_result(data={"search_apps": search_apps, "total": total}) except Exception as e: return server_error_response(e) @manager.route("/rm", methods=["post"]) # noqa: F821 @login_required @validate_request("search_id") def rm(): req = request.get_json() search_id = req["search_id"] if not SearchService.accessible4deletion(search_id, current_user.id): return get_json_result(data=False, message="No authorization.", code=settings.RetCode.AUTHENTICATION_ERROR) try: if not SearchService.delete_by_id(search_id): return get_data_error_result(message=f"Failed to delete search App {search_id}") return get_json_result(data=True) except Exception as e: return server_error_response(e) 请把上面的代码每行的功能都做详细的解释
10-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值